Fix the build for older macOS.
[dcpomatic.git] / src / lib / butler.cc
index 6f7349b5f07bd2b7511f8eaf0aecda9e21a40e28..686fa9f7272849c70f035ef836f17be50096e91c 100644 (file)
@@ -238,12 +238,12 @@ try
 }
 
 
-/** @param blocking true if we should block until video is available.  If blocking is false
+/** @param behaviour BLOCKING if we should block until video is available.  If behaviour is NON_BLOCKING
  *  and no video is immediately available the method will return a 0 PlayerVideo and the error AGAIN.
  *  @param e if non-0 this is filled with an error code (if an error occurs) or is untouched if no error occurs.
  */
 pair<shared_ptr<PlayerVideo>, DCPTime>
-Butler::get_video (bool blocking, Error* e)
+Butler::get_video (Behaviour behaviour, Error* e)
 {
        boost::mutex::scoped_lock lm (_mutex);
 
@@ -260,7 +260,7 @@ Butler::get_video (bool blocking, Error* e)
                }
        };
 
-       if (_video.empty() && (_finished || _died || (_suspended && !blocking))) {
+       if (_video.empty() && (_finished || _died || (_suspended && behaviour == Behaviour::NON_BLOCKING))) {
                setup_error (e, Error::Code::AGAIN);
                return make_pair(shared_ptr<PlayerVideo>(), DCPTime());
        }
@@ -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;