summaryrefslogtreecommitdiffstats
path: root/audio/out/ao_oss.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-03-09 00:49:39 +0100
committerwm4 <wm4@nowhere>2014-03-09 01:27:41 +0100
commite16c91d07ab2acfb83fdeaa6dcfcd25c97666504 (patch)
tree5e5e33af457c4d573a32e15aec95205f4987f9bb /audio/out/ao_oss.c
parent2f03dc259960c9cb282e8f371d9f68266afea49c (diff)
downloadmpv-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_oss.c')
-rw-r--r--audio/out/ao_oss.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/audio/out/ao_oss.c b/audio/out/ao_oss.c
index a1bf0feefc..ca7539b590 100644
--- a/audio/out/ao_oss.c
+++ b/audio/out/ao_oss.c
@@ -427,24 +427,28 @@ ac3_retry:
}
// close audio device
-static void uninit(struct ao *ao, bool immed)
+static void uninit(struct ao *ao)
{
struct priv *p = ao->priv;
if (p->audio_fd == -1)
return;
-#ifdef SNDCTL_DSP_SYNC
- // to get the buffer played
- if (!immed)
- ioctl(p->audio_fd, SNDCTL_DSP_SYNC, NULL);
-#endif
#ifdef SNDCTL_DSP_RESET
- if (immed)
- ioctl(p->audio_fd, SNDCTL_DSP_RESET, NULL);
+ ioctl(p->audio_fd, SNDCTL_DSP_RESET, NULL);
#endif
close(p->audio_fd);
p->audio_fd = -1;
}
+static void drain(struct ao *ao)
+{
+#ifdef SNDCTL_DSP_SYNC
+ struct priv *p = ao->priv;
+ // to get the buffer played
+ if (p->audio_fd != -1)
+ ioctl(p->audio_fd, SNDCTL_DSP_SYNC, NULL);
+#endif
+}
+
#ifndef SNDCTL_DSP_RESET
static void close_device(struct ao *ao)
{
@@ -601,6 +605,7 @@ const struct ao_driver audio_out_oss = {
.pause = audio_pause,
.resume = audio_resume,
.reset = reset,
+ .drain = drain,
.priv_size = sizeof(struct priv),
.priv_defaults = &(const struct priv) {
.audio_fd = -1,