summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2021-10-15 22:33:46 +0200
committerCarl Hetherington <cth@carlh.net>2021-10-15 22:42:48 +0200
commit4d0356840c2f400b0376230a3d07f57897275f99 (patch)
treebb8468a24a2d13383085224c9d383b7664bb4db8 /src/lib
parenta3c663012ae1134bef0c36304d71ab319114cfcb (diff)
Always block waiting for audio when exporting.
Otherwise if there is non available we'll insert silence and potentially push the audio out of sync (late). May help with #2098.
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 d29e191ed..6dc3a83d4 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.data(), audio_frames);
+ _butler->get_audio (Butler::Behaviour::BLOCKING, interleaved.data(), audio_frames);
/* XXX: inefficient; butler interleaves and we deinterleave again */
float* p = interleaved.data();
for (int j = 0; j < audio_frames; ++j) {