xref: /freebsd/sys/dev/sound/pcm/matrix_map.h (revision cd0d51baaa4509a1db83251a601d34404d20c990)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2009 Ariff Abdullah <ariff@FreeBSD.org>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD$
29  */
30 
31 #ifndef _SND_MATRIX_MAP_H_
32 #define _SND_MATRIX_MAP_H_
33 
34 /*
35  * Standard matrix maps:
36  *
37  * struct pcmchan_matrix {
38  * 	.id = Matrix identity (see matrix.h). Custom defined should use
39  * 	      one of SND_CHN_MATRIX_MISC (for whatever purposes) or
40  * 	      SND_CHN_MATRIX_DRV (hardware driver).
41  * 	.channels = Total number of channels, including whatever 'extended'
42  * 		    (the X.ext notions, mostly LFE).
43  * 	.ext = Total number of extended channels (LFE).
44  * 	.map = {
45  * 		Sequences of channel type and interleave structure.
46  * 		[interleave offset] = {
47  * 			.type = channel type (see matrix.h).
48  * 			.members = Masks of channels that is acceptable as a
49  * 				   member of this channel type.
50  * 		},
51  * 		[total channels] = {
52  * 			.type = Maximum channels marker (SND_CHN_T_MAX).
53  * 			.members = 0 (no channels allowed here).
54  * 		},
55  * 	},
56  * 	.mask = Mask of channels that exist in this map.
57  * 	.offset = {
58  * 		channel offset that directly translate to the above interleave
59  * 		offset according to SND_CHN_T_* definitions.
60  * 	}
61  * };
62  *
63  * Rule of thumb: Avoid using SND_CHN_T_* that is marked with XXX (matrix.h),
64  *                or be prepared for the horror to come.
65  *
66  */
67 
68 #define SND_CHN_MATRIX_MAP_1_0	{					\
69 	.id = SND_CHN_MATRIX_1_0,					\
70 	.channels = 1,							\
71 	.ext = 0,							\
72 	.map = {							\
73 		/* Mono, center, etc. */				\
74 		[0] = {							\
75 			.type = SND_CHN_T_FL,				\
76 			.members =					\
77 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |	\
78 			    SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF |	\
79 			    SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR |	\
80 			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL |	\
81 			    SND_CHN_T_MASK_SR				\
82 		},							\
83 		[1] = {							\
84 			.type = SND_CHN_T_MAX,				\
85 			.members = 0					\
86 		}							\
87 	},								\
88 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |			\
89 		SND_CHN_T_MASK_FC,					\
90 	.offset = {  0,  0,  0,  0,  0,  0, -1, -1,  0,			\
91 		     0,  0, -1, -1, -1, -1, -1, -1, -1  }		\
92 }
93 
94 #define SND_CHN_MATRIX_MAP_2_0	{					\
95 	.id = SND_CHN_MATRIX_2_0,					\
96 	.channels = 2,							\
97 	.ext = 0,							\
98 	.map = {							\
99 		/* Left */						\
100 		[0] = {							\
101 			.type = SND_CHN_T_FL,				\
102 			.members =					\
103 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC |	\
104 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL |	\
105 			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL	\
106 		},							\
107 		/* Right */						\
108 		[1] = {							\
109 			.type = SND_CHN_T_FR,				\
110 			.members =					\
111 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC |	\
112 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR |	\
113 			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR	\
114 		},							\
115 		[2] = {							\
116 			.type = SND_CHN_T_MAX,				\
117 			.members = 0					\
118 		}							\
119 	},								\
120 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR,			\
121 	.offset = {  0,  1, -1, -1, -1, -1, -1, -1, -1,			\
122 		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }		\
123 }
124 
125 #define SND_CHN_MATRIX_MAP_2_1	{					\
126 	.id = SND_CHN_MATRIX_2_1,					\
127 	.channels = 3,							\
128 	.ext = 1,							\
129 	.map = {							\
130 		/* Left */						\
131 		[0] = {							\
132 			.type = SND_CHN_T_FL,				\
133 			.members =					\
134 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC |	\
135 			    SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC |	\
136 			    SND_CHN_T_MASK_SL				\
137 		},							\
138 		/* Right */						\
139 		[1] = {							\
140 			.type = SND_CHN_T_FR,				\
141 			.members =					\
142 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC |	\
143 			    SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC |	\
144 			    SND_CHN_T_MASK_SR				\
145 		},							\
146 		/* LFE */						\
147 		[2] = {							\
148 			.type = SND_CHN_T_LF,				\
149 			.members = SND_CHN_T_MASK_LF			\
150 		},							\
151 		[3] = {							\
152 			.type = SND_CHN_T_MAX,				\
153 			.members = 0					\
154 		}							\
155 	},								\
156 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |			\
157 		SND_CHN_T_MASK_LF,					\
158 	.offset = {  0,  1, -1,  2, -1, -1, -1, -1, -1,			\
159 		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }		\
160 }
161 
162 #define SND_CHN_MATRIX_MAP_3_0	{	/* 3 channels default */	\
163 	.id = SND_CHN_MATRIX_3_0,					\
164 	.channels = 3,							\
165 	.ext = 0,							\
166 	.map = {							\
167 		/* Left */						\
168 		[0] = {							\
169 			.type = SND_CHN_T_FL,				\
170 			.members =					\
171 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC |	\
172 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SL	\
173 		},							\
174 		/* Right */						\
175 		[1] = {							\
176 			.type = SND_CHN_T_FR,				\
177 			.members =					\
178 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC |	\
179 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SR	\
180 		},							\
181 		/* Rear Center */					\
182 		[2] = {							\
183 			.type = SND_CHN_T_BC,				\
184 			.members =					\
185 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL |	\
186 			    SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC |	\
187 			    SND_CHN_T_MASK_SL | SND_CHN_T_MASK_SR	\
188 		},							\
189 		[3] = {							\
190 			.type = SND_CHN_T_MAX,				\
191 			.members = 0					\
192 		}							\
193 	},								\
194 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |			\
195 		SND_CHN_T_MASK_BC,					\
196 	.offset = {  0,  1, -1, -1, -1, -1, -1, -1,  2,			\
197 		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }		\
198 }
199 
200 #define SND_CHN_MATRIX_MAP_3_1	{					\
201 	.id = SND_CHN_MATRIX_3_1,					\
202 	.channels = 4,							\
203 	.ext = 1,							\
204 	.map = {							\
205 		/* Left */						\
206 		[0] = {							\
207 			.type = SND_CHN_T_FL,				\
208 			.members =					\
209 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC |	\
210 			    SND_CHN_T_MASK_SL				\
211 		},							\
212 		/* Right */						\
213 		[1] = {							\
214 			.type = SND_CHN_T_FR,				\
215 			.members =					\
216 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC |	\
217 			    SND_CHN_T_MASK_SR				\
218 		},							\
219 		/* LFE */						\
220 		[2] = {							\
221 			.type = SND_CHN_T_LF,				\
222 			.members = SND_CHN_T_MASK_LF			\
223 		},							\
224 		/* Rear Center */					\
225 		[3] = {							\
226 			.type = SND_CHN_T_BC,				\
227 			.members =					\
228 			    SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR |	\
229 			    SND_CHN_T_MASK_BC |				\
230 			    SND_CHN_T_MASK_SL | SND_CHN_T_MASK_SR	\
231 		},							\
232 		[4] = {							\
233 			.type = SND_CHN_T_MAX,				\
234 			.members = 0					\
235 		}							\
236 	},								\
237 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |			\
238 		SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BC,			\
239 	.offset = {  0,  1, -1,  2, -1, -1, -1, -1,  3,			\
240 		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }		\
241 }
242 
243 #define SND_CHN_MATRIX_MAP_4_0	{					\
244 	.id = SND_CHN_MATRIX_4_0,					\
245 	.channels = 4,							\
246 	.ext = 0,							\
247 	.map = {							\
248 		/* Left */						\
249 		[0] = {							\
250 			.type = SND_CHN_T_FL,				\
251 			.members =					\
252 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC |	\
253 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SL	\
254 		},							\
255 		/* Right */						\
256 		[1] = {							\
257 			.type = SND_CHN_T_FR,				\
258 			.members =					\
259 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC |	\
260 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SR	\
261 		},							\
262 		/* Rear Left */						\
263 		[2] = {							\
264 			.type = SND_CHN_T_BL,				\
265 			.members =					\
266 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL |	\
267 			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL	\
268 		},							\
269 		/* Rear Right */					\
270 		[3] = {							\
271 			.type = SND_CHN_T_BR,				\
272 			.members =					\
273 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR |	\
274 			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR	\
275 		},							\
276 		[4] = {							\
277 			.type = SND_CHN_T_MAX,				\
278 			.members = 0					\
279 		}							\
280 	},								\
281 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |			\
282 		SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR,			\
283 	.offset = {  0,  1, -1, -1,  2,  3, -1, -1, -1,			\
284 		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }		\
285 }
286 
287 #define SND_CHN_MATRIX_MAP_4_1	{					\
288 	.id = SND_CHN_MATRIX_4_1,					\
289 	.channels = 5,							\
290 	.ext = 1,							\
291 	.map = {							\
292 		/* Left */						\
293 		[0] = {							\
294 			.type = SND_CHN_T_FL,				\
295 			.members =					\
296 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC |	\
297 			    SND_CHN_T_MASK_SL				\
298 		},							\
299 		/* Right */						\
300 		[1] = {							\
301 			.type = SND_CHN_T_FR,				\
302 			.members =					\
303 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC |	\
304 			    SND_CHN_T_MASK_SR				\
305 		},							\
306 		/* Rear Left */						\
307 		[2] = {							\
308 			.type = SND_CHN_T_BL,				\
309 			.members =					\
310 			    SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC |	\
311 			    SND_CHN_T_MASK_SL				\
312 		},							\
313 		/* Rear Right */					\
314 		[3] = {							\
315 			.type = SND_CHN_T_BR,				\
316 			.members =					\
317 			    SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC |	\
318 			    SND_CHN_T_MASK_SR				\
319 		},							\
320 		/* LFE */						\
321 		[4] = {							\
322 			.type = SND_CHN_T_LF,				\
323 			.members = SND_CHN_T_MASK_LF			\
324 		},							\
325 		[5] = {							\
326 			.type = SND_CHN_T_MAX,				\
327 			.members = 0					\
328 		}							\
329 	},								\
330 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |			\
331 		SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR |			\
332 		SND_CHN_T_MASK_LF,					\
333 	.offset = {  0,  1, -1,  4,  2,  3, -1, -1, -1,			\
334 		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }		\
335 }
336 
337 #define SND_CHN_MATRIX_MAP_5_0	{	/* 5 channels default */	\
338 	.id = SND_CHN_MATRIX_5_0,					\
339 	.channels = 5,							\
340 	.ext = 0,							\
341 	.map = {							\
342 		/* Left */						\
343 		[0] = {							\
344 			.type = SND_CHN_T_FL,				\
345 			.members =					\
346 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_LF |	\
347 			    SND_CHN_T_MASK_SL				\
348 		},							\
349 		/* Right */						\
350 		[1] = {							\
351 			.type = SND_CHN_T_FR,				\
352 			.members =					\
353 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_LF |	\
354 			    SND_CHN_T_MASK_SR				\
355 		},							\
356 		/* Rear Left */						\
357 		[2] = {							\
358 			.type = SND_CHN_T_BL,				\
359 			.members =					\
360 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL |	\
361 			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL	\
362 		},							\
363 		/* Rear Right */					\
364 		[3] = {							\
365 			.type = SND_CHN_T_BR,				\
366 			.members =					\
367 			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR |	\
368 			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR	\
369 		},							\
370 		/* Center */						\
371 		[4] = {							\
372 			.type = SND_CHN_T_FC,				\
373 			.members = SND_CHN_T_MASK_FC			\
374 		},							\
375 		[5] = {							\
376 			.type = SND_CHN_T_MAX,				\
377 			.members = 0					\
378 		}							\
379 	},								\
380 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |			\
381 		SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR |			\
382 		SND_CHN_T_MASK_FC,					\
383 	.offset = {  0,  1,  4, -1,  2,  3, -1, -1, -1,			\
384 		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }		\
385 }
386 
387 #define SND_CHN_MATRIX_MAP_5_1	{	/* 6 channels default */	\
388 	.id = SND_CHN_MATRIX_5_1,					\
389 	.channels = 6,							\
390 	.ext = 1,							\
391 	.map = {							\
392 		/* Left */						\
393 		[0] = {							\
394 			.type = SND_CHN_T_FL,				\
395 			.members =					\
396 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_SL	\
397 		},							\
398 		/* Right */						\
399 		[1] = {							\
400 			.type = SND_CHN_T_FR,				\
401 			.members =					\
402 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_SR	\
403 		},							\
404 		/* Rear Left */						\
405 		[2] = {							\
406 			.type = SND_CHN_T_BL,				\
407 			.members =					\
408 			    SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC |	\
409 			    SND_CHN_T_MASK_SL				\
410 		},							\
411 		/* Rear Right */					\
412 		[3] = {							\
413 			.type = SND_CHN_T_BR,				\
414 			.members =					\
415 			    SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC |	\
416 			    SND_CHN_T_MASK_SR				\
417 		},							\
418 		/* Center */						\
419 		[4] = {							\
420 			.type = SND_CHN_T_FC,				\
421 			.members = SND_CHN_T_MASK_FC			\
422 		},							\
423 		/* LFE */						\
424 		[5] = {							\
425 			.type = SND_CHN_T_LF,				\
426 			.members = SND_CHN_T_MASK_LF			\
427 		},							\
428 		[6] = {							\
429 			.type = SND_CHN_T_MAX,				\
430 			.members = 0					\
431 		}							\
432 	},								\
433 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |			\
434 		SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR |			\
435 		SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF,			\
436 	.offset = {  0,  1,  4,  5,  2,  3, -1, -1, -1,			\
437 		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }		\
438 }
439 
440 #define SND_CHN_MATRIX_MAP_6_0	{					\
441 	.id = SND_CHN_MATRIX_6_0,					\
442 	.channels = 6,							\
443 	.ext = 0,							\
444 	.map  = {							\
445 		/* Left */						\
446 		[0] = {							\
447 			.type = SND_CHN_T_FL,				\
448 			.members =					\
449 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_LF |	\
450 			    SND_CHN_T_MASK_SL				\
451 		},							\
452 		/* Right */						\
453 		[1] = {							\
454 			.type = SND_CHN_T_FR,				\
455 			.members =					\
456 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_LF |	\
457 			    SND_CHN_T_MASK_SR				\
458 		},							\
459 		/* Rear Left */						\
460 		[2] = {							\
461 			.type = SND_CHN_T_BL,				\
462 			.members =					\
463 			    SND_CHN_T_MASK_BL | SND_CHN_T_MASK_LF |	\
464 			    SND_CHN_T_MASK_SL				\
465 		},							\
466 		/* Rear Right */					\
467 		[3] = {							\
468 			.type = SND_CHN_T_BR,				\
469 			.members =					\
470 			    SND_CHN_T_MASK_BR | SND_CHN_T_MASK_LF |	\
471 			    SND_CHN_T_MASK_SR				\
472 		},							\
473 		/* Center */						\
474 		[4] = {							\
475 			.type = SND_CHN_T_FC,				\
476 			.members = SND_CHN_T_MASK_FC			\
477 		},							\
478 		/* Rear Center */					\
479 		[5] = {							\
480 			.type = SND_CHN_T_BC,				\
481 			.members = SND_CHN_T_MASK_BC			\
482 		},							\
483 		[6] = {							\
484 			.type = SND_CHN_T_MAX,				\
485 			.members = 0					\
486 		}							\
487 	},								\
488 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |			\
489 		SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR |			\
490 		SND_CHN_T_MASK_FC | SND_CHN_T_MASK_BC,			\
491 	.offset = {  0,  1,  4, -1,  2,  3, -1, -1,  5,			\
492 		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }		\
493 }
494 
495 #define SND_CHN_MATRIX_MAP_6_1	{					\
496 	.id = SND_CHN_MATRIX_6_1,					\
497 	.channels = 7,							\
498 	.ext = 1,							\
499 	.map = {							\
500 		/* Left */						\
501 		[0] = {							\
502 			.type = SND_CHN_T_FL,				\
503 			.members =					\
504 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_SL	\
505 		},							\
506 		/* Right */						\
507 		[1] = {							\
508 			.type = SND_CHN_T_FR,				\
509 			.members =					\
510 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_SR	\
511 		},							\
512 		/* Rear Left */						\
513 		[2] = {							\
514 			.type = SND_CHN_T_BL,				\
515 			.members =					\
516 			    SND_CHN_T_MASK_BL | SND_CHN_T_MASK_SL	\
517 		},							\
518 		/* Rear Right */					\
519 		[3] = {							\
520 			.type = SND_CHN_T_BR,				\
521 			.members =					\
522 			    SND_CHN_T_MASK_BR | SND_CHN_T_MASK_SR	\
523 		},							\
524 		/* Center */						\
525 		[4] = {							\
526 			.type = SND_CHN_T_FC,				\
527 			.members = SND_CHN_T_MASK_FC			\
528 		},							\
529 		/* LFE */						\
530 		[5] = {							\
531 			.type = SND_CHN_T_LF,				\
532 			.members = SND_CHN_T_MASK_LF			\
533 		},							\
534 		/* Rear Center */					\
535 		[6] = {							\
536 			.type = SND_CHN_T_BC,				\
537 			.members = SND_CHN_T_MASK_BC			\
538 		},							\
539 		[7] = {							\
540 			.type = SND_CHN_T_MAX,				\
541 			.members = 0					\
542 		}							\
543 	},								\
544 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |			\
545 		SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR |			\
546 		SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF |			\
547 		SND_CHN_T_MASK_BC,					\
548 	.offset = {  0,  1,  4,  5,  2,  3, -1, -1,  6,			\
549 		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }		\
550 }
551 
552 #define SND_CHN_MATRIX_MAP_7_0	{					\
553 	.id = SND_CHN_MATRIX_7_0,					\
554 	.channels = 7,							\
555 	.ext = 0,							\
556 	.map = {							\
557 		/* Left */						\
558 		[0] = {							\
559 			.type = SND_CHN_T_FL,				\
560 			.members =					\
561 			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_LF	\
562 		},							\
563 		/* Right */						\
564 		[1] = {							\
565 			.type = SND_CHN_T_FR,				\
566 			.members =					\
567 			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_LF	\
568 		},							\
569 		/* Rear Left */						\
570 		[2] = {							\
571 			.type = SND_CHN_T_BL,				\
572 			.members =					\
573 			    SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC |	\
574 			    SND_CHN_T_MASK_LF				\
575 		},							\
576 		/* Rear Right */					\
577 		[3] = {							\
578 			.type = SND_CHN_T_BR,				\
579 			.members =					\
580 			    SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC |	\
581 			    SND_CHN_T_MASK_LF				\
582 		},							\
583 		/* Center */						\
584 		[4] = {							\
585 			.type = SND_CHN_T_FC,				\
586 			.members =					\
587 			    SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF	\
588 		},							\
589 		/* Side Left */						\
590 		[5] = {							\
591 			.type = SND_CHN_T_SL,				\
592 			.members =					\
593 			    SND_CHN_T_MASK_SL | SND_CHN_T_MASK_LF	\
594 		},							\
595 		/* Side Right */					\
596 		[6] = {							\
597 			.type = SND_CHN_T_SR,				\
598 			.members =					\
599 			    SND_CHN_T_MASK_SR | SND_CHN_T_MASK_LF	\
600 		},							\
601 		[7] = {							\
602 			.type = SND_CHN_T_MAX,				\
603 			.members = 0					\
604 		}							\
605 	},								\
606 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |			\
607 		SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR |			\
608 		SND_CHN_T_MASK_FC |					\
609 		SND_CHN_T_MASK_SL | SND_CHN_T_MASK_SR,			\
610 	.offset = {  0,  1,  4, -1,  2,  3, -1, -1, -1,			\
611 		     5,  6, -1, -1, -1, -1, -1, -1, -1  }		\
612 }
613 
614 #define SND_CHN_MATRIX_MAP_7_1	{					\
615 	.id = SND_CHN_MATRIX_7_1,					\
616 	.channels = 8,							\
617 	.ext = 1,							\
618 	.map = {							\
619 		/* Left */						\
620 		[0] = {							\
621 			.type = SND_CHN_T_FL,				\
622 			.members = SND_CHN_T_MASK_FL			\
623 		},							\
624 		/* Right */						\
625 		[1] = {							\
626 			.type = SND_CHN_T_FR,				\
627 			.members = SND_CHN_T_MASK_FR			\
628 		},							\
629 		/* Rear Left */						\
630 		[2] = {							\
631 			.type = SND_CHN_T_BL,				\
632 			.members =					\
633 			    SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC	\
634 		},							\
635 		/* Rear Right */					\
636 		[3] = {							\
637 			.type = SND_CHN_T_BR,				\
638 			.members =					\
639 			    SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC	\
640 		},							\
641 		/* Center */						\
642 		[4] = {							\
643 			.type = SND_CHN_T_FC,				\
644 			.members = SND_CHN_T_MASK_FC			\
645 		},							\
646 		/* LFE */						\
647 		[5] = {							\
648 			.type = SND_CHN_T_LF,				\
649 			.members = SND_CHN_T_MASK_LF			\
650 		},							\
651 		/* Side Left */						\
652 		[6] = {							\
653 			.type = SND_CHN_T_SL,				\
654 			.members = SND_CHN_T_MASK_SL			\
655 		},							\
656 		/* Side Right */					\
657 		[7] = {							\
658 			.type = SND_CHN_T_SR,				\
659 			.members = SND_CHN_T_MASK_SR			\
660 		},							\
661 		[8] = {							\
662 			.type = SND_CHN_T_MAX,				\
663 			.members = 0					\
664 		}							\
665 	},								\
666 	.mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR |			\
667 		SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR |			\
668 		SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF |			\
669 		SND_CHN_T_MASK_SL | SND_CHN_T_MASK_SR,			\
670 	.offset = {  0,  1,  4,  5,  2,  3, -1, -1, -1,			\
671 		     6,  7, -1, -1, -1, -1, -1, -1, -1  }		\
672 }
673 
674 #endif	/* !_SND_MATRIX_MAP_H_ */
675