History

ao_coreaudio: set kAudioOutputUnitProperty_ChannelMap

This fixes #15584

Misaki Kasumi committed 1 year ago

Commit 06fe6651 parent c9a99db4 files · +42 −19Browse files

Unified · Split

4 files
  1. audio/out/ao_avfoundation.m +2 −16
  2. audio/out/ao_coreaudio.c +15 −3
  3. audio/out/ao_coreaudio_chmap.c +24 −0
  4. audio/out/ao_coreaudio_chmap.h +1 −0
audio/out/ao_avfoundation.m+2−16
@@ -277,22 +277,8 @@ static int init(struct ao *ao) · 276 unmodified lines
277277
278278 AudioStreamBasicDescription asbd;
279279 ca_fill_asbd(ao, &asbd);
280− size_t layout_size = sizeof(AudioChannelLayout)
281− + (ao->channels.num - 1) * sizeof(AudioChannelDescription);
282− layout = talloc_size(ao, layout_size);
283− layout->mChannelLayoutTag = kAudioChannelLayoutTag_UseChannelDescriptions;
284− layout->mNumberChannelDescriptions = ao->channels.num;
285− for (int i = 0; i < ao->channels.num; ++i) {
286− AudioChannelDescription *desc = layout->mChannelDescriptions + i;
287− desc->mChannelFlags = kAudioChannelFlags_AllOff;
288− desc->mChannelLabel = mp_speaker_id_to_ca_label(ao->channels.speaker[i]);
289− }
290−
291− void *talloc_ctx = talloc_new(NULL);
292− AudioChannelLayout *std_layout = ca_find_standard_layout(talloc_ctx, layout);
293− memmove(layout, std_layout, sizeof(AudioChannelLayout));
294− talloc_free(talloc_ctx);
295− ca_log_layout(ao, MSGL_V, layout);
280+ size_t layout_size;
281+ layout = ca_get_acl(ao, &layout_size);
296282
297283 OSStatus err;
298284 if ((err = CMAudioFormatDescriptionCreate(
audio/out/ao_coreaudio.c+15−3
@@ -136,7 +136,7 @@ static int control(struct ao *ao, enum aocontrol cmd, void *arg) · 135 unmodified lines
136136 return CONTROL_UNKNOWN;
137137 }
138138
139−static bool init_audiounit(struct ao *ao, AudioStreamBasicDescription asbd);
139+static bool init_audiounit(struct ao *ao, AudioStreamBasicDescription asbd, AudioChannelLayout *layout, size_t layout_size);
140140 static void init_physical_format(struct ao *ao);
141141 static void reinit_latency(struct ao *ao);
142142 static bool register_hotplug_cb(struct ao *ao);
@@ -178,8 +178,13 @@ static int init(struct ao *ao) · 35 unmodified lines
178178
179179 AudioStreamBasicDescription asbd;
180180 ca_fill_asbd(ao, &asbd);
181+ size_t layout_size;
182+ AudioChannelLayout *layout = ca_get_acl(ao, &layout_size);
181183
182− if (!init_audiounit(ao, asbd))
184+ bool r = init_audiounit(ao, asbd, layout, layout_size);
185+ talloc_free(layout);
186+
187+ if (!r)
183188 goto coreaudio_error;
184189
185190 reinit_latency(ao);
@@ -273,7 +278,7 @@ coreaudio_error: · 87 unmodified lines
273278 return;
274279 }
275280
276−static bool init_audiounit(struct ao *ao, AudioStreamBasicDescription asbd)
281+static bool init_audiounit(struct ao *ao, AudioStreamBasicDescription asbd, AudioChannelLayout *layout, size_t layout_size)
277282 {
278283 OSStatus err;
279284 uint32_t size;
@@ -317,6 +322,13 @@ static bool init_audiounit(struct ao *ao, AudioStreamBasicDescription asbd) · 37 unmodified lines
317322 CHECK_CA_ERROR_L(coreaudio_error_audiounit,
318323 "can't link audio unit to selected device");
319324
325+ err = AudioUnitSetProperty(p->audio_unit,
326+ kAudioOutputUnitProperty_ChannelMap,
327+ kAudioUnitScope_Global, 0, layout, layout_size);
328+
329+ CHECK_CA_ERROR_L(coreaudio_error_audiounit,
330+ "unable to set the input channel layout on the audio unit");
331+
320332 AURenderCallbackStruct render_cb = (AURenderCallbackStruct) {
321333 .inputProc = render_cb_lpcm,
322334 .inputProcRefCon = ao,
audio/out/ao_coreaudio_chmap.c+24−0
@@ -314,6 +314,30 @@ mismatch:; · 313 unmodified lines
314314 return s ? s : l;
315315 }
316316
317+AudioChannelLayout *ca_get_acl(struct ao *ao, size_t *out_layout_size)
318+{
319+ size_t layout_size = sizeof(AudioChannelLayout)
320+ + (ao->channels.num - 1) * sizeof(AudioChannelDescription);
321+ AudioChannelLayout *layout = talloc_size(ao, layout_size);
322+ layout->mChannelLayoutTag = kAudioChannelLayoutTag_UseChannelDescriptions;
323+ layout->mNumberChannelDescriptions = ao->channels.num;
324+ for (int i = 0; i < ao->channels.num; ++i) {
325+ AudioChannelDescription *desc = layout->mChannelDescriptions + i;
326+ desc->mChannelFlags = kAudioChannelFlags_AllOff;
327+ desc->mChannelLabel = mp_speaker_id_to_ca_label(ao->channels.speaker[i]);
328+ }
329+
330+ void *talloc_ctx = talloc_new(NULL);
331+ AudioChannelLayout *std_layout = ca_find_standard_layout(talloc_ctx, layout);
332+ memmove(layout, std_layout, sizeof(AudioChannelLayout));
333+ talloc_free(talloc_ctx);
334+ ca_log_layout(ao, MSGL_V, layout);
335+
336+ if (out_layout_size)
337+ *out_layout_size = layout_size;
338+ return layout;
339+}
340+
317341
318342 #define CHMAP(n, ...) &(struct mp_chmap) MP_CONCAT(MP_CHMAP, n) (__VA_ARGS__)
319343
audio/out/ao_coreaudio_chmap.h+1−0
@@ -28,6 +28,7 @@ AudioChannelLabel mp_speaker_id_to_ca_label(int speaker_id); · 27 unmodified lines
2828
2929 #if HAVE_COREAUDIO || HAVE_AVFOUNDATION
3030 AudioChannelLayout *ca_find_standard_layout(void *talloc_ctx, AudioChannelLayout *l);
31+AudioChannelLayout *ca_get_acl(struct ao *ao, size_t *out_layout_size);
3132 void ca_log_layout(struct ao *ao, int l, AudioChannelLayout *layout);
3233 bool ca_init_chmap(struct ao *ao, AudioDeviceID device);
3334 void ca_get_active_chmap(struct ao *ao, AudioDeviceID device, int channel_count,

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t