From 4d8a7e03944155bf07ba9a775cf9554bb1c76f0f Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 4 May 2015 23:59:27 +0200 Subject: ao_coreaudio: support padded channel layouts If for example the audio settings are set to 5.1 output, but the hardware does 8 channels natively (HDMI), the reported channel layout will have 2 dummy channels. To avoid falling back to stereo, we have to write audio in this format to the device. --- audio/out/ao_coreaudio.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/audio/out/ao_coreaudio.c b/audio/out/ao_coreaudio.c index 8716fcc75d..65f7a070fd 100644 --- a/audio/out/ao_coreaudio.c +++ b/audio/out/ao_coreaudio.c @@ -78,7 +78,6 @@ static OSStatus render_cb_lpcm(void *ctx, AudioUnitRenderActionFlags *aflags, 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); return noErr; } @@ -445,7 +444,7 @@ static const int speaker_map[][2] = { { kAudioChannelLabel_HeadphonesLeft, MP_SPEAKER_ID_DL }, { kAudioChannelLabel_HeadphonesRight, MP_SPEAKER_ID_DR }, - { kAudioChannelLabel_Unknown, MP_SPEAKER_ID_UNKNOWN0 }, + { kAudioChannelLabel_Unknown, MP_SPEAKER_ID_NA0 }, { 0, -1 }, }; @@ -543,9 +542,14 @@ bool ca_layout_to_mp_chmap(struct ao *ao, AudioChannelLayout *layout, return false; } + int next_na = MP_SPEAKER_ID_NA0; for (int n = 0; n < l->mNumberChannelDescriptions; n++) { AudioChannelLabel label = l->mChannelDescriptions[n].mChannelLabel; uint8_t speaker = ca_label_to_mp_speaker_id(label); + if (speaker == MP_SPEAKER_ID_NA0 && next_na < MP_SPEAKER_ID_NA_LAST) + { + speaker = next_na++; + } if (speaker < 0) { MP_VERBOSE(ao, "channel label=%u unusable to build channel " "bitmap, skipping layout\n", (unsigned) label); -- cgit v1.2.3