aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/audio.c6
-rw-r--r--src/output_control.c6
-rw-r--r--src/output_control.h9
3 files changed, 19 insertions, 2 deletions
diff --git a/src/audio.c b/src/audio.c
index 443f5d82d..d3e3ac908 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -281,7 +281,7 @@ static int flushAudioBuffer(void)
int finished = 1;
for (i = 0; i < audioOutputArraySize; ++i) {
- const struct audio_output *ao = &audioOutputArray[i];
+ struct audio_output *ao = &audioOutputArray[i];
if (!audio_output_is_open(ao))
continue;
@@ -295,8 +295,10 @@ static int flushAudioBuffer(void)
closed if the play func
returned an error */
audioDeviceStates[i] = DEVICE_ENABLE;
- } else
+ } else {
finished = 0;
+ audio_output_signal(ao);
+ }
}
if (finished)
diff --git a/src/output_control.c b/src/output_control.c
index 3be1f6cd6..ac9394bd7 100644
--- a/src/output_control.c
+++ b/src/output_control.c
@@ -86,6 +86,12 @@ int audio_output_open(struct audio_output *audioOutput,
return ret;
}
+void
+audio_output_signal(struct audio_output *ao)
+{
+ notify_signal(&ao->notify);
+}
+
void audio_output_play(struct audio_output *audioOutput,
const char *playChunk, size_t size)
{
diff --git a/src/output_control.h b/src/output_control.h
index 92973f6c1..b83a67b2f 100644
--- a/src/output_control.h
+++ b/src/output_control.h
@@ -30,6 +30,15 @@ struct tag;
int audio_output_init(struct audio_output *, ConfigParam * param);
int audio_output_open(struct audio_output *audioOutput,
const struct audio_format *audioFormat);
+
+/**
+ * Wakes up the audio output thread. This is part of a workaround for
+ * a deadlock bug, and should be removed as soon as the real cause is
+ * fixed. XXX
+ */
+void
+audio_output_signal(struct audio_output *ao);
+
void audio_output_play(struct audio_output *audioOutput,
const char *playChunk, size_t size);
void audio_output_cancel(struct audio_output *audioOutput);