From 1403172ef397c3dfc58a64c999a362cca977241b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 29 Oct 2009 15:59:40 +0100 Subject: output_plugin: added method "drain" drain() is the opposite of cancel(): it waits until all data in the buffer has finished playing. Instead of implicitly draining in the close() method like the ALSA plugin has been doing it forever, let the output thread decide whether to drain or to cancel. --- src/output/alsa_plugin.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/output') diff --git a/src/output/alsa_plugin.c b/src/output/alsa_plugin.c index 89ed6058e..870115998 100644 --- a/src/output/alsa_plugin.c +++ b/src/output/alsa_plugin.c @@ -495,6 +495,14 @@ alsa_recover(struct alsa_data *ad, int err) return err; } +static void +alsa_drain(void *data) +{ + struct alsa_data *ad = data; + + snd_pcm_drain(ad->pcm); +} + static void alsa_cancel(void *data) { @@ -508,9 +516,6 @@ alsa_close(void *data) { struct alsa_data *ad = data; - if (snd_pcm_state(ad->pcm) == SND_PCM_STATE_RUNNING) - snd_pcm_drain(ad->pcm); - snd_pcm_close(ad->pcm); } @@ -542,6 +547,7 @@ const struct audio_output_plugin alsaPlugin = { .finish = alsa_finish, .open = alsa_open, .play = alsa_play, + .drain = alsa_drain, .cancel = alsa_cancel, .close = alsa_close, -- cgit v1.2.3