2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 * Copyright (c) 2009 Ariff Abdullah <ariff@FreeBSD.org>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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
31 #ifndef _SND_MATRIX_MAP_H_
32 #define _SND_MATRIX_MAP_H_
35 * Standard matrix maps:
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).
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.
51 * [total channels] = {
52 * .type = Maximum channels marker (SND_CHN_T_MAX).
53 * .members = 0 (no channels allowed here).
56 * .mask = Mask of channels that exist in this map.
58 * channel offset that directly translate to the above interleave
59 * offset according to SND_CHN_T_* definitions.
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.
68 #define SND_CHN_MATRIX_MAP_1_0 { \
69 .id = SND_CHN_MATRIX_1_0, \
73 /* Mono, center, etc. */ \
75 .type = SND_CHN_T_FL, \
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 | \
84 .type = SND_CHN_T_MAX, \
88 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
90 .offset = { 0, 0, 0, 0, 0, 0, -1, -1, 0, \
91 0, 0, -1, -1, -1, -1, -1, -1, -1 } \
94 #define SND_CHN_MATRIX_MAP_2_0 { \
95 .id = SND_CHN_MATRIX_2_0, \
101 .type = SND_CHN_T_FL, \
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 \
109 .type = SND_CHN_T_FR, \
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 \
116 .type = SND_CHN_T_MAX, \
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 } \
125 #define SND_CHN_MATRIX_MAP_2_1 { \
126 .id = SND_CHN_MATRIX_2_1, \
132 .type = SND_CHN_T_FL, \
134 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
135 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC | \
140 .type = SND_CHN_T_FR, \
142 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
143 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC | \
148 .type = SND_CHN_T_LF, \
149 .members = SND_CHN_T_MASK_LF \
152 .type = SND_CHN_T_MAX, \
156 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
158 .offset = { 0, 1, -1, 2, -1, -1, -1, -1, -1, \
159 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
162 #define SND_CHN_MATRIX_MAP_3_0 { /* 3 channels default */ \
163 .id = SND_CHN_MATRIX_3_0, \
169 .type = SND_CHN_T_FL, \
171 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
172 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SL \
176 .type = SND_CHN_T_FR, \
178 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
179 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SR \
183 .type = SND_CHN_T_BC, \
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 \
190 .type = SND_CHN_T_MAX, \
194 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
196 .offset = { 0, 1, -1, -1, -1, -1, -1, -1, 2, \
197 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
200 #define SND_CHN_MATRIX_MAP_3_1 { \
201 .id = SND_CHN_MATRIX_3_1, \
207 .type = SND_CHN_T_FL, \
209 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
214 .type = SND_CHN_T_FR, \
216 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
221 .type = SND_CHN_T_LF, \
222 .members = SND_CHN_T_MASK_LF \
226 .type = SND_CHN_T_BC, \
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 \
233 .type = SND_CHN_T_MAX, \
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 } \
243 #define SND_CHN_MATRIX_MAP_4_0 { \
244 .id = SND_CHN_MATRIX_4_0, \
250 .type = SND_CHN_T_FL, \
252 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
253 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SL \
257 .type = SND_CHN_T_FR, \
259 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
260 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SR \
264 .type = SND_CHN_T_BL, \
266 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL | \
267 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL \
271 .type = SND_CHN_T_BR, \
273 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR | \
274 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR \
277 .type = SND_CHN_T_MAX, \
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 } \
287 #define SND_CHN_MATRIX_MAP_4_1 { \
288 .id = SND_CHN_MATRIX_4_1, \
294 .type = SND_CHN_T_FL, \
296 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
301 .type = SND_CHN_T_FR, \
303 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
308 .type = SND_CHN_T_BL, \
310 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC | \
315 .type = SND_CHN_T_BR, \
317 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC | \
322 .type = SND_CHN_T_LF, \
323 .members = SND_CHN_T_MASK_LF \
326 .type = SND_CHN_T_MAX, \
330 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
331 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
333 .offset = { 0, 1, -1, 4, 2, 3, -1, -1, -1, \
334 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
337 #define SND_CHN_MATRIX_MAP_5_0 { /* 5 channels default */ \
338 .id = SND_CHN_MATRIX_5_0, \
344 .type = SND_CHN_T_FL, \
346 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_LF | \
351 .type = SND_CHN_T_FR, \
353 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_LF | \
358 .type = SND_CHN_T_BL, \
360 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL | \
361 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL \
365 .type = SND_CHN_T_BR, \
367 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR | \
368 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR \
372 .type = SND_CHN_T_FC, \
373 .members = SND_CHN_T_MASK_FC \
376 .type = SND_CHN_T_MAX, \
380 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
381 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
383 .offset = { 0, 1, 4, -1, 2, 3, -1, -1, -1, \
384 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
387 #define SND_CHN_MATRIX_MAP_5_1 { /* 6 channels default */ \
388 .id = SND_CHN_MATRIX_5_1, \
394 .type = SND_CHN_T_FL, \
396 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_SL \
400 .type = SND_CHN_T_FR, \
402 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_SR \
406 .type = SND_CHN_T_BL, \
408 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC | \
413 .type = SND_CHN_T_BR, \
415 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC | \
420 .type = SND_CHN_T_FC, \
421 .members = SND_CHN_T_MASK_FC \
425 .type = SND_CHN_T_LF, \
426 .members = SND_CHN_T_MASK_LF \
429 .type = SND_CHN_T_MAX, \
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 } \
440 #define SND_CHN_MATRIX_MAP_6_0 { \
441 .id = SND_CHN_MATRIX_6_0, \
447 .type = SND_CHN_T_FL, \
449 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_LF | \
454 .type = SND_CHN_T_FR, \
456 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_LF | \
461 .type = SND_CHN_T_BL, \
463 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_LF | \
468 .type = SND_CHN_T_BR, \
470 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_LF | \
475 .type = SND_CHN_T_FC, \
476 .members = SND_CHN_T_MASK_FC \
480 .type = SND_CHN_T_BC, \
481 .members = SND_CHN_T_MASK_BC \
484 .type = SND_CHN_T_MAX, \
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 } \
495 #define SND_CHN_MATRIX_MAP_6_1 { \
496 .id = SND_CHN_MATRIX_6_1, \
502 .type = SND_CHN_T_FL, \
504 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_SL \
508 .type = SND_CHN_T_FR, \
510 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_SR \
514 .type = SND_CHN_T_BL, \
516 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_SL \
520 .type = SND_CHN_T_BR, \
522 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_SR \
526 .type = SND_CHN_T_FC, \
527 .members = SND_CHN_T_MASK_FC \
531 .type = SND_CHN_T_LF, \
532 .members = SND_CHN_T_MASK_LF \
536 .type = SND_CHN_T_BC, \
537 .members = SND_CHN_T_MASK_BC \
540 .type = SND_CHN_T_MAX, \
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 | \
548 .offset = { 0, 1, 4, 5, 2, 3, -1, -1, 6, \
549 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
552 #define SND_CHN_MATRIX_MAP_7_0 { \
553 .id = SND_CHN_MATRIX_7_0, \
559 .type = SND_CHN_T_FL, \
561 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_LF \
565 .type = SND_CHN_T_FR, \
567 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_LF \
571 .type = SND_CHN_T_BL, \
573 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC | \
578 .type = SND_CHN_T_BR, \
580 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC | \
585 .type = SND_CHN_T_FC, \
587 SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF \
591 .type = SND_CHN_T_SL, \
593 SND_CHN_T_MASK_SL | SND_CHN_T_MASK_LF \
597 .type = SND_CHN_T_SR, \
599 SND_CHN_T_MASK_SR | SND_CHN_T_MASK_LF \
602 .type = SND_CHN_T_MAX, \
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 } \
614 #define SND_CHN_MATRIX_MAP_7_1 { \
615 .id = SND_CHN_MATRIX_7_1, \
621 .type = SND_CHN_T_FL, \
622 .members = SND_CHN_T_MASK_FL \
626 .type = SND_CHN_T_FR, \
627 .members = SND_CHN_T_MASK_FR \
631 .type = SND_CHN_T_BL, \
633 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC \
637 .type = SND_CHN_T_BR, \
639 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC \
643 .type = SND_CHN_T_FC, \
644 .members = SND_CHN_T_MASK_FC \
648 .type = SND_CHN_T_LF, \
649 .members = SND_CHN_T_MASK_LF \
653 .type = SND_CHN_T_SL, \
654 .members = SND_CHN_T_MASK_SL \
658 .type = SND_CHN_T_SR, \
659 .members = SND_CHN_T_MASK_SR \
662 .type = SND_CHN_T_MAX, \
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 } \
674 #endif /* !_SND_MATRIX_MAP_H_ */