FreeBSD kernel sound device code
matrix_map.h
Go to the documentation of this file.
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_ */