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
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_4_0 { \
199 .id = SND_CHN_MATRIX_4_0, \
205 .type = SND_CHN_T_FL, \
207 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
208 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SL \
212 .type = SND_CHN_T_FR, \
214 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
215 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_SR \
219 .type = SND_CHN_T_BL, \
221 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL | \
222 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL \
226 .type = SND_CHN_T_BR, \
228 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR | \
229 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR \
232 .type = SND_CHN_T_MAX, \
236 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
237 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR, \
238 .offset = { 0, 1, -1, -1, 2, 3, -1, -1, -1, \
239 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
242 #define SND_CHN_MATRIX_MAP_4_1 { \
243 .id = SND_CHN_MATRIX_4_1, \
249 .type = SND_CHN_T_FL, \
251 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | \
256 .type = SND_CHN_T_FR, \
258 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | \
263 .type = SND_CHN_T_BL, \
265 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC | \
270 .type = SND_CHN_T_BR, \
272 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC | \
277 .type = SND_CHN_T_LF, \
278 .members = SND_CHN_T_MASK_LF \
281 .type = SND_CHN_T_MAX, \
285 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
286 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
288 .offset = { 0, 1, -1, 4, 2, 3, -1, -1, -1, \
289 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
292 #define SND_CHN_MATRIX_MAP_5_0 { /* 5 channels default */ \
293 .id = SND_CHN_MATRIX_5_0, \
299 .type = SND_CHN_T_FL, \
301 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_LF | \
306 .type = SND_CHN_T_FR, \
308 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_LF | \
313 .type = SND_CHN_T_BL, \
315 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL | \
316 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL \
320 .type = SND_CHN_T_BR, \
322 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR | \
323 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR \
327 .type = SND_CHN_T_FC, \
328 .members = SND_CHN_T_MASK_FC \
331 .type = SND_CHN_T_MAX, \
335 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
336 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
338 .offset = { 0, 1, 4, -1, 2, 3, -1, -1, -1, \
339 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
342 #define SND_CHN_MATRIX_MAP_5_1 { /* 6 channels default */ \
343 .id = SND_CHN_MATRIX_5_1, \
349 .type = SND_CHN_T_FL, \
351 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_SL \
355 .type = SND_CHN_T_FR, \
357 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_SR \
361 .type = SND_CHN_T_BL, \
363 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC | \
368 .type = SND_CHN_T_BR, \
370 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC | \
375 .type = SND_CHN_T_FC, \
376 .members = SND_CHN_T_MASK_FC \
380 .type = SND_CHN_T_LF, \
381 .members = SND_CHN_T_MASK_LF \
384 .type = SND_CHN_T_MAX, \
388 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
389 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
390 SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF, \
391 .offset = { 0, 1, 4, 5, 2, 3, -1, -1, -1, \
392 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
395 #define SND_CHN_MATRIX_MAP_6_0 { \
396 .id = SND_CHN_MATRIX_6_0, \
402 .type = SND_CHN_T_FL, \
404 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_LF | \
409 .type = SND_CHN_T_FR, \
411 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_LF | \
416 .type = SND_CHN_T_BL, \
418 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_LF | \
423 .type = SND_CHN_T_BR, \
425 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_LF | \
430 .type = SND_CHN_T_FC, \
431 .members = SND_CHN_T_MASK_FC \
435 .type = SND_CHN_T_BC, \
436 .members = SND_CHN_T_MASK_BC \
439 .type = SND_CHN_T_MAX, \
443 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
444 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
445 SND_CHN_T_MASK_FC | SND_CHN_T_MASK_BC, \
446 .offset = { 0, 1, 4, -1, 2, 3, -1, -1, 5, \
447 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
450 #define SND_CHN_MATRIX_MAP_6_1 { \
451 .id = SND_CHN_MATRIX_6_1, \
457 .type = SND_CHN_T_FL, \
459 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_SL \
463 .type = SND_CHN_T_FR, \
465 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_SR \
469 .type = SND_CHN_T_BL, \
471 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_SL \
475 .type = SND_CHN_T_BR, \
477 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_SR \
481 .type = SND_CHN_T_FC, \
482 .members = SND_CHN_T_MASK_FC \
486 .type = SND_CHN_T_LF, \
487 .members = SND_CHN_T_MASK_LF \
491 .type = SND_CHN_T_BC, \
492 .members = SND_CHN_T_MASK_BC \
495 .type = SND_CHN_T_MAX, \
499 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
500 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
501 SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF | \
503 .offset = { 0, 1, 4, 5, 2, 3, -1, -1, 6, \
504 -1, -1, -1, -1, -1, -1, -1, -1, -1 } \
507 #define SND_CHN_MATRIX_MAP_7_1 { \
508 .id = SND_CHN_MATRIX_7_1, \
514 .type = SND_CHN_T_FL, \
515 .members = SND_CHN_T_MASK_FL \
519 .type = SND_CHN_T_FR, \
520 .members = SND_CHN_T_MASK_FR \
524 .type = SND_CHN_T_BL, \
526 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BC \
530 .type = SND_CHN_T_BR, \
532 SND_CHN_T_MASK_BR | SND_CHN_T_MASK_BC \
536 .type = SND_CHN_T_FC, \
537 .members = SND_CHN_T_MASK_FC \
541 .type = SND_CHN_T_LF, \
542 .members = SND_CHN_T_MASK_LF \
546 .type = SND_CHN_T_SL, \
547 .members = SND_CHN_T_MASK_SL \
551 .type = SND_CHN_T_SR, \
552 .members = SND_CHN_T_MASK_SR \
555 .type = SND_CHN_T_MAX, \
559 .mask = SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FR | \
560 SND_CHN_T_MASK_BL | SND_CHN_T_MASK_BR | \
561 SND_CHN_T_MASK_FC | SND_CHN_T_MASK_LF | \
562 SND_CHN_T_MASK_SL | SND_CHN_T_MASK_SR, \
563 .offset = { 0, 1, 4, 5, 2, 3, -1, -1, -1, \
564 6, 7, -1, -1, -1, -1, -1, -1, -1 } \
567 #endif /* !_SND_MATRIX_MAP_H_ */