diff options
| author | Carl Hetherington <cth@carlh.net> | 2021-10-15 22:33:46 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2021-10-16 10:13:26 +0200 |
| commit | c8fa584045ad65283a85015f18ee8789ddf881d1 (patch) | |
| tree | 9887fe131c628a27555afcf705c565ba91ad9c16 /src/lib | |
| parent | 0e896f9f37db001f34c876ed5fc50e874f96ae09 (diff) | |
Always block waiting for audio when exporting.v2.15.169
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.cc | 16 | ||||
| -rw-r--r-- | src/lib/butler.h | 2 | ||||
| -rw-r--r-- | src/lib/ffmpeg_encoder.cc | 2 |
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) { |
