diff options
-rw-r--r-- | src/audio.c | 6 | ||||
-rw-r--r-- | src/output_control.c | 6 | ||||
-rw-r--r-- | src/output_control.h | 9 |
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); |