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
This commit is contained in:
Max Kellermann 2019-05-20 15:22:34 +02:00
parent ff3e2c0514
commit 923e66738c
2 changed files with 11 additions and 0 deletions

1
NEWS
View File

@ -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

View File

@ -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 */