summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/butler.cc16
-rw-r--r--src/lib/butler.h2
-rw-r--r--src/lib/ffmpeg_encoder.cc2
3 files changed, 14 insertions, 6 deletions
diff --git a/src/lib/butler.cc b/src/lib/butler.cc
index f19e1e080..686fa9f72 100644
--- a/src/lib/butler.cc
+++ b/src/lib/butler.cc
@@ -373,13 +373,21 @@ Butler::audio (shared_ptr<AudioBuffers> audio, DCPTime time, int frame_rate)
}
-/** Try to get `frames' frames of audio and copy it into `out'. Silence
- * will be filled if no audio is available.
- * @return time of this audio, or unset if there was a buffer underrun.
+/** Try to get `frames' frames of audio and copy it into `out'.
+ * @param behaviour BLOCKING if we should block until audio is available. If behaviour is NON_BLOCKING
+ * and no audio is immediately available the buffer will be filled with silence and boost::none
+ * will be returned.
+ * @return time of this audio, or unset if blocking was false and no data was available.
*/
optional<DCPTime>
-Butler::get_audio (float* out, Frame frames)
+Butler::get_audio (Behaviour behaviour, float* out, Frame frames)
{
+ boost::mutex::scoped_lock lm (_mutex);
+
+ while (behaviour == Behaviour::BLOCKING && !_finished && !_died && _audio.size() < frames) {
+ _arrived.wait (lm);
+ }
+
auto t = _audio.get (out, _audio_channels, frames);
_summon.notify_all ();
return t;
diff --git a/src/lib/butler.h b/src/lib/butler.h
index 529b7383d..c7e71658d 100644
--- a/src/lib/butler.h
+++ b/src/lib/butler.h
@@ -78,7 +78,7 @@ public:
};
std::pair<std::shared_ptr<PlayerVideo>, dcpomatic::DCPTime> get_video (Behaviour behaviour, Error* e = nullptr);
- boost::optional<dcpomatic::DCPTime> get_audio (float* out, Frame frames);
+ boost::optional<dcpomatic::DCPTime> get_audio (Behaviour behaviour, float* out, Frame frames);
boost::optional<TextRingBuffers::Data> get_closed_caption ();
void disable_audio ();
diff --git a/src/lib/ffmpeg_encoder.cc b/src/lib/ffmpeg_encoder.cc
index e1081f518..81ea3a9dd 100644
--- a/src/lib/ffmpeg_encoder.cc
+++ b/src/lib/ffmpeg_encoder.cc
@@ -204,7 +204,7 @@ FFmpegEncoder::go ()
waker.nudge ();
- _butler->get_audio (interleaved, audio_frames);
+ _butler->get_audio (Butler::Behaviour::BLOCKING, interleaved, audio_frames);
/* XXX: inefficient; butler interleaves and we deinterleave again */
float* p = interleaved;
for (int j = 0; j < audio_frames; ++j) {