diff options
author | Max Kellermann <max@duempel.org> | 2011-09-01 07:13:21 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2011-09-01 07:13:21 +0200 |
commit | 8b0b4ff0860ea93850c2f44e72e8a8a5de05e13b (patch) | |
tree | da2adaaa75382333d934869b530ae416a922baf1 /src/output_all.c | |
parent | 60f7ff3de594ef6b54a61b6ad630819ce026c760 (diff) | |
download | mpd-8b0b4ff0860ea93850c2f44e72e8a8a5de05e13b.tar.gz mpd-8b0b4ff0860ea93850c2f44e72e8a8a5de05e13b.tar.xz mpd-8b0b4ff0860ea93850c2f44e72e8a8a5de05e13b.zip |
output_thread: reimplement CANCEL synchronization
The output thread could hang indefinitely after finishing CANCEL,
because it could have missed the signal while the output was not
unlocked in ao_command_finished().
This patch removes the wait() call after CANCEL, and adds the flag
"allow_play" instead. While this flag is set, playback is skipped.
With this flag, there will not be any excess wait() call after the
pipe has been cleared.
This patch fixes a bug that causes mpd to discontinue playback after
seeking, due to the race condition described above.
Diffstat (limited to '')
-rw-r--r-- | src/output_all.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/output_all.c b/src/output_all.c index 19c0f0166..551736a41 100644 --- a/src/output_all.c +++ b/src/output_all.c @@ -206,15 +206,18 @@ static void audio_output_wait_all(void) } /** - * Signals the audio output if it is open. This function locks the - * mutex. + * Signal the audio output if it is open, and set the "allow_play" + * flag. This function locks the mutex. */ static void audio_output_lock_signal(struct audio_output *ao) { g_mutex_lock(ao->mutex); + + ao->allow_play = true; if (audio_output_is_open(ao)) g_cond_signal(ao->cond); + g_mutex_unlock(ao->mutex); } |