diff --git a/src/player/Control.hxx b/src/player/Control.hxx index 798aeacce..0db6698dd 100644 --- a/src/player/Control.hxx +++ b/src/player/Control.hxx @@ -369,6 +369,22 @@ public: */ void SetError(PlayerError type, std::exception_ptr &&_error); + /** + * Set the error and set state to PlayerState::PAUSE. + */ + void SetOutputError(std::exception_ptr &&_error) { + SetError(PlayerError::OUTPUT, std::move(_error)); + + /* pause: the user may resume playback as soon as an + audio output becomes available */ + state = PlayerState::PAUSE; + } + + void LockSetOutputError(std::exception_ptr &&_error) { + const ScopeLock lock(mutex); + SetOutputError(std::move(_error)); + } + /** * Checks whether an error has occurred, and if so, rethrows * it. diff --git a/src/player/Thread.cxx b/src/player/Thread.cxx index 320f12859..e1144a55c 100644 --- a/src/player/Thread.cxx +++ b/src/player/Thread.cxx @@ -461,10 +461,7 @@ Player::OpenOutput() audio output becomes available */ paused = true; - pc.Lock(); - pc.SetError(PlayerError::OUTPUT, std::current_exception()); - pc.state = PlayerState::PAUSE; - pc.Unlock(); + pc.LockSetOutputError(std::current_exception()); idle_add(IDLE_PLAYER); @@ -911,16 +908,11 @@ Player::PlayNextChunk() buffer.Return(chunk); - pc.Lock(); - - pc.SetError(PlayerError::OUTPUT, std::current_exception()); - /* pause: the user may resume playback as soon as an audio output becomes available */ - pc.state = PlayerState::PAUSE; paused = true; - pc.Unlock(); + pc.LockSetOutputError(std::current_exception()); idle_add(IDLE_PLAYER);