diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/output_all.c | 30 | ||||
-rw-r--r-- | src/output_control.c | 4 |
2 files changed, 34 insertions, 0 deletions
diff --git a/src/output_all.c b/src/output_all.c index bdf0385bb..7c411f14f 100644 --- a/src/output_all.c +++ b/src/output_all.c @@ -202,6 +202,29 @@ static void audio_output_wait_all(void) notify_wait(&audio_output_client_notify); } +/** + * Signals the audio output if it is open. This function locks the + * mutex. + */ +static void +audio_output_lock_signal(struct audio_output *ao) +{ + g_mutex_lock(ao->mutex); + if (audio_output_is_open(ao)) + g_cond_signal(ao->cond); + g_mutex_unlock(ao->mutex); +} + +/** + * Signals all audio outputs which are open. + */ +static void +audio_output_signal_all(void) +{ + for (unsigned i = 0; i < num_audio_outputs; ++i) + audio_output_lock_signal(&audio_outputs[i]); +} + static void audio_output_reset_reopen(struct audio_output *ao) { @@ -488,6 +511,13 @@ audio_output_all_cancel(void) if (g_mp != NULL) music_pipe_clear(g_mp, g_music_buffer); + /* the audio outputs are now waiting for a signal, to + synchronize the cleared music pipe */ + + audio_output_signal_all(); + + /* invalidate elapsed_time */ + audio_output_all_elapsed_time = -1.0; } diff --git a/src/output_control.c b/src/output_control.c index c54ce4f92..842b89030 100644 --- a/src/output_control.c +++ b/src/output_control.c @@ -128,6 +128,10 @@ audio_output_open(struct audio_output *ao, /* we're not using audio_output_cancel() here, because that function is asynchronous */ ao_command(ao, AO_COMMAND_CANCEL); + + /* the audio output is now waiting for a + signal; wake it up immediately */ + g_cond_signal(ao->cond); } return true; |