2 * Copyright (c) 2009 Ariff Abdullah <ariff@FreeBSD.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * $FreeBSD: head/sys/dev/sound/pcm/matrix_map.h 243138 2012-11-16 07:05:57Z mav $
29 #ifndef _SND_MATRIX_MAP_H_
30 #define _SND_MATRIX_MAP_H_
33 * Standard matrix maps:
35 * struct pcmchan_matrix {
36 * .id = Matrix identity (see matrix.h). Custom defined should use
37 * one of SND_CHN_MATRIX_MISC (for whatever purposes) or
38 * SND_CHN_MATRIX_DRV (hardware driver).
39 * .channels = Total number of channels, including whatever 'extended'
40 * (the X.ext notions, mostly LFE).
41 * .ext = Total number of extended channels (LFE).
43 * Sequences of channel type and interleave structure.
44 * [interleave offset] = {
45 * .type = channel type (see matrix.h).
46 * .members = Masks of channels that is acceptable as a
47 * member of this channel type.
49 * [total channels] = {
50 * .type = Maximum channels marker (SND_CHN_T_MAX).
51 * .members = 0 (no channels allowed here).
54 * .mask = Mask of channels that exist in this map.
56 * channel offset that directly translate to the above interleave
57 * offset according to SND_CHN_T_* definitions.
61 * Rule of thumb: Avoid using SND_CHN_T_* that is marked with XXX (matrix.h),
62 * or be prepared for the horror to come.
66 #define SND_CHN_MATRIX_MAP_1_0 { \
67 .id = SND_CHN_MATRIX_1_0, \
71 /* Mono, center, etc. */ \
73 .type = SND_CHN_T_FL, \
75 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
76 SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF | \
77 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
78 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL | \
82 .type = SND_CHN_T_MAX, \
86 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
88 .offset = { 0, 0, 0, 0, 0, 0, -1, -1, 0, \
89 0, 0, -1, -1, -1, -1, -1, -1, -1 } \
92 #define SND_CHN_MATRIX_MAP_2_0 { \
93 .id = SND_CHN_MATRIX_2_0, \
99 .type = SND_CHN_T_FL, \
101 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
102 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL | \
103 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL \
107 .type = SND_CHN_T_FR, \
109 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
110 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR | \
111 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR \
114 .type = SND_CHN_T_MAX, \
118 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR, \
119 .offset = { 0, 1, -1, -1, -1, -1, -1, -1, -1, \
120 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
123 #define SND_CHN_MATRIX_MAP_2_1 { \
124 .id = SND_CHN_MATRIX_2_1, \
130 .type = SND_CHN_T_FL, \
132 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
133 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC | \
138 .type = SND_CHN_T_FR, \
140 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
141 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC | \
146 .type = SND_CHN_T_LF, \
147 .members = SND_CHN_T_MASK_LF \
150 .type = SND_CHN_T_MAX, \
154 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
156 .offset = { 0, 1, -1, 2, -1, -1, -1, -1, -1, \
157 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
160 #define SND_CHN_MATRIX_MAP_3_0 { /* 3 channels default */ \
161 .id = SND_CHN_MATRIX_3_0, \
167 .type = SND_CHN_T_FL, \
169 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
170 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SL \
174 .type = SND_CHN_T_FR, \
176 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
177 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SR \
181 .type = SND_CHN_T_BC, \
183 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL | \
184 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC | \
185 SND_CHN_T_MASK_SL | SND_CHN_T_MASK_SR \
188 .type = SND_CHN_T_MAX, \
192 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
194 .offset = { 0, 1, -1, -1, -1, -1, -1, -1, 2, \
195 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
198 #define SND_CHN_MATRIX_MAP_3_1 { \
199 .id = SND_CHN_MATRIX_3_1, \
205 .type = SND_CHN_T_FL, \
207 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
212 .type = SND_CHN_T_FR, \
214 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
219 .type = SND_CHN_T_LF, \
220 .members = SND_CHN_T_MASK_LF \
224 .type = SND_CHN_T_BC, \
226 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
227 SND_CHN_T_MASK_BC | \
228 SND_CHN_T_MASK_SL | SND_CHN_T_MASK_SR \
231 .type = SND_CHN_T_MAX, \
235 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
236 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BC, \
237 .offset = { 0, 1, -1, 2, -1, -1, -1, -1, 3, \
238 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
241 #define SND_CHN_MATRIX_MAP_4_0 { \
242 .id = SND_CHN_MATRIX_4_0, \
248 .type = SND_CHN_T_FL, \
250 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
251 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SL \
255 .type = SND_CHN_T_FR, \
257 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
258 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SR \
262 .type = SND_CHN_T_BL, \
264 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL | \
265 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL \
269 .type = SND_CHN_T_BR, \
271 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR | \
272 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR \
275 .type = SND_CHN_T_MAX, \
279 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
280 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR, \
281 .offset = { 0, 1, -1, -1, 2, 3, -1, -1, -1, \
282 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
285 #define SND_CHN_MATRIX_MAP_4_1 { \
286 .id = SND_CHN_MATRIX_4_1, \
292 .type = SND_CHN_T_FL, \
294 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
299 .type = SND_CHN_T_FR, \
301 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
306 .type = SND_CHN_T_BL, \
308 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC | \
313 .type = SND_CHN_T_BR, \
315 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC | \
320 .type = SND_CHN_T_LF, \
321 .members = SND_CHN_T_MASK_LF \
324 .type = SND_CHN_T_MAX, \
328 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
329 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
331 .offset = { 0, 1, -1, 4, 2, 3, -1, -1, -1, \
332 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
335 #define SND_CHN_MATRIX_MAP_5_0 { /* 5 channels default */ \
336 .id = SND_CHN_MATRIX_5_0, \
342 .type = SND_CHN_T_FL, \
344 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_LF | \
349 .type = SND_CHN_T_FR, \
351 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_LF | \
356 .type = SND_CHN_T_BL, \
358 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL | \
359 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL \
363 .type = SND_CHN_T_BR, \
365 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR | \
366 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR \
370 .type = SND_CHN_T_FC, \
371 .members = SND_CHN_T_MASK_FC \
374 .type = SND_CHN_T_MAX, \
378 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
379 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
381 .offset = { 0, 1, 4, -1, 2, 3, -1, -1, -1, \
382 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
385 #define SND_CHN_MATRIX_MAP_5_1 { /* 6 channels default */ \
386 .id = SND_CHN_MATRIX_5_1, \
392 .type = SND_CHN_T_FL, \
394 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_SL \
398 .type = SND_CHN_T_FR, \
400 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_SR \
404 .type = SND_CHN_T_BL, \
406 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC | \
411 .type = SND_CHN_T_BR, \
413 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC | \
418 .type = SND_CHN_T_FC, \
419 .members = SND_CHN_T_MASK_FC \
423 .type = SND_CHN_T_LF, \
424 .members = SND_CHN_T_MASK_LF \
427 .type = SND_CHN_T_MAX, \
431 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
432 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
433 SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF, \
434 .offset = { 0, 1, 4, 5, 2, 3, -1, -1, -1, \
435 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
438 #define SND_CHN_MATRIX_MAP_6_0 { \
439 .id = SND_CHN_MATRIX_6_0, \
445 .type = SND_CHN_T_FL, \
447 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_LF | \
452 .type = SND_CHN_T_FR, \
454 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_LF | \
459 .type = SND_CHN_T_BL, \
461 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_LF | \
466 .type = SND_CHN_T_BR, \
468 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_LF | \
473 .type = SND_CHN_T_FC, \
474 .members = SND_CHN_T_MASK_FC \
478 .type = SND_CHN_T_BC, \
479 .members = SND_CHN_T_MASK_BC \
482 .type = SND_CHN_T_MAX, \
486 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
487 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
488 SND_CHN_T_MASK_FC | SND_CHN_T_MASK_BC, \
489 .offset = { 0, 1, 4, -1, 2, 3, -1, -1, 5, \
490 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
493 #define SND_CHN_MATRIX_MAP_6_1 { \
494 .id = SND_CHN_MATRIX_6_1, \
500 .type = SND_CHN_T_FL, \
502 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_SL \
506 .type = SND_CHN_T_FR, \
508 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_SR \
512 .type = SND_CHN_T_BL, \
514 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_SL \
518 .type = SND_CHN_T_BR, \
520 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_SR \
524 .type = SND_CHN_T_FC, \
525 .members = SND_CHN_T_MASK_FC \
529 .type = SND_CHN_T_LF, \
530 .members = SND_CHN_T_MASK_LF \
534 .type = SND_CHN_T_BC, \
535 .members = SND_CHN_T_MASK_BC \
538 .type = SND_CHN_T_MAX, \
542 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
543 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
544 SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF | \
546 .offset = { 0, 1, 4, 5, 2, 3, -1, -1, 6, \
547 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
550 #define SND_CHN_MATRIX_MAP_7_0 { \
551 .id = SND_CHN_MATRIX_7_0, \
557 .type = SND_CHN_T_FL, \
559 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_LF \
563 .type = SND_CHN_T_FR, \
565 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_LF \
569 .type = SND_CHN_T_BL, \
571 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC | \
576 .type = SND_CHN_T_BR, \
578 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC | \
583 .type = SND_CHN_T_FC, \
585 SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF \
589 .type = SND_CHN_T_SL, \
591 SND_CHN_T_MASK_SL | SND_CHN_T_MASK_LF \
595 .type = SND_CHN_T_SR, \
597 SND_CHN_T_MASK_SR | SND_CHN_T_MASK_LF \
600 .type = SND_CHN_T_MAX, \
604 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
605 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
606 SND_CHN_T_MASK_FC | \
607 SND_CHN_T_MASK_SL | SND_CHN_T_MASK_SR, \
608 .offset = { 0, 1, 4, -1, 2, 3, -1, -1, -1, \
609 5, 6, -1, -1, -1, -1, -1, -1, -1 } \
612 #define SND_CHN_MATRIX_MAP_7_1 { \
613 .id = SND_CHN_MATRIX_7_1, \
619 .type = SND_CHN_T_FL, \
620 .members = SND_CHN_T_MASK_FL \
624 .type = SND_CHN_T_FR, \
625 .members = SND_CHN_T_MASK_FR \
629 .type = SND_CHN_T_BL, \
631 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC \
635 .type = SND_CHN_T_BR, \
637 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC \
641 .type = SND_CHN_T_FC, \
642 .members = SND_CHN_T_MASK_FC \
646 .type = SND_CHN_T_LF, \
647 .members = SND_CHN_T_MASK_LF \
651 .type = SND_CHN_T_SL, \
652 .members = SND_CHN_T_MASK_SL \
656 .type = SND_CHN_T_SR, \
657 .members = SND_CHN_T_MASK_SR \
660 .type = SND_CHN_T_MAX, \
664 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
665 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
666 SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF | \
667 SND_CHN_T_MASK_SL | SND_CHN_T_MASK_SR, \
668 .offset = { 0, 1, 4, 5, 2, 3, -1, -1, -1, \
669 6, 7, -1, -1, -1, -1, -1, -1, -1 } \
672 #endif /* !_SND_MATRIX_MAP_H_ */