X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fbutler.cc;h=6789d74a5b925858caa234600fd734dfd7e1100b;hb=b733ff51f0212d02dbf33ccb62e67f07941f5ace;hp=138ee0fbdeb4630e91adf8717077e2532d177b3e;hpb=3009a585f5222a83213c786e3c564c740f450d18;p=dcpomatic.git diff --git a/src/lib/butler.cc b/src/lib/butler.cc index 138ee0fbd..6789d74a5 100644 --- a/src/lib/butler.cc +++ b/src/lib/butler.cc @@ -62,7 +62,9 @@ Butler::Butler (shared_ptr player, shared_ptr log, AudioMapping aud , _disable_audio (false) { _player_video_connection = _player->Video.connect (bind (&Butler::video, this, _1, _2)); - _player_audio_connection = _player->Audio.connect (bind (&Butler::audio, this, _1)); + _player_audio_connection = _player->Audio.connect (bind (&Butler::audio, this, _1, _2)); + _player_text_connection = _player->Text.connect (bind (&Butler::text, this, _1, _2, _3)); + _player_changed_connection = _player->Changed.connect (bind (&Butler::player_changed, this, _2)); _thread = new boost::thread (bind (&Butler::thread, this)); #ifdef DCPOMATIC_LINUX pthread_setname_np (_thread->native_handle(), "butler"); @@ -198,24 +200,42 @@ Butler::get_video () } pair, DCPTime> const r = _video.get (); - cout << "BGV " << to_string(r.second) << " " << _video.size() << "\n"; _summon.notify_all (); return r; } +optional > +Butler::get_closed_caption () +{ + boost::mutex::scoped_lock lm (_mutex); + return _closed_caption.get (); +} + void Butler::seek (DCPTime position, bool accurate) { boost::mutex::scoped_lock lm (_mutex); + seek_unlocked (position, accurate); +} + +void +Butler::seek_unlocked (DCPTime position, bool accurate) +{ if (_died) { return; } - _video.clear (); - _audio.clear (); _finished = false; _pending_seek_position = position; _pending_seek_accurate = accurate; + + { + boost::mutex::scoped_lock lm (_buffers_mutex); + _video.clear (); + _audio.clear (); + _closed_caption.clear (); + } + _summon.notify_all (); } @@ -234,21 +254,22 @@ Butler::prepare (weak_ptr weak_video) const void Butler::video (shared_ptr video, DCPTime time) { - cout << "BV: " << to_string(time) << " " << _video.size() << " " << (float(_video.size()) / 24) << "\n"; boost::mutex::scoped_lock lm (_mutex); + if (_pending_seek_position) { /* Don't store any video while a seek is pending */ return; } _prepare_service.post (bind (&Butler::prepare, this, weak_ptr(video))); + + boost::mutex::scoped_lock lm2 (_buffers_mutex); _video.put (video, time); } void -Butler::audio (shared_ptr audio) +Butler::audio (shared_ptr audio, DCPTime time) { - cout << "BA: " << audio->frames() << " " << _audio.size() << " " << (float(_audio.size()) / 48000) << "\n"; { boost::mutex::scoped_lock lm (_mutex); if (_pending_seek_position || _disable_audio) { @@ -257,20 +278,20 @@ Butler::audio (shared_ptr audio) } } - _audio.put (remap (audio, _audio_channels, _audio_mapping)); + boost::mutex::scoped_lock lm2 (_buffers_mutex); + _audio.put (remap (audio, _audio_channels, _audio_mapping), time); } /** Try to get `frames' frames of audio and copy it into `out'. Silence * will be filled if no audio is available. - * @return true if there was a buffer underrun, otherwise false. + * @return time of this audio, or unset if there was a buffer underrun. */ -bool +optional Butler::get_audio (float* out, Frame frames) { - bool const underrun = _audio.get (out, _audio_channels, frames); - cout << "BGA: " << frames << " " << _audio.size() << " " << (float(_audio.size()) / 48000) << "\n"; + optional t = _audio.get (out, _audio_channels, frames); _summon.notify_all (); - return underrun; + return t; } void @@ -286,3 +307,37 @@ Butler::memory_used () const /* XXX: should also look at _audio.memory_used() */ return _video.memory_used(); } + +void +Butler::player_changed (bool frequent) +{ + boost::mutex::scoped_lock lm (_mutex); + if (_died || _pending_seek_position || frequent) { + return; + } + + DCPTime seek_to; + DCPTime next = _video.get().second; + if (_awaiting && _awaiting > next) { + /* We have recently done a player_changed seek and our buffers haven't been refilled yet, + so assume that we're seeking to the same place as last time. + */ + seek_to = *_awaiting; + } else { + seek_to = next; + } + + seek_unlocked (seek_to, true); + _awaiting = seek_to; +} + +void +Butler::text (PlayerText pt, TextType type, DCPTimePeriod period) +{ + if (type != TEXT_CLOSED_CAPTION) { + return; + } + + boost::mutex::scoped_lock lm2 (_buffers_mutex); + _closed_caption.put (make_pair(pt, period)); +}