diff options
-rw-r--r-- | src/player/Thread.cxx | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/src/player/Thread.cxx b/src/player/Thread.cxx index 3c315ebcf..7a9715f1b 100644 --- a/src/player/Thread.cxx +++ b/src/player/Thread.cxx @@ -203,6 +203,25 @@ private: bool CheckDecoderStartup(); /** + * Call CheckDecoderStartup() repeatedly until the decoder has + * finished startup. Returns false on decoder error (and + * finishes the #PlayerCommand). + * + * This method does not check for commands. It is only + * allowed to be used while a command is being handled. + */ + bool WaitDecoderStartup() { + while (decoder_starting) { + if (!CheckDecoderStartup()) { + pc.LockCommandFinished(); + return false; + } + } + + return true; + } + + /** * Stop the decoder and clears (and frees) its music pipe. * * Player lock is not held. @@ -570,13 +589,8 @@ Player::SeekDecoder() /* wait for the decoder to complete initialization */ - while (decoder_starting) { - if (!CheckDecoderStartup()) { - /* decoder failure */ - pc.LockCommandFinished(); - return false; - } - } + if (!WaitDecoderStartup()) + return false; /* send the SEEK command */ |