aboutsummaryrefslogtreecommitdiffstats
path: root/src/output_thread.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2011-09-01 07:13:21 +0200
committerMax Kellermann <max@duempel.org>2011-09-01 07:13:21 +0200
commit8b0b4ff0860ea93850c2f44e72e8a8a5de05e13b (patch)
treeda2adaaa75382333d934869b530ae416a922baf1 /src/output_thread.c
parent60f7ff3de594ef6b54a61b6ad630819ce026c760 (diff)
downloadmpd-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_thread.c8
1 files changed, 1 insertions, 7 deletions
diff --git a/src/output_thread.c b/src/output_thread.c
index 2c2b8d116..bf56ca971 100644
--- a/src/output_thread.c
+++ b/src/output_thread.c
@@ -648,12 +648,6 @@ static gpointer audio_output_task(gpointer arg)
}
ao_command_finished(ao);
-
- /* the player thread will now clear our music
- pipe - wait for a notify, to give it some
- time */
- if (ao->command == AO_COMMAND_NONE)
- g_cond_wait(ao->cond, ao->mutex);
continue;
case AO_COMMAND_KILL:
@@ -663,7 +657,7 @@ static gpointer audio_output_task(gpointer arg)
return NULL;
}
- if (ao->open && ao_play(ao))
+ if (ao->open && ao->allow_play && ao_play(ao))
/* don't wait for an event if there are more
chunks in the pipe */
continue;