X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fbutler.cc;h=fde8e459b5372777cccc72f3330f155d11cddc55;hb=3c86d70cf46ca11212ae2e2f4d711db0f478c2f5;hp=b84dbc024d65d68592373aef2137b8a5bdf08964;hpb=671ca74d521e101f83f45a0b1492602e607b6ad3;p=dcpomatic.git diff --git a/src/lib/butler.cc b/src/lib/butler.cc index b84dbc024..fde8e459b 100644 --- a/src/lib/butler.cc +++ b/src/lib/butler.cc @@ -20,6 +20,7 @@ #include "butler.h" #include "player.h" +#include "util.h" #include #include @@ -41,20 +42,25 @@ Butler::Butler (weak_ptr film, shared_ptr player, AudioMappi , _player (player) , _pending_seek_accurate (false) , _finished (false) + , _died (false) + , _stop_thread (false) , _audio_mapping (audio_mapping) , _audio_channels (audio_channels) - , _stop_thread (false) , _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, _2)); + _player_audio_connection = _player->Audio.connect (bind (&Butler::audio, this, _1)); _player_changed_connection = _player->Changed.connect (bind (&Butler::player_changed, this)); _thread = new boost::thread (bind (&Butler::thread, this)); } Butler::~Butler () { - _stop_thread = true; + { + boost::mutex::scoped_lock lm (_mutex); + _stop_thread = true; + } + _thread->interrupt (); try { _thread->join (); @@ -64,10 +70,11 @@ Butler::~Butler () delete _thread; } +/** Caller must hold a lock on _mutex */ bool Butler::should_run () const { - return (_video.size() < VIDEO_READAHEAD || _audio.size() < AUDIO_READAHEAD) && !_stop_thread && !_finished; + return (_video.size() < VIDEO_READAHEAD || (!_disable_audio && _audio.size() < AUDIO_READAHEAD)) && !_stop_thread && !_finished && !_died; } void @@ -84,6 +91,7 @@ try /* Do any seek that has been requested */ if (_pending_seek_position) { + _finished = false; _player->seek (*_pending_seek_position, _pending_seek_accurate); _pending_seek_position = optional (); } @@ -94,20 +102,25 @@ try */ while (should_run() && !_pending_seek_position) { lm.unlock (); - if (_player->pass ()) { + bool const r = _player->pass (); + lm.lock (); + if (r) { _finished = true; _arrived.notify_all (); break; } - lm.lock (); _arrived.notify_all (); } } } catch (boost::thread_interrupted) { /* The butler thread is being terminated */ + boost::mutex::scoped_lock lm (_mutex); + _finished = true; + _arrived.notify_all (); } catch (...) { store_current (); - _finished = true; + boost::mutex::scoped_lock lm (_mutex); + _died = true; _arrived.notify_all (); } @@ -117,11 +130,11 @@ Butler::get_video () boost::mutex::scoped_lock lm (_mutex); /* Wait for data if we have none */ - while (_video.empty() && !_finished) { + while (_video.empty() && !_finished && !_died) { _arrived.wait (lm); } - if (_video.empty() && _finished) { + if (_video.empty()) { return make_pair (shared_ptr(), DCPTime()); } @@ -134,6 +147,10 @@ void Butler::seek (DCPTime position, bool accurate) { boost::mutex::scoped_lock lm (_mutex); + if (_died) { + return; + } + _video.clear (); _audio.clear (); _finished = false; @@ -157,7 +174,7 @@ Butler::video (shared_ptr video, DCPTime time) } void -Butler::audio (shared_ptr audio, DCPTime time) +Butler::audio (shared_ptr audio) { { boost::mutex::scoped_lock lm (_mutex); @@ -167,7 +184,7 @@ Butler::audio (shared_ptr audio, DCPTime time) } } - _audio.put (audio, time); + _audio.put (remap (audio, _audio_channels, _audio_mapping)); } void