aboutsummaryrefslogtreecommitdiff
path: root/src/output_internal.h
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_internal.h
parent60f7ff3de594ef6b54a61b6ad630819ce026c760 (diff)
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 'src/output_internal.h')
-rw-r--r--src/output_internal.h9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/output_internal.h b/src/output_internal.h
index 18d43135..7102ea5c 100644
--- a/src/output_internal.h
+++ b/src/output_internal.h
@@ -110,6 +110,15 @@ struct audio_output {
bool pause;
/**
+ * When this flag is set, the output thread will not do any
+ * playback. It will wait until the flag is cleared.
+ *
+ * This is used to synchronize the "clear" operation on the
+ * shared music pipe during the CANCEL command.
+ */
+ bool allow_play;
+
+ /**
* If not NULL, the device has failed, and this timer is used
* to estimate how long it should stay disabled (unless
* explicitly reopened with "play").