Commit b9013944 authored by Max Kellermann's avatar Max Kellermann

output: signal the output thread when CANCEL is finished

After CANCEL, the output thread waits for another signal before it continues playback, to synchronize with the caller. There were some situations where this signal wasn't sent properly. This patch adds an explicit g_cond_signal() at two code positions.
parent e814f8d5
......@@ -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;
}
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment