/*
- 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);
+ AudioMerger (int frame_rate);
- /** Pull audio up to a given time; after this call, no more data can be pushed
- * before the specified time.
- */
- TimedAudioBuffers pull (DCPTime time);
+ std::list<std::pair<boost::shared_ptr<AudioBuffers>, DCPTime> > pull (DCPTime time);
void push (boost::shared_ptr<const AudioBuffers> audio, DCPTime time);
- TimedAudioBuffers flush ();
- void clear (DCPTime t);
-
+ void clear ();
+
private:
- boost::shared_ptr<AudioBuffers> _buffers;
+ Frame frames (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, DCPTime t, int r)
+ : audio (new AudioBuffers (c, f))
+ , time (t)
+ , frame_rate (r)
+ {}
+
+ Buffer (boost::shared_ptr<AudioBuffers> a, DCPTime t, int r)
+ : audio (a)
+ , time (t)
+ , frame_rate (r)
+ {}
+
+ boost::shared_ptr<AudioBuffers> audio;
+ DCPTime time;
+ int frame_rate;
+
+ DCPTimePeriod period () const {
+ return DCPTimePeriod (time, time + 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;
};