Untested audio delay.
authorCarl Hetherington <cth@carlh.net>
Thu, 11 Jul 2013 12:12:43 +0000 (13:12 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 11 Jul 2013 12:12:43 +0000 (13:12 +0100)
src/lib/audio_decoder.cc
src/lib/audio_decoder.h
src/lib/ffmpeg_decoder.cc
src/lib/sndfile_decoder.cc

index ade11cc3290ab0dcbb3d50628cad8689fe1aa034..2fe347cf2a50af794fbd261ad9587d31ed35b574 100644 (file)
@@ -31,15 +31,21 @@ using std::cout;
 using boost::optional;
 using boost::shared_ptr;
 
-AudioDecoder::AudioDecoder (shared_ptr<const Film> f)
+AudioDecoder::AudioDecoder (shared_ptr<const Film> f, shared_ptr<const AudioContent> c)
        : Decoder (f)
        , _audio_position (0)
 {
+       _delay_frames = c->audio_delay() * c->content_audio_frame_rate() * f->dcp_audio_frame_rate() / (c->output_audio_frame_rate() * 1000);
 }
 
 void
 AudioDecoder::audio (shared_ptr<const AudioBuffers> data, AudioContent::Frame frame)
 {
+       frame += _delay_frames;
+       
        Audio (data, frame);
        _audio_position = frame + data->frames ();
+       if (_audio_position < 0) {
+               _audio_position = 0;
+       }
 }
index ddfb296c9a9b4fffbf8e2b94928594907566fb68..a7849b9cc93a180110a4b7e902ecb08572369d2f 100644 (file)
@@ -35,7 +35,7 @@ class AudioBuffers;
 class AudioDecoder : public virtual Decoder
 {
 public:
-       AudioDecoder (boost::shared_ptr<const Film>);
+       AudioDecoder (boost::shared_ptr<const Film>, boost::shared_ptr<const AudioContent>);
 
        /** Emitted when some audio data is ready */
        boost::signals2::signal<void (boost::shared_ptr<const AudioBuffers>, AudioContent::Frame)> Audio;
@@ -44,6 +44,9 @@ protected:
 
        void audio (boost::shared_ptr<const AudioBuffers>, AudioContent::Frame);
        AudioContent::Frame _audio_position;
+
+private:
+       AudioContent::Frame _delay_frames;
 };
 
 #endif
index fddb7029484c23695b6be457c5843d0813754fd1..b2eb1dbdeaca6bdc26d54a075d712c9f817dac7f 100644 (file)
@@ -59,7 +59,7 @@ using libdcp::Size;
 FFmpegDecoder::FFmpegDecoder (shared_ptr<const Film> f, shared_ptr<const FFmpegContent> c, bool video, bool audio)
        : Decoder (f)
        , VideoDecoder (f)
-       , AudioDecoder (f)
+       , AudioDecoder (f, c)
        , SubtitleDecoder (f)
        , FFmpeg (c)
        , _subtitle_codec_context (0)
index 80a6afd2baf79eae384164a310119a127e21c5bf..b2ad451259672a12c4906be42c4e5fdc431260fa 100644 (file)
@@ -35,7 +35,7 @@ using boost::shared_ptr;
 
 SndfileDecoder::SndfileDecoder (shared_ptr<const Film> f, shared_ptr<const SndfileContent> c)
        : Decoder (f)
-       , AudioDecoder (f)
+       , AudioDecoder (f, c)
        , _sndfile_content (c)
        , _deinterleave_buffer (0)
 {