1 /*****************************************************************************
2 * coreaudio.h : CoreAudio definitions for vlc
3 *****************************************************************************
4 * Copyright (C) 2014-2018 VideoLabs, VLC authors and VideoLAN
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19 *****************************************************************************/
22 struct CoreAudio_layout_s
24 uint32_t i_channels_layout_tag
;
25 uint32_t i_channels_bitmap
;
26 uint32_t i_channels_description_count
;
29 uint32_t i_channel_label
;
30 uint32_t i_channel_flags
;
31 float f_coordinates
[3];
35 static inline void CoreAudio_Layout_Clean(struct CoreAudio_layout_s
*c
)
37 free( c
->p_descriptions
);
40 /* According to Apple's CoreAudio_Bitmap/CoreAudio_BitmapTypes.h */
43 CoreAudio_Bitmap_LEFT
= (1<<0),
44 CoreAudio_Bitmap_RIGHT
= (1<<1),
45 CoreAudio_Bitmap_CENTER
= (1<<2),
46 CoreAudio_Bitmap_LFESCREEN
= (1<<3),
47 CoreAudio_Bitmap_BACKLEFT
= (1<<4),
48 CoreAudio_Bitmap_BACKRIGHT
= (1<<5),
49 CoreAudio_Bitmap_LEFTCENTER
= (1<<6),
50 CoreAudio_Bitmap_RIGHTCENTER
= (1<<7),
51 CoreAudio_Bitmap_BACKCENTER
= (1<<8),
52 CoreAudio_Bitmap_SIDELEFT
= (1<<9),
53 CoreAudio_Bitmap_SIDERIGHT
= (1<<10),
54 CoreAudio_Bitmap_TOPCENTER
= (1<<11),
55 CoreAudio_Bitmap_TOPFRONTLEFT
= (1<<12),
56 CoreAudio_Bitmap_TOPFRONTENTER
= (1<<13),
57 CoreAudio_Bitmap_TOPFRONTRIGHT
= (1<<14),
58 CoreAudio_Bitmap_TOPBACKLEFT
= (1<<15),
59 CoreAudio_Bitmap_TOPBACKCENTER
= (1<<16),
60 CoreAudio_Bitmap_TOPBACKRIGHT
= (1<<17),
63 static const uint32_t pi_vlc_chan_order_CoreAudio
[] =
65 AOUT_CHAN_LEFT
, AOUT_CHAN_RIGHT
, AOUT_CHAN_CENTER
,
67 AOUT_CHAN_REARLEFT
, AOUT_CHAN_REARRIGHT
,
68 AOUT_CHAN_LEFT
, AOUT_CHAN_RIGHT
, AOUT_CHAN_REARCENTER
,
69 AOUT_CHAN_MIDDLELEFT
, AOUT_CHAN_MIDDLERIGHT
,
76 uint32_t i_vlc_bitmap
;
77 } CoreAudio_Bitmap_mapping
[] = {
78 { CoreAudio_Bitmap_LEFT
, AOUT_CHAN_LEFT
},
79 { CoreAudio_Bitmap_RIGHT
, AOUT_CHAN_RIGHT
},
80 { CoreAudio_Bitmap_CENTER
, AOUT_CHAN_CENTER
},
81 { CoreAudio_Bitmap_LFESCREEN
, AOUT_CHAN_LFE
},
82 { CoreAudio_Bitmap_BACKLEFT
, AOUT_CHAN_REARLEFT
},
83 { CoreAudio_Bitmap_BACKRIGHT
, AOUT_CHAN_REARRIGHT
},
84 { CoreAudio_Bitmap_LEFTCENTER
, AOUT_CHAN_LEFT
},
85 { CoreAudio_Bitmap_RIGHTCENTER
, AOUT_CHAN_RIGHT
},
86 { CoreAudio_Bitmap_BACKCENTER
, AOUT_CHAN_REARCENTER
},
87 { CoreAudio_Bitmap_SIDELEFT
, AOUT_CHAN_MIDDLELEFT
},
88 { CoreAudio_Bitmap_SIDERIGHT
, AOUT_CHAN_MIDDLERIGHT
},
89 { CoreAudio_Bitmap_TOPCENTER
, 0 },
90 { CoreAudio_Bitmap_TOPFRONTLEFT
, 0 },
91 { CoreAudio_Bitmap_TOPFRONTENTER
,0 },
92 { CoreAudio_Bitmap_TOPFRONTRIGHT
,0 },
93 { CoreAudio_Bitmap_TOPBACKLEFT
, 0 },
94 { CoreAudio_Bitmap_TOPBACKCENTER
,0 },
95 { CoreAudio_Bitmap_TOPBACKRIGHT
, 0 },
100 CoreAudio_Layout_DESC
= 0,
101 CoreAudio_Layout_BITMAP
= (1<<16),
103 CoreAudio_Layout_Mono
= (100<<16) | 1,
104 CoreAudio_Layout_Stereo
= (101<<16) | 2,
105 CoreAudio_Layout_StereoHeadphones
= (102<<16) | 2,
106 CoreAudio_Layout_MatrixStereo
= (103<<16) | 2,
107 CoreAudio_Layout_MidSide
= (104<<16) | 2,
108 CoreAudio_Layout_XY
= (105<<16) | 2,
109 CoreAudio_Layout_Binaural
= (106<<16) | 2,
110 CoreAudio_Layout_Ambisonic_B_Format
= (107<<16) | 4,
112 CoreAudio_Layout_Quadraphonic
= (108<<16) | 4,
113 CoreAudio_Layout_Pentagonal
= (109<<16) | 5,
114 CoreAudio_Layout_Hexagonal
= (110<<16) | 6,
115 CoreAudio_Layout_Octagonal
= (111<<16) | 8,
116 CoreAudio_Layout_Cube
= (112<<16) | 8,
118 CoreAudio_Layout_MPEG_1_0
= CoreAudio_Layout_Mono
,// C
119 CoreAudio_Layout_MPEG_2_0
= CoreAudio_Layout_Stereo
, // L R
120 CoreAudio_Layout_MPEG_3_0_A
= (113<<16) | 3, // L R C
121 CoreAudio_Layout_MPEG_3_0_B
= (114<<16) | 3, // C L R
122 CoreAudio_Layout_MPEG_4_0_A
= (115<<16) | 4, // L R C Cs
123 CoreAudio_Layout_MPEG_4_0_B
= (116<<16) | 4, // C L R Cs
124 CoreAudio_Layout_MPEG_5_0_A
= (117<<16) | 5, // L R C Ls Rs
125 CoreAudio_Layout_MPEG_5_0_B
= (118<<16) | 5, // L R Ls Rs C
126 CoreAudio_Layout_MPEG_5_0_C
= (119<<16) | 5, // L C R Ls Rs
127 CoreAudio_Layout_MPEG_5_0_D
= (120<<16) | 5, // C L R Ls Rs
128 CoreAudio_Layout_MPEG_5_1_A
= (121<<16) | 6, // L R C LFE Ls Rs
129 CoreAudio_Layout_MPEG_5_1_B
= (122<<16) | 6, // L R Ls Rs C LFE
130 CoreAudio_Layout_MPEG_5_1_C
= (123<<16) | 6, // L C R Ls Rs LFE
131 CoreAudio_Layout_MPEG_5_1_D
= (124<<16) | 6, // C L R Ls Rs LFE
132 CoreAudio_Layout_MPEG_6_1_A
= (125<<16) | 7, // L R C LFE Ls Rs Cs
133 CoreAudio_Layout_MPEG_7_1_A
= (126<<16) | 8, // L R C LFE Ls Rs Lc Rc
134 CoreAudio_Layout_MPEG_7_1_B
= (127<<16) | 8, // C Lc Rc L R Ls Rs LFE (13818-7 table 42)
135 CoreAudio_Layout_MPEG_7_1_C
= (128<<16) | 8, // L R C LFE Ls Rs Rls Rrs
136 CoreAudio_Layout_Emagic_Default_7_1
= (129<<16) | 8, // L R Ls Rs C LFE Lc Rc
137 CoreAudio_Layout_SMPTE_DTV
= (130<<16) | 8, // L R C LFE Ls Rs Lt Rt
139 CoreAudio_Layout_ITU_1_0
= CoreAudio_Layout_Mono
,// C
140 CoreAudio_Layout_ITU_2_0
= CoreAudio_Layout_Stereo
, // L R
142 CoreAudio_Layout_ITU_2_1
= (131<<16) | 3, // L R Cs
143 CoreAudio_Layout_ITU_2_2
= (132<<16) | 4, // L R Ls Rs
144 CoreAudio_Layout_ITU_3_0
= CoreAudio_Layout_MPEG_3_0_A
,// L R C
145 CoreAudio_Layout_ITU_3_1
= CoreAudio_Layout_MPEG_4_0_A
,// L R C Cs
147 CoreAudio_Layout_ITU_3_2
= CoreAudio_Layout_MPEG_5_0_A
,// L R C Ls Rs
148 CoreAudio_Layout_ITU_3_2_1
= CoreAudio_Layout_MPEG_5_1_A
,// L R C LFE Ls Rs
149 CoreAudio_Layout_ITU_3_4_1
= CoreAudio_Layout_MPEG_7_1_C
,// L R C LFE Ls Rs Rls Rrs
151 CoreAudio_Layout_DVD_0
= CoreAudio_Layout_Mono
,// C (mono)
152 CoreAudio_Layout_DVD_1
= CoreAudio_Layout_Stereo
, // L R
153 CoreAudio_Layout_DVD_2
= CoreAudio_Layout_ITU_2_1
,// L R Cs
154 CoreAudio_Layout_DVD_3
= CoreAudio_Layout_ITU_2_2
,// L R Ls Rs
155 CoreAudio_Layout_DVD_4
= (133<<16) | 3, // L R LFE
156 CoreAudio_Layout_DVD_5
= (134<<16) | 4, // L R LFE Cs
157 CoreAudio_Layout_DVD_6
= (135<<16) | 5, // L R LFE Ls Rs
158 CoreAudio_Layout_DVD_7
= CoreAudio_Layout_MPEG_3_0_A
,// L R C
159 CoreAudio_Layout_DVD_8
= CoreAudio_Layout_MPEG_4_0_A
,// L R C Cs
160 CoreAudio_Layout_DVD_9
= CoreAudio_Layout_MPEG_5_0_A
,// L R C Ls Rs
161 CoreAudio_Layout_DVD_10
= (136<<16) | 4, // L R C LFE
162 CoreAudio_Layout_DVD_11
= (137<<16) | 5, // L R C LFE Cs
163 CoreAudio_Layout_DVD_12
= CoreAudio_Layout_MPEG_5_1_A
,// L R C LFE Ls Rs
164 CoreAudio_Layout_DVD_13
= CoreAudio_Layout_DVD_8
, // L R C Cs
165 CoreAudio_Layout_DVD_14
= CoreAudio_Layout_DVD_9
, // L R C Ls Rs
166 CoreAudio_Layout_DVD_15
= CoreAudio_Layout_DVD_10
, // L R C LFE
167 CoreAudio_Layout_DVD_16
= CoreAudio_Layout_DVD_11
, // L R C LFE Cs
168 CoreAudio_Layout_DVD_17
= CoreAudio_Layout_DVD_12
, // L R C LFE Ls Rs
169 CoreAudio_Layout_DVD_18
= (138<<16) | 5, // L R Ls Rs LFE
170 CoreAudio_Layout_DVD_19
= CoreAudio_Layout_MPEG_5_0_B
,// L R Ls Rs C
171 CoreAudio_Layout_DVD_20
= CoreAudio_Layout_MPEG_5_1_B
,// L R Ls Rs C LFE
173 CoreAudio_Layout_AudioUnit_4
= CoreAudio_Layout_Quadraphonic
,
174 CoreAudio_Layout_AudioUnit_5
= CoreAudio_Layout_Pentagonal
,
175 CoreAudio_Layout_AudioUnit_6
= CoreAudio_Layout_Hexagonal
,
176 CoreAudio_Layout_AudioUnit_8
= CoreAudio_Layout_Octagonal
,
178 CoreAudio_Layout_AudioUnit_5_0
= CoreAudio_Layout_MPEG_5_0_B
,// L R Ls Rs C
179 CoreAudio_Layout_AudioUnit_6_0
= (139<<16) | 6, // L R Ls Rs C Cs
180 CoreAudio_Layout_AudioUnit_7_0
= (140<<16) | 7, // L R Ls Rs C Rls Rrs
181 CoreAudio_Layout_AudioUnit_7_0_Front
= (148<<16) | 7, // L R Ls Rs C Lc Rc
182 CoreAudio_Layout_AudioUnit_5_1
= CoreAudio_Layout_MPEG_5_1_A
,// L R C LFE Ls Rs
183 CoreAudio_Layout_AudioUnit_6_1
= CoreAudio_Layout_MPEG_6_1_A
,// L R C LFE Ls Rs Cs
184 CoreAudio_Layout_AudioUnit_7_1
= CoreAudio_Layout_MPEG_7_1_C
,// L R C LFE Ls Rs Rls Rrs
185 CoreAudio_Layout_AudioUnit_7_1_Front
= CoreAudio_Layout_MPEG_7_1_A
,// L R C LFE Ls Rs Lc Rc
187 CoreAudio_Layout_AAC_3_0
= CoreAudio_Layout_MPEG_3_0_B
,// C L R
188 CoreAudio_Layout_AAC_Quadraphonic
= CoreAudio_Layout_Quadraphonic
, // L R Ls Rs
189 CoreAudio_Layout_AAC_4_0
= CoreAudio_Layout_MPEG_4_0_B
,// C L R Cs
190 CoreAudio_Layout_AAC_5_0
= CoreAudio_Layout_MPEG_5_0_D
,// C L R Ls Rs
191 CoreAudio_Layout_AAC_5_1
= CoreAudio_Layout_MPEG_5_1_D
,// C L R Ls Rs Lfe
192 CoreAudio_Layout_AAC_6_0
= (141<<16) | 6, // C L R Ls Rs Cs
193 CoreAudio_Layout_AAC_6_1
= (142<<16) | 7, // C L R Ls Rs Cs Lfe
194 CoreAudio_Layout_AAC_7_0
= (143<<16) | 7, // C L R Ls Rs Rls Rrs
195 CoreAudio_Layout_AAC_7_1
= CoreAudio_Layout_MPEG_7_1_B
,// C Lc Rc L R Ls Rs Lfe
196 CoreAudio_Layout_AAC_7_1_B
= (183<<16) | 8, // C L R Ls Rs Rls Rrs LFE
197 CoreAudio_Layout_AAC_Octagonal
= (144<<16) | 8, // C L R Ls Rs Rls Rrs Cs
199 CoreAudio_Layout_TMH_10_2_std
= (145<<16) | 16, // L R C Vhc Lsd Rsd Ls Rs Vhl Vhr Lw Rw Csd Cs LFE1 LFE2
200 CoreAudio_Layout_TMH_10_2_full
= (146<<16) | 21, // TMH_10_2_std plus: Lc Rc HI VI Haptic
202 CoreAudio_Layout_AC3_1_0_1
= (149<<16) | 2, // C LFE
203 CoreAudio_Layout_AC3_3_0
= (150<<16) | 3, // L C R
204 CoreAudio_Layout_AC3_3_1
= (151<<16) | 4, // L C R Cs
205 CoreAudio_Layout_AC3_3_0_1
= (152<<16) | 4, // L C R LFE
206 CoreAudio_Layout_AC3_2_1_1
= (153<<16) | 4, // L R Cs LFE
207 CoreAudio_Layout_AC3_3_1_1
= (154<<16) | 5, // L C R Cs LFE
209 CoreAudio_Layout_EAC_6_0_A
= (155<<16) | 6, // L C R Ls Rs Cs
210 CoreAudio_Layout_EAC_7_0_A
= (156<<16) | 7, // L C R Ls Rs Rls Rrs
212 CoreAudio_Layout_EAC3_6_1_A
= (157<<16) | 7, // L C R Ls Rs LFE Cs
213 CoreAudio_Layout_EAC3_6_1_B
= (158<<16) | 7, // L C R Ls Rs LFE Ts
214 CoreAudio_Layout_EAC3_6_1_C
= (159<<16) | 7, // L C R Ls Rs LFE Vhc
215 CoreAudio_Layout_EAC3_7_1_A
= (160<<16) | 8, // L C R Ls Rs LFE Rls Rrs
216 CoreAudio_Layout_EAC3_7_1_B
= (161<<16) | 8, // L C R Ls Rs LFE Lc Rc
217 CoreAudio_Layout_EAC3_7_1_C
= (162<<16) | 8, // L C R Ls Rs LFE Lsd Rsd
218 CoreAudio_Layout_EAC3_7_1_D
= (163<<16) | 8, // L C R Ls Rs LFE Lw Rw
219 CoreAudio_Layout_EAC3_7_1_E
= (164<<16) | 8, // L C R Ls Rs LFE Vhl Vhr
221 CoreAudio_Layout_EAC3_7_1_F
= (165<<16) | 8,// L C R Ls Rs LFE Cs Ts
222 CoreAudio_Layout_EAC3_7_1_G
= (166<<16) | 8,// L C R Ls Rs LFE Cs Vhc
223 CoreAudio_Layout_EAC3_7_1_H
= (167<<16) | 8,// L C R Ls Rs LFE Ts Vhc
225 CoreAudio_Layout_DTS_3_1
= (168<<16) | 4,// C L R LFE
226 CoreAudio_Layout_DTS_4_1
= (169<<16) | 5,// C L R Cs LFE
227 CoreAudio_Layout_DTS_6_0_A
= (170<<16) | 6,// Lc Rc L R Ls Rs
228 CoreAudio_Layout_DTS_6_0_B
= (171<<16) | 6,// C L R Rls Rrs Ts
229 CoreAudio_Layout_DTS_6_0_C
= (172<<16) | 6,// C Cs L R Rls Rrs
230 CoreAudio_Layout_DTS_6_1_A
= (173<<16) | 7,// Lc Rc L R Ls Rs LFE
231 CoreAudio_Layout_DTS_6_1_B
= (174<<16) | 7,// C L R Rls Rrs Ts LFE
232 CoreAudio_Layout_DTS_6_1_C
= (175<<16) | 7,// C Cs L R Rls Rrs LFE
233 CoreAudio_Layout_DTS_7_0
= (176<<16) | 7,// Lc C Rc L R Ls Rs
234 CoreAudio_Layout_DTS_7_1
= (177<<16) | 8,// Lc C Rc L R Ls Rs LFE
235 CoreAudio_Layout_DTS_8_0_A
= (178<<16) | 8,// Lc Rc L R Ls Rs Rls Rrs
236 CoreAudio_Layout_DTS_8_0_B
= (179<<16) | 8,// Lc C Rc L R Ls Cs Rs
237 CoreAudio_Layout_DTS_8_1_A
= (180<<16) | 9,// Lc Rc L R Ls Rs Rls Rrs LFE
238 CoreAudio_Layout_DTS_8_1_B
= (181<<16) | 9,// Lc C Rc L R Ls Cs Rs LFE
239 CoreAudio_Layout_DTS_6_1_D
= (182<<16) | 7,// C L R Ls Rs LFE Cs
241 CoreAudio_Layout_DiscreteInOrder
= (147<<16) | 0,
242 CoreAudio_Layout_Unknown
= 0xFFFF0000
245 static inline int CoreAudio_Bitmap_to_vlc_bitmap( const struct CoreAudio_layout_s
*c
,
246 uint16_t *pi_mapping
,
247 uint8_t *pi_channels
,
248 const uint32_t **pp_chans_order
)
250 *pp_chans_order
= pi_vlc_chan_order_CoreAudio
;
253 for (uint8_t i
=0;i
<ARRAY_SIZE(CoreAudio_Bitmap_mapping
);i
++)
255 if ( CoreAudio_Bitmap_mapping
[i
].i_bitmap
& c
->i_channels_bitmap
)
257 if ( (CoreAudio_Bitmap_mapping
[i
].i_vlc_bitmap
& *pi_mapping
) ||
258 *pi_channels
>= AOUT_CHAN_MAX
)
260 /* double mapping or unsupported number of channels */
265 *pi_mapping
|= CoreAudio_Bitmap_mapping
[i
].i_vlc_bitmap
;
271 static const uint32_t pi_vlc_chan_order_C
[] = {
272 AOUT_CHAN_LEFT
, AOUT_CHAN_CENTER
, AOUT_CHAN_RIGHT
,
273 AOUT_CHAN_REARLEFT
, AOUT_CHAN_REARCENTER
, AOUT_CHAN_REARRIGHT
,
275 AOUT_CHAN_MIDDLELEFT
, AOUT_CHAN_MIDDLERIGHT
,
279 static const uint32_t pi_vlc_chan_order_B
[] = {
280 AOUT_CHAN_LEFT
, AOUT_CHAN_RIGHT
,
281 AOUT_CHAN_REARLEFT
, AOUT_CHAN_REARRIGHT
,
284 AOUT_CHAN_MIDDLELEFT
, AOUT_CHAN_MIDDLERIGHT
,
285 AOUT_CHAN_REARCENTER
,
289 static const uint32_t pi_vlc_chan_order_AAC
[] = {
290 AOUT_CHAN_CENTER
, AOUT_CHAN_LEFT
, AOUT_CHAN_RIGHT
,
291 AOUT_CHAN_MIDDLELEFT
, AOUT_CHAN_MIDDLERIGHT
,
292 AOUT_CHAN_REARLEFT
, AOUT_CHAN_REARRIGHT
, AOUT_CHAN_REARCENTER
,
296 static const uint32_t pi_vlc_chan_order_EAC
[] = {
297 AOUT_CHAN_LEFT
, AOUT_CHAN_CENTER
, AOUT_CHAN_RIGHT
,
298 AOUT_CHAN_MIDDLELEFT
, AOUT_CHAN_MIDDLERIGHT
,
300 AOUT_CHAN_REARLEFT
, AOUT_CHAN_REARCENTER
, AOUT_CHAN_REARRIGHT
,
304 static const uint32_t pi_vlc_chan_order_DTS
[] = {
305 AOUT_CHAN_LEFT
, AOUT_CHAN_CENTER
, AOUT_CHAN_RIGHT
,
306 AOUT_CHAN_MIDDLELEFT
, AOUT_CHAN_MIDDLERIGHT
,
307 AOUT_CHAN_REARLEFT
, AOUT_CHAN_REARCENTER
, AOUT_CHAN_REARRIGHT
,
312 static const uint32_t pi_vlc_chan_order_DTS_C
[] = {
313 AOUT_CHAN_CENTER
, AOUT_CHAN_REARCENTER
,
314 AOUT_CHAN_LEFT
, AOUT_CHAN_RIGHT
,
315 AOUT_CHAN_MIDDLELEFT
, AOUT_CHAN_MIDDLERIGHT
,
316 AOUT_CHAN_REARLEFT
, AOUT_CHAN_REARRIGHT
,
323 enum CoreAudio_Layout layout
;
324 const uint32_t *p_chans_order
;
325 uint16_t i_vlc_bitmap
;
326 } CoreAudio_Layout_mapping
[] = {
327 { CoreAudio_Layout_Mono
, NULL
, AOUT_CHAN_CENTER
},
328 { CoreAudio_Layout_Stereo
, NULL
, AOUT_CHANS_STEREO
},
329 { CoreAudio_Layout_StereoHeadphones
, NULL
, AOUT_CHANS_STEREO
},
330 { CoreAudio_Layout_Binaural
, NULL
, AOUT_CHANS_STEREO
},
331 // CoreAudio_Layout_Ambisonic_B_Format
333 { CoreAudio_Layout_Quadraphonic
, NULL
, AOUT_CHANS_4_0_MIDDLE
},
334 { CoreAudio_Layout_Pentagonal
, pi_vlc_chan_order_B
, AOUT_CHANS_4_0
| AOUT_CHAN_CENTER
},
335 // { CoreAudio_Layout_Hexagonal
336 // { CoreAudio_Layout_Octagonal
337 // { CoreAudio_Layout_Cube
339 { CoreAudio_Layout_MPEG_3_0_A
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_3_0
},
340 { CoreAudio_Layout_MPEG_3_0_B
, NULL
, AOUT_CHANS_3_0
},
341 { CoreAudio_Layout_MPEG_4_0_A
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_3_0
| AOUT_CHAN_REARCENTER
},
342 { CoreAudio_Layout_MPEG_4_0_B
, NULL
, AOUT_CHANS_3_0
| AOUT_CHAN_REARCENTER
},
343 { CoreAudio_Layout_MPEG_5_0_A
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_5_0
},
344 { CoreAudio_Layout_MPEG_5_0_B
, pi_vlc_chan_order_B
, AOUT_CHANS_5_0
},
345 { CoreAudio_Layout_MPEG_5_0_C
, pi_vlc_chan_order_C
, AOUT_CHANS_5_0
},
346 { CoreAudio_Layout_MPEG_5_0_D
, NULL
, AOUT_CHANS_5_0
},
347 { CoreAudio_Layout_MPEG_5_1_A
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_5_1
},
348 { CoreAudio_Layout_MPEG_5_1_B
, pi_vlc_chan_order_B
, AOUT_CHANS_5_1
},
349 { CoreAudio_Layout_MPEG_5_1_C
, pi_vlc_chan_order_C
, AOUT_CHANS_5_1
},
350 { CoreAudio_Layout_MPEG_5_1_D
, NULL
, AOUT_CHANS_5_1
},
351 { CoreAudio_Layout_MPEG_6_1_A
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_5_1
| AOUT_CHAN_REARCENTER
},
352 { CoreAudio_Layout_MPEG_7_1_A
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_7_1
},
353 { CoreAudio_Layout_MPEG_7_1_B
, pi_vlc_chan_order_AAC
, AOUT_CHANS_7_1
},
354 { CoreAudio_Layout_MPEG_7_1_C
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_7_1
},
355 { CoreAudio_Layout_Emagic_Default_7_1
, pi_vlc_chan_order_B
, AOUT_CHANS_7_1
},
357 { CoreAudio_Layout_ITU_2_1
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_3_0
},
358 { CoreAudio_Layout_ITU_2_2
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_4_0
},
360 { CoreAudio_Layout_DVD_4
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_2_1
},
361 { CoreAudio_Layout_DVD_5
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_2_1
| AOUT_CHAN_REARCENTER
},
362 { CoreAudio_Layout_DVD_6
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_2_1
| AOUT_CHANS_REAR
},
363 { CoreAudio_Layout_DVD_10
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_3_1
},
364 { CoreAudio_Layout_DVD_11
, pi_vlc_chan_order_CoreAudio
, AOUT_CHANS_3_1
| AOUT_CHAN_REARCENTER
},
365 { CoreAudio_Layout_DVD_18
, pi_vlc_chan_order_B
, AOUT_CHANS_5_1
},
367 { CoreAudio_Layout_AudioUnit_6_0
, pi_vlc_chan_order_B
, AOUT_CHANS_5_0
| AOUT_CHAN_REARCENTER
},
368 //CoreAudio_Layout_AudioUnit_7_0
369 { CoreAudio_Layout_AudioUnit_7_0_Front
, pi_vlc_chan_order_B
, AOUT_CHANS_5_0
| AOUT_CHANS_MIDDLE
},
371 { CoreAudio_Layout_AAC_6_0
, pi_vlc_chan_order_AAC
, AOUT_CHANS_5_0
| AOUT_CHAN_REARCENTER
},
372 { CoreAudio_Layout_AAC_6_1
, pi_vlc_chan_order_AAC
, AOUT_CHANS_5_0
| AOUT_CHAN_REARCENTER
| AOUT_CHAN_LFE
},
373 { CoreAudio_Layout_AAC_7_0
, pi_vlc_chan_order_AAC
, AOUT_CHANS_5_0
| AOUT_CHANS_MIDDLE
},
374 { CoreAudio_Layout_AAC_7_1_B
, pi_vlc_chan_order_AAC
, AOUT_CHANS_7_1
},
375 { CoreAudio_Layout_AAC_Octagonal
, pi_vlc_chan_order_AAC
, AOUT_CHANS_7_0
| AOUT_CHAN_REARCENTER
},
377 // CoreAudio_Layout_TMH_10_2_std
378 // CoreAudio_Layout_TMH_10_2_full
380 { CoreAudio_Layout_AC3_1_0_1
, pi_vlc_chan_order_C
, AOUT_CHAN_CENTER
| AOUT_CHAN_LFE
},
381 { CoreAudio_Layout_AC3_3_0
, pi_vlc_chan_order_C
, AOUT_CHANS_3_0
},
382 { CoreAudio_Layout_AC3_3_1
, pi_vlc_chan_order_C
, AOUT_CHANS_3_0
| AOUT_CHAN_REARCENTER
},
383 { CoreAudio_Layout_AC3_3_0_1
, pi_vlc_chan_order_C
, AOUT_CHANS_3_0
| AOUT_CHAN_LFE
},
384 { CoreAudio_Layout_AC3_2_1_1
, pi_vlc_chan_order_C
, AOUT_CHANS_2_1
| AOUT_CHAN_REARCENTER
},
385 { CoreAudio_Layout_AC3_3_1_1
, pi_vlc_chan_order_C
, AOUT_CHANS_3_1
| AOUT_CHAN_REARCENTER
},
387 { CoreAudio_Layout_EAC_6_0_A
, pi_vlc_chan_order_C
, AOUT_CHANS_4_0
| AOUT_CHAN_CENTER
| AOUT_CHAN_REARCENTER
},
388 { CoreAudio_Layout_EAC_7_0_A
, pi_vlc_chan_order_C
, AOUT_CHANS_6_0
| AOUT_CHAN_CENTER
},
390 { CoreAudio_Layout_EAC3_6_1_A
, pi_vlc_chan_order_EAC
, AOUT_CHANS_4_0
| AOUT_CHAN_CENTER
| AOUT_CHAN_REARCENTER
| AOUT_CHAN_LFE
},
391 // { CoreAudio_Layout_EAC3_6_1_B, pi_vlc_chan_order_EAC, },
392 // { CoreAudio_Layout_EAC3_6_1_C, pi_vlc_chan_order_EAC, },
393 // { CoreAudio_Layout_EAC3_7_1_A, pi_vlc_chan_order_EAC, },
394 { CoreAudio_Layout_EAC3_7_1_B
, pi_vlc_chan_order_EAC
, AOUT_CHANS_7_1
},
395 // { CoreAudio_Layout_EAC3_7_1_C, pi_vlc_chan_order_EAC, },
396 // { CoreAudio_Layout_EAC3_7_1_D, pi_vlc_chan_order_EAC, },
397 // { CoreAudio_Layout_EAC3_7_1_E, pi_vlc_chan_order_EAC, },
399 // { CoreAudio_Layout_EAC3_7_1_F, pi_vlc_chan_order_EAC, },
400 // { CoreAudio_Layout_EAC3_7_1_G, pi_vlc_chan_order_EAC, },
401 // { CoreAudio_Layout_EAC3_7_1_H, pi_vlc_chan_order_EAC, },
403 { CoreAudio_Layout_DTS_3_1
, NULL
, AOUT_CHANS_3_1
},
404 { CoreAudio_Layout_DTS_4_1
, NULL
, AOUT_CHANS_3_1
| AOUT_CHAN_REARCENTER
},
405 { CoreAudio_Layout_DTS_6_0_A
, NULL
, AOUT_CHANS_6_0
},
406 // { CoreAudio_Layout_DTS_6_0_B, NULL, },
407 { CoreAudio_Layout_DTS_6_0_C
, pi_vlc_chan_order_DTS_C
, AOUT_CHANS_6_0
},
408 { CoreAudio_Layout_DTS_6_1_A
, NULL
, AOUT_CHANS_6_1_MIDDLE
},
409 //{ CoreAudio_Layout_DTS_6_1_B, NULL, },
410 { CoreAudio_Layout_DTS_6_1_C
, pi_vlc_chan_order_DTS_C
, AOUT_CHANS_6_1_MIDDLE
},
411 { CoreAudio_Layout_DTS_7_0
, pi_vlc_chan_order_DTS
, AOUT_CHANS_6_0
| AOUT_CHAN_CENTER
},
412 { CoreAudio_Layout_DTS_7_1
, pi_vlc_chan_order_DTS
, AOUT_CHANS_7_1
},
413 // { CoreAudio_Layout_DTS_8_0_A
414 { CoreAudio_Layout_DTS_8_0_B
, pi_vlc_chan_order_DTS
, AOUT_CHANS_5_0
| AOUT_CHANS_MIDDLE
| AOUT_CHAN_REARCENTER
},
415 //{ CoreAudio_Layout_DTS_8_1_A
416 //{ CoreAudio_Layout_DTS_8_1_B = (181<<16) | 9,// Lc C Rc L R Ls Cs Rs LFE
417 //{ CoreAudio_Layout_DTS_6_1_D = (182<<16) | 7,// C L R Ls Rs LFE Cs
420 static inline int CoreAudio_Layout_to_vlc( const struct CoreAudio_layout_s
*c
,
422 uint8_t *pi_channels
,
423 const uint32_t **pp_chans_order
)
425 if( c
->i_channels_layout_tag
== CoreAudio_Layout_BITMAP
)
426 return CoreAudio_Bitmap_to_vlc_bitmap( c
, pi_bitmap
, pi_channels
, pp_chans_order
);
428 for (size_t i
=0;i
<ARRAY_SIZE(CoreAudio_Layout_mapping
);i
++)
430 if(CoreAudio_Layout_mapping
[i
].layout
== c
->i_channels_layout_tag
)
432 *pi_bitmap
= CoreAudio_Layout_mapping
[i
].i_vlc_bitmap
;
433 *pp_chans_order
= CoreAudio_Layout_mapping
[i
].p_chans_order
;
434 *pi_channels
= c
->i_channels_layout_tag
& 0xFF;