diff options
author | wm4 <wm4@nowhere> | 2014-03-09 00:49:39 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-03-09 01:27:41 +0100 |
commit | e16c91d07ab2acfb83fdeaa6dcfcd25c97666504 (patch) | |
tree | 5e5e33af457c4d573a32e15aec95205f4987f9bb /audio/out/ao_alsa.c | |
parent | 2f03dc259960c9cb282e8f371d9f68266afea49c (diff) | |
download | mpv-e16c91d07ab2acfb83fdeaa6dcfcd25c97666504.tar.bz2 mpv-e16c91d07ab2acfb83fdeaa6dcfcd25c97666504.tar.xz |
audio/out: make draining a separate operation
Until now, this was always conflated with uninit. This was ugly, and
also many AOs emulated this manually (or just ignored it). Make draining
an explicit operation, so AOs which support it can provide it, and for
all others generic code will emulate it.
For ao_wasapi, we keep it simple and basically disable the internal
draining implementation (maybe it should be restored later).
Tested on Linux only.
Diffstat (limited to 'audio/out/ao_alsa.c')
-rw-r--r-- | audio/out/ao_alsa.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/audio/out/ao_alsa.c b/audio/out/ao_alsa.c index d50757bdfd..291c6d7c1c 100644 --- a/audio/out/ao_alsa.c +++ b/audio/out/ao_alsa.c @@ -79,7 +79,7 @@ struct priv { } while (0) static float get_delay(struct ao *ao); -static void uninit(struct ao *ao, bool immed); +static void uninit(struct ao *ao); /* to set/get/query special features/parameters */ static int control(struct ao *ao, enum aocontrol cmd, void *arg) @@ -530,22 +530,19 @@ static int init(struct ao *ao) return 0; alsa_error: - uninit(ao, true); + uninit(ao); return -1; } // end init /* close audio device */ -static void uninit(struct ao *ao, bool immed) +static void uninit(struct ao *ao) { struct priv *p = ao->priv; if (p->alsa) { int err; - if (!immed) - snd_pcm_drain(p->alsa); - err = snd_pcm_close(p->alsa); CHECK_ALSA_ERROR("pcm close error"); @@ -556,6 +553,12 @@ alsa_error: p->alsa = NULL; } +static void drain(struct ao *ao) +{ + struct priv *p = ao->priv; + snd_pcm_drain(p->alsa); +} + static void audio_pause(struct ao *ao) { struct priv *p = ao->priv; @@ -712,6 +715,7 @@ const struct ao_driver audio_out_alsa = { .pause = audio_pause, .resume = audio_resume, .reset = reset, + .drain = drain, .priv_size = sizeof(struct priv), .priv_defaults = &(const struct priv) { .cfg_block = 1, |