diff options
author | wm4 <wm4@nowhere> | 2013-11-10 23:24:21 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2013-11-12 23:27:51 +0100 |
commit | 380fc765e4ad4e3ff828c9b0bd4a565ea2ba79ed (patch) | |
tree | 6cc32f550b219c903a932692f477c8b8b4f8cfc2 /audio/out/ao_alsa.c | |
parent | d115fb3b0eed9145817a20bc0070590f7428bddd (diff) | |
download | mpv-380fc765e4ad4e3ff828c9b0bd4a565ea2ba79ed.tar.bz2 mpv-380fc765e4ad4e3ff828c9b0bd4a565ea2ba79ed.tar.xz |
audio/out: prepare for non-interleaved audio
This comes with two internal AO API changes:
1. ao_driver.play now can take non-interleaved audio. For this purpose,
the data pointer is changed to void **data, where data[0] corresponds to
the pointer in the old API. Also, the len argument as well as the return
value are now in samples, not bytes. "Sample" in this context means the
unit of the smallest possible audio frame, i.e. sample_size * channels.
2. ao_driver.get_space now returns samples instead of bytes. (Similar to
the play function.)
Change all AOs to use the new API.
The AO API as exposed to the rest of the player still uses the old API.
It's emulated in ao.c. This is purely to split the commits changing all
AOs and the commits adding actual support for outputting N-I audio.
Diffstat (limited to 'audio/out/ao_alsa.c')
-rw-r--r-- | audio/out/ao_alsa.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/audio/out/ao_alsa.c b/audio/out/ao_alsa.c index 0d1c589e34..97c8b5acfd 100644 --- a/audio/out/ao_alsa.c +++ b/audio/out/ao_alsa.c @@ -636,18 +636,12 @@ static void reset(struct ao *ao) alsa_error: ; } -/* - plays 'len' bytes of 'data' - returns: number of bytes played - modified last at 29.06.02 by jp - thanxs for marius <marius@rospot.com> for giving us the light ;) - */ - -static int play(struct ao *ao, void *data, int len, int flags) +static int play(struct ao *ao, void **data, int samples, int flags) { struct priv *p = ao->priv; int num_frames; snd_pcm_sframes_t res = 0; + int len = samples * p->bytes_per_sample; if (!(flags & AOPLAY_FINAL_CHUNK)) len = len / p->outburst * p->outburst; num_frames = len / p->bytes_per_sample; @@ -661,7 +655,7 @@ static int play(struct ao *ao, void *data, int len, int flags) return 0; do { - res = snd_pcm_writei(p->alsa, data, num_frames); + res = snd_pcm_writei(p->alsa, data[0], num_frames); if (res == -EINTR) { /* nothing to do */ @@ -680,7 +674,7 @@ static int play(struct ao *ao, void *data, int len, int flags) } } while (res == 0); - return res < 0 ? -1 : res * p->bytes_per_sample; + return res < 0 ? -1 : res; alsa_error: return -1; @@ -701,7 +695,7 @@ static int get_space(struct ao *ao) unsigned space = snd_pcm_status_get_avail(status) * p->bytes_per_sample; if (space > p->buffersize) // Buffer underrun? space = p->buffersize; - return space; + return space / p->bytes_per_sample; alsa_error: return 0; |