From 923e66738cb89590c3b83a853e3ece9964ffc56b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 20 May 2019 15:22:34 +0200 Subject: [PATCH] player/Thread: fix "single" mode race condition If the decoder finishes decoding the current song between the two IsIdle() checks, MPD stops playback instead of starting the decoder for the next song. This is usually not visible problem, because the main thread restarts it via playlist::ResumePlayback(), but that way it, ignores "single" mode. As a workaround, this commit adds another "queued" check which re-enters the player loop and checks again whether to start the decoder. Closes https://github.com/MusicPlayerDaemon/MPD/issues/556 --- NEWS | 1 + src/player/Thread.cxx | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/NEWS b/NEWS index 73fcfa4e7..6eda2de03 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ ver 0.21.9 (not yet released) * Android - fix crash on ARMv7 - request storage permission on Android 6+ +* fix spurious "single" mode bug ver 0.21.8 (2019/04/23) * input diff --git a/src/player/Thread.cxx b/src/player/Thread.cxx index 81271a142..7d81011f6 100644 --- a/src/player/Thread.cxx +++ b/src/player/Thread.cxx @@ -1058,6 +1058,16 @@ Player::Run() noexcept SongBorder(); } else if (dc.IsIdle()) { + if (queued) + /* the decoder has just stopped, + between the two IsIdle() checks, + probably while UnlockCheckOutputs() + left the mutex unlocked; to restart + the decoder instead of stopping + playback completely, let's re-enter + this loop */ + continue; + /* check the size of the pipe again, because the decoder thread may have added something since we last checked */