Merge master.
[dcpomatic.git] / src / lib / audio_decoder.cc
index e4f98c678ad3a150987431f7f587428a07603b10..f425cf2808cfbf70d53f3ff2bf097a24ab0ba035 100644 (file)
 
 #include "audio_decoder.h"
 #include "audio_buffers.h"
-#include "exceptions.h"
-#include "log.h"
+#include "audio_processor.h"
 #include "resampler.h"
 #include "util.h"
-#include "film.h"
-#include "audio_processor.h"
 
 #include "i18n.h"
 
-using std::stringstream;
 using std::list;
 using std::pair;
 using std::cout;
@@ -171,6 +167,12 @@ AudioDecoder::audio (shared_ptr<const AudioBuffers> data, ContentTime time)
 
        assert (_audio_position.get() >= (_decoded_audio.frame + _decoded_audio.audio->frames()));
 
+       add (data);
+}
+
+void
+AudioDecoder::add (shared_ptr<const AudioBuffers> data)
+{
        /* Resize _decoded_audio to fit the new data */
        int new_size = 0;
        if (_decoded_audio.audio->frames() == 0) {
@@ -188,9 +190,17 @@ AudioDecoder::audio (shared_ptr<const AudioBuffers> data, ContentTime time)
        /* Copy new data in */
        _decoded_audio.audio->copy_from (data.get(), data->frames(), 0, _audio_position.get() - _decoded_audio.frame);
        _audio_position = _audio_position.get() + data->frames ();
+
+       /* Limit the amount of data we keep in case nobody is asking for it */
+       int const max_frames = _audio_content->resampled_audio_frame_rate () * 10;
+       if (_decoded_audio.audio->frames() > max_frames) {
+               int const to_remove = _decoded_audio.audio->frames() - max_frames;
+               _decoded_audio.frame += to_remove;
+               _decoded_audio.audio->move (to_remove, 0, max_frames);
+               _decoded_audio.audio->set_frames (max_frames);
+       }
 }
 
-/* XXX: called? */
 void
 AudioDecoder::flush ()
 {
@@ -198,13 +208,10 @@ AudioDecoder::flush ()
                return;
        }
 
-       /*
        shared_ptr<const AudioBuffers> b = _resampler->flush ();
        if (b) {
-               _pending.push_back (shared_ptr<DecodedAudio> (new DecodedAudio (b, _audio_position.get ())));
-               _audio_position = _audio_position.get() + b->frames ();
+               add (b);
        }
-       */
 }
 
 void