std::shared_ptr
[dcpomatic.git] / src / lib / audio_merger.h
index 121b21095a6c6b43ad4e24fc8591bea00bcc6be4..adaf72f8189acd7cd22a228e8a0d8cb99f2878e5 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2017 Carl Hetherington <cth@carlh.net>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 
 */
 
-#include "util.h"
+/** @file  src/audio_merger.h
+ *  @brief AudioMerger class.
+ */
 
-class AudioBuffers;
+#include "audio_buffers.h"
+#include "dcpomatic_time.h"
+#include "util.h"
 
+/** @class AudioMerger.
+ *  @brief A class that can merge audio data from many sources.
+ */
 class AudioMerger
 {
 public:
-       AudioMerger (int channels, int frame_rate);
-
-       /** Pull audio up to a given time; after this call, no more data can be pushed
-        *  before the specified time.
-        */
-       TimedAudioBuffers<DCPTime> pull (DCPTime time);
-       void push (boost::shared_ptr<const AudioBuffers> audio, DCPTime time);
-       TimedAudioBuffers<DCPTime> flush ();
-       void clear (DCPTime t);
-       
+       explicit AudioMerger (int frame_rate);
+
+       std::list<std::pair<std::shared_ptr<AudioBuffers>, dcpomatic::DCPTime> > pull (dcpomatic::DCPTime time);
+       void push (std::shared_ptr<const AudioBuffers> audio, dcpomatic::DCPTime time);
+       void clear ();
+
 private:
-       boost::shared_ptr<AudioBuffers> _buffers;
+       Frame frames (dcpomatic::DCPTime t) const;
+
+       class Buffer
+       {
+       public:
+               /** @param c Channels
+                *  @param f Frames
+                *  @param t Time
+                *  @param r Frame rate.
+                */
+               Buffer (int c, int32_t f, dcpomatic::DCPTime t, int r)
+                       : audio (new AudioBuffers (c, f))
+                       , time (t)
+                       , frame_rate (r)
+               {}
+
+               Buffer (std::shared_ptr<AudioBuffers> a, dcpomatic::DCPTime t, int r)
+                       : audio (a)
+                       , time (t)
+                       , frame_rate (r)
+               {}
+
+               std::shared_ptr<AudioBuffers> audio;
+               dcpomatic::DCPTime time;
+               int frame_rate;
+
+               dcpomatic::DCPTimePeriod period () const {
+                       return dcpomatic::DCPTimePeriod (time, time + dcpomatic::DCPTime::from_frames (audio->frames(), frame_rate));
+               }
+       };
+
+       class BufferComparator
+       {
+       public:
+               bool operator() (AudioMerger::Buffer const & a, AudioMerger::Buffer const & b)
+               {
+                       return a.time < b.time;
+               }
+       };
+
+       std::list<Buffer> _buffers;
        int _frame_rate;
-       DCPTime _last_pull;
 };