From a5b8d7917f66a11c45ccc587342f39195dc5dbfb Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 14 Dec 2016 20:23:23 +0100 Subject: [PATCH] player/Thread: mutex must be locked inside OpenOutput() --- src/player/Thread.cxx | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/player/Thread.cxx b/src/player/Thread.cxx index b13ae08a6..c563c3799 100644 --- a/src/player/Thread.cxx +++ b/src/player/Thread.cxx @@ -297,6 +297,8 @@ private: * Wrapper for MultipleOutputs::Open(). Upon failure, it * pauses the player. * + * Caller must lock the mutex. + * * @return true on success */ bool OpenOutput(); @@ -457,6 +459,7 @@ Player::OpenOutput() pc.state == PlayerState::PAUSE); try { + const ScopeUnlock unlock(pc.mutex); pc.outputs.Open(play_audio_format, buffer); } catch (const std::runtime_error &e) { LogError(e); @@ -467,7 +470,7 @@ Player::OpenOutput() audio output becomes available */ paused = true; - pc.LockSetOutputError(std::current_exception()); + pc.SetOutputError(std::current_exception()); idle_add(IDLE_PLAYER); @@ -477,10 +480,7 @@ Player::OpenOutput() output_open = true; paused = false; - { - const ScopeLock lock(pc.mutex); - pc.state = PlayerState::PLAY; - } + pc.state = PlayerState::PLAY; idle_add(IDLE_PLAYER); @@ -510,8 +510,6 @@ Player::CheckDecoderStartup() play_audio_format = dc.out_audio_format; decoder_starting = false; - const ScopeUnlock unlock(pc.mutex); - idle_add(IDLE_PLAYER); if (!paused && !OpenOutput()) { @@ -698,9 +696,9 @@ Player::ProcessCommand() pc.state = PlayerState::PLAY; } else { - OpenOutput(); - pc.Lock(); + + OpenOutput(); } pc.CommandFinished();