diff options
Diffstat (limited to 'audio/out/ao.c')
-rw-r--r-- | audio/out/ao.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/audio/out/ao.c b/audio/out/ao.c index 55db34becb..fd20270160 100644 --- a/audio/out/ao.c +++ b/audio/out/ao.c @@ -159,7 +159,10 @@ static struct ao *ao_create(bool probing, struct mpv_global *global, talloc_free(chmap); if (ao->driver->init(ao) < 0) goto error; - ao->bps = ao->channels.num * ao->samplerate * af_fmt2bits(ao->format) / 8; + ao->sstride = af_fmt2bits(ao->format) / 8; + if (!af_fmt_is_planar(ao->format)) + ao->sstride *= ao->channels.num; + ao->bps = ao->samplerate * ao->sstride; return ao; error: talloc_free(ao); @@ -208,7 +211,8 @@ void ao_uninit(struct ao *ao, bool cut_audio) int ao_play(struct ao *ao, void *data, int len, int flags) { - return ao->driver->play(ao, data, len, flags); + int r = ao->driver->play(ao, &data, len / ao->sstride, flags); + return r < 0 ? r : r * ao->sstride; } int ao_control(struct ao *ao, enum aocontrol cmd, void *arg) @@ -229,7 +233,7 @@ double ao_get_delay(struct ao *ao) int ao_get_space(struct ao *ao) { - return ao->driver->get_space(ao); + return ao->driver->get_space(ao) * ao->sstride; } void ao_reset(struct ao *ao) @@ -254,10 +258,9 @@ int ao_play_silence(struct ao *ao, int samples) { if (samples <= 0 || AF_FORMAT_IS_SPECIAL(ao->format)) return 0; - int s = ao->channels.num * (af_fmt2bits(ao->format) / 8); - char *p = talloc_size(NULL, samples * s); - af_fill_silence(p, samples * s, ao->format); - int r = ao_play(ao, p, samples * s, 0); + char *p = talloc_size(NULL, samples * ao->sstride); + af_fill_silence(p, samples * ao->sstride, ao->format); + int r = ao_play(ao, p, samples * ao->sstride, 0); talloc_free(p); return r; } |