From cd6d846b70afc366a6d353571f3b730f7698106a Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 26 Jun 2015 15:49:52 +0200 Subject: ao_coreaudio: support non-interleaved output This saves us the trouble of interleaving the audio data for no reason. --- audio/out/ao_coreaudio.c | 9 +++++---- audio/out/ao_coreaudio_utils.c | 8 +++++++- 2 files changed, 12 insertions(+), 5 deletions(-) (limited to 'audio') diff --git a/audio/out/ao_coreaudio.c b/audio/out/ao_coreaudio.c index d3d2bf046e..b424e66661 100644 --- a/audio/out/ao_coreaudio.c +++ b/audio/out/ao_coreaudio.c @@ -77,11 +77,14 @@ static OSStatus render_cb_lpcm(void *ctx, AudioUnitRenderActionFlags *aflags, { struct ao *ao = ctx; struct priv *p = ao->priv; - AudioBuffer buf = buffer_list->mBuffers[0]; + void *planes[MP_NUM_CHANNELS] = {0}; + + for (int n = 0; n < ao->num_planes; n++) + planes[n] = buffer_list->mBuffers[n].mData; int64_t end = mp_time_us(); end += p->hw_latency_us + ca_get_latency(ts) + ca_frames_to_us(ao, frames); - ao_read_data(ao, &buf.mData, frames, end); + ao_read_data(ao, planes, frames, end); return noErr; } @@ -163,8 +166,6 @@ static int init(struct ao *ao) if (!ca_init_chmap(ao, p->device)) goto coreaudio_error; - ao->format = af_fmt_from_planar(ao->format); - AudioStreamBasicDescription asbd; ca_fill_asbd(ao, &asbd); diff --git a/audio/out/ao_coreaudio_utils.c b/audio/out/ao_coreaudio_utils.c index aa1c9934d6..08341a6f7c 100644 --- a/audio/out/ao_coreaudio_utils.c +++ b/audio/out/ao_coreaudio_utils.c @@ -175,6 +175,12 @@ static void ca_fill_asbd_raw(AudioStreamBasicDescription *asbd, int mp_format, asbd->mBitsPerChannel = af_fmt2bits(mp_format); asbd->mFormatFlags = kAudioFormatFlagIsPacked; + int channels_per_buffer = num_channels; + if (AF_FORMAT_IS_PLANAR(mp_format)) { + asbd->mFormatFlags |= kAudioFormatFlagIsNonInterleaved; + channels_per_buffer = 1; + } + if ((mp_format & AF_FORMAT_TYPE_MASK) == AF_FORMAT_F) { asbd->mFormatFlags |= kAudioFormatFlagIsFloat; } else if (!af_fmt_unsigned(mp_format)) { @@ -186,7 +192,7 @@ static void ca_fill_asbd_raw(AudioStreamBasicDescription *asbd, int mp_format, asbd->mFramesPerPacket = 1; asbd->mBytesPerPacket = asbd->mBytesPerFrame = - asbd->mFramesPerPacket * asbd->mChannelsPerFrame * + asbd->mFramesPerPacket * channels_per_buffer * (asbd->mBitsPerChannel / 8); } -- cgit v1.2.3