1
2
3
4
5
6
7
8struct usbmix_dB_map {
9 u32 min;
10 u32 max;
11};
12
13struct usbmix_name_map {
14 int id;
15 const char *name;
16 int control;
17 const struct usbmix_dB_map *dB;
18};
19
20struct usbmix_selector_map {
21 int id;
22 int count;
23 const char **names;
24};
25
26struct usbmix_ctl_map {
27 u32 id;
28 const struct usbmix_name_map *map;
29 const struct usbmix_selector_map *selector_map;
30 const struct usbmix_connector_map *connector_map;
31};
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55static const struct usbmix_name_map extigy_map[] = {
56
57 { 2, "PCM Playback" },
58
59
60 { 5, NULL },
61 { 6, "Digital In" },
62
63 { 8, "Line Playback" },
64
65 { 10, "Mic Playback" },
66 { 11, "Capture Source" },
67 { 12, "Capture" },
68
69
70
71
72 { 17, NULL, 1 },
73 { 17, "Channel Routing", 2 },
74 { 18, "Tone Control - Bass", UAC_FU_BASS },
75 { 18, "Tone Control - Treble", UAC_FU_TREBLE },
76 { 18, "Master Playback" },
77
78
79 { 21, NULL },
80 { 22, "Digital Out Playback" },
81 { 23, "Digital Out1 Playback" },
82
83 { 25, "IEC958 Optical Playback" },
84 { 26, "IEC958 Optical Playback" },
85 { 27, NULL },
86
87 { 29, NULL },
88 { 0 }
89};
90
91
92
93
94
95
96static const struct usbmix_dB_map mp3plus_dB_1 = {.min = -4781, .max = 0};
97
98static const struct usbmix_dB_map mp3plus_dB_2 = {.min = -1781, .max = 618};
99
100
101static const struct usbmix_name_map mp3plus_map[] = {
102
103
104
105
106
107
108
109 { 8, "Capture Source" },
110
111 { 9, "Master Playback" },
112
113 { 10, NULL, 2, .dB = &mp3plus_dB_2 },
114
115 { 10, "Mic Boost", 7 },
116 { 11, "Line Capture", .dB = &mp3plus_dB_2 },
117
118 { 12, "Digital In Playback" },
119 { 13, .dB = &mp3plus_dB_1 },
120
121 { 14, "Line Playback", .dB = &mp3plus_dB_1 },
122
123 { 0 }
124};
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142static const struct usbmix_name_map audigy2nx_map[] = {
143
144
145 { 6, "Digital In Playback" },
146
147 { 8, "Line Playback" },
148 { 11, "What-U-Hear Capture" },
149 { 12, "Line Capture" },
150 { 13, "Digital In Capture" },
151 { 14, "Capture Source" },
152
153
154 { 17, NULL },
155 { 18, "Master Playback" },
156
157
158 { 21, NULL },
159 { 22, "Digital Out Playback" },
160 { 23, NULL },
161
162 { 27, NULL },
163 { 28, "Speaker Playback" },
164 { 29, "Digital Out Source" },
165 { 30, "Headphone Playback" },
166 { 31, "Headphone Source" },
167 { 0 }
168};
169
170static const struct usbmix_name_map mbox1_map[] = {
171 { 1, "Clock" },
172 { 0 }
173};
174
175static const struct usbmix_selector_map c400_selectors[] = {
176 {
177 .id = 0x80,
178 .count = 2,
179 .names = (const char*[]) {"Internal", "SPDIF"}
180 },
181 { 0 }
182};
183
184static const struct usbmix_selector_map audigy2nx_selectors[] = {
185 {
186 .id = 14,
187 .count = 3,
188 .names = (const char*[]) {"Line", "Digital In", "What-U-Hear"}
189 },
190 {
191 .id = 29,
192 .count = 3,
193 .names = (const char*[]) {"Front", "PCM", "Digital In"}
194 },
195 {
196 .id = 31,
197 .count = 2,
198 .names = (const char*[]) {"Front", "Side"}
199 },
200 { 0 }
201};
202
203
204static const struct usbmix_name_map live24ext_map[] = {
205
206 { 5, "Mic Capture" },
207 { 0 }
208};
209
210
211static const struct usbmix_name_map linex_map[] = {
212
213
214 { 3, "Master" },
215 { 0 }
216};
217
218static const struct usbmix_name_map maya44_map[] = {
219
220 { 2, "Line Playback" },
221
222 { 4, "Line Playback" },
223
224
225 { 7, "Master Playback" },
226
227
228 { 10, "Line Capture" },
229
230
231 { }
232};
233
234
235
236
237
238
239
240
241static const struct usbmix_name_map justlink_map[] = {
242
243
244 { 3, NULL},
245
246
247
248 { 7, "Master Playback" },
249 { 8, NULL },
250 { 9, NULL },
251
252
253 { 0xc, NULL },
254 { 0 }
255};
256
257
258static const struct usbmix_name_map aureon_51_2_map[] = {
259
260
261
262
263
264
265
266 { 8, "Capture Source" },
267 { 9, "Master Playback" },
268 { 10, "Mic Capture" },
269 { 11, "Line Capture" },
270 { 12, "IEC958 In Capture" },
271 { 13, "Mic Playback" },
272 { 14, "Line Playback" },
273
274 {}
275};
276
277static const struct usbmix_name_map scratch_live_map[] = {
278
279
280
281 { 4, "Line 1 In" },
282
283
284
285
286 { 9, "Line 2 In" },
287
288
289
290 { 0 }
291};
292
293static const struct usbmix_name_map ebox44_map[] = {
294 { 4, NULL },
295 { 6, NULL },
296 { 7, NULL },
297 { 10, NULL },
298 { 11, NULL },
299 { 0 }
300};
301
302
303
304
305
306
307
308static const struct usbmix_name_map hercules_usb51_map[] = {
309 { 8, "Capture Source" },
310 { 9, "Master Playback" },
311 { 10, "Mic Boost", 7 },
312 { 11, "Line Capture" },
313 { 13, "Mic Bypass Playback" },
314 { 14, "Line Bypass Playback" },
315 { 0 }
316};
317
318
319static const struct usbmix_name_map gamecom780_map[] = {
320 { 9, NULL },
321 {}
322};
323
324
325
326
327static const struct usbmix_name_map scms_usb3318_map[] = {
328 { 10, NULL },
329 { 0 }
330};
331
332
333static const struct usbmix_dB_map bose_companion5_dB = {-5006, -6};
334static const struct usbmix_name_map bose_companion5_map[] = {
335 { 3, NULL, .dB = &bose_companion5_dB },
336 { 0 }
337};
338
339
340static const struct usbmix_dB_map sennheiser_pc8_dB = {-9500, 0};
341static const struct usbmix_name_map sennheiser_pc8_map[] = {
342 { 9, NULL, .dB = &sennheiser_pc8_dB },
343 { 0 }
344};
345
346
347
348
349
350
351
352static const struct usbmix_name_map dell_alc4020_map[] = {
353 { 4, NULL },
354 { 16, NULL },
355 { 19, NULL },
356 { 0 }
357};
358
359
360
361
362
363static const struct usbmix_name_map corsair_virtuoso_map[] = {
364 { 3, "Mic Capture" },
365 { 6, "Sidetone Playback" },
366 { 0 }
367};
368
369
370
371
372
373static const struct usbmix_name_map asus_rog_map[] = {
374 { 18, NULL },
375 { 19, NULL, 12 },
376 {}
377};
378
379static const struct usbmix_name_map lenovo_p620_rear_map[] = {
380 { 19, NULL, 12 },
381 {}
382};
383
384
385static const struct usbmix_name_map trx40_mobo_map[] = {
386 { 18, NULL },
387 { 19, NULL, 12 },
388 { 16, "Speaker" },
389 { 22, "Speaker Playback" },
390 { 7, "Line" },
391 { 19, "Line Capture" },
392 { 17, "Front Headphone" },
393 { 23, "Front Headphone Playback" },
394 { 8, "Mic" },
395 { 20, "Mic Capture" },
396 { 9, "Front Mic" },
397 { 21, "Front Mic Capture" },
398 { 24, "IEC958 Playback" },
399 {}
400};
401
402static const struct usbmix_connector_map trx40_mobo_connector_map[] = {
403 { 10, 16 },
404 { 11, 17 },
405 { 13, 7 },
406 { 14, 8 },
407 { 15, 9 },
408 {}
409};
410
411
412static const struct usbmix_name_map aorus_master_alc1220vb_map[] = {
413 { 17, NULL },
414 { 19, NULL, 12 },
415 { 16, "Line Out" },
416 { 22, "Line Out Playback" },
417 { 7, "Line" },
418 { 19, "Line Capture" },
419 { 8, "Mic" },
420 { 20, "Mic Capture" },
421 { 9, "Front Mic" },
422 { 21, "Front Mic Capture" },
423 {}
424};
425
426
427
428
429
430static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
431 {
432 .id = USB_ID(0x041e, 0x3000),
433 .map = extigy_map,
434 },
435 {
436 .id = USB_ID(0x041e, 0x3010),
437 .map = mp3plus_map,
438 },
439 {
440 .id = USB_ID(0x041e, 0x3020),
441 .map = audigy2nx_map,
442 .selector_map = audigy2nx_selectors,
443 },
444 {
445 .id = USB_ID(0x041e, 0x3040),
446 .map = live24ext_map,
447 },
448 {
449 .id = USB_ID(0x041e, 0x3048),
450 .map = audigy2nx_map,
451 .selector_map = audigy2nx_selectors,
452 },
453 {
454 .id = USB_ID(0x047f, 0xc010),
455 .map = gamecom780_map,
456 },
457 {
458
459
460
461 .id = USB_ID(0x06f8, 0xc000),
462 .map = hercules_usb51_map,
463 },
464 {
465 .id = USB_ID(0x0763, 0x2030),
466 .selector_map = c400_selectors,
467 },
468 {
469 .id = USB_ID(0x0763, 0x2031),
470 .selector_map = c400_selectors,
471 },
472 {
473 .id = USB_ID(0x08bb, 0x2702),
474 .map = linex_map,
475 },
476 {
477 .id = USB_ID(0x0a92, 0x0091),
478 .map = maya44_map,
479 },
480 {
481 .id = USB_ID(0x0c45, 0x1158),
482 .map = justlink_map,
483 },
484 {
485 .id = USB_ID(0x0ccd, 0x0028),
486 .map = aureon_51_2_map,
487 },
488 {
489 .id = USB_ID(0x0bda, 0x4014),
490 .map = dell_alc4020_map,
491 },
492 {
493 .id = USB_ID(0x0dba, 0x1000),
494 .map = mbox1_map,
495 },
496 {
497 .id = USB_ID(0x13e5, 0x0001),
498 .map = scratch_live_map,
499 },
500 {
501 .id = USB_ID(0x200c, 0x1018),
502 .map = ebox44_map,
503 },
504 {
505
506 .id = USB_ID(0x2573, 0x0008),
507 .map = maya44_map,
508 },
509 {
510
511 .id = USB_ID(0x27ac, 0x1000),
512 .map = scms_usb3318_map,
513 },
514 {
515
516 .id = USB_ID(0x25c4, 0x0003),
517 .map = scms_usb3318_map,
518 },
519 {
520
521 .id = USB_ID(0x05a7, 0x1020),
522 .map = bose_companion5_map,
523 },
524 {
525
526 .id = USB_ID(0x1b1c, 0x0a3d),
527 .map = corsair_virtuoso_map,
528 },
529 {
530
531 .id = USB_ID(0x1b1c, 0x0a3e),
532 .map = corsair_virtuoso_map,
533 },
534 {
535
536 .id = USB_ID(0x1b1c, 0x0a41),
537 .map = corsair_virtuoso_map,
538 },
539 {
540
541 .id = USB_ID(0x1b1c, 0x0a42),
542 .map = corsair_virtuoso_map,
543 },
544 {
545 .id = USB_ID(0x0414, 0xa001),
546 .map = aorus_master_alc1220vb_map,
547 },
548 {
549 .id = USB_ID(0x0414, 0xa002),
550 .map = trx40_mobo_map,
551 .connector_map = trx40_mobo_connector_map,
552 },
553 {
554 .id = USB_ID(0x0b05, 0x1916),
555 .map = asus_rog_map,
556 },
557 {
558 .id = USB_ID(0x0b05, 0x1917),
559 .map = trx40_mobo_map,
560 .connector_map = trx40_mobo_connector_map,
561 },
562 {
563 .id = USB_ID(0x0db0, 0x0d64),
564 .map = trx40_mobo_map,
565 .connector_map = trx40_mobo_connector_map,
566 },
567 {
568 .id = USB_ID(0x0db0, 0x543d),
569 .map = trx40_mobo_map,
570 .connector_map = trx40_mobo_connector_map,
571 },
572 {
573 .id = USB_ID(0x26ce, 0x0a01),
574 .map = trx40_mobo_map,
575 .connector_map = trx40_mobo_connector_map,
576 },
577 {
578 .id = USB_ID(0x17aa, 0x1046),
579 .map = lenovo_p620_rear_map,
580 },
581 {
582
583 .id = USB_ID(0x1395, 0x0025),
584 .map = sennheiser_pc8_map,
585 },
586 { 0 }
587};
588
589
590
591
592
593static const struct usbmix_name_map uac3_badd_generic_io_map[] = {
594 { UAC3_BADD_FU_ID2, "Generic Out Playback" },
595 { UAC3_BADD_FU_ID5, "Generic In Capture" },
596 { 0 }
597};
598static const struct usbmix_name_map uac3_badd_headphone_map[] = {
599 { UAC3_BADD_FU_ID2, "Headphone Playback" },
600 { 0 }
601};
602static const struct usbmix_name_map uac3_badd_speaker_map[] = {
603 { UAC3_BADD_FU_ID2, "Speaker Playback" },
604 { 0 }
605};
606static const struct usbmix_name_map uac3_badd_microphone_map[] = {
607 { UAC3_BADD_FU_ID5, "Mic Capture" },
608 { 0 }
609};
610
611static const struct usbmix_name_map uac3_badd_headset_map[] = {
612 { UAC3_BADD_FU_ID2, "Headset Playback" },
613 { UAC3_BADD_FU_ID5, "Headset Capture" },
614 { UAC3_BADD_FU_ID7, "Sidetone Mixing" },
615 { 0 }
616};
617static const struct usbmix_name_map uac3_badd_speakerphone_map[] = {
618 { UAC3_BADD_FU_ID2, "Speaker Playback" },
619 { UAC3_BADD_FU_ID5, "Mic Capture" },
620 { 0 }
621};
622
623static const struct usbmix_ctl_map uac3_badd_usbmix_ctl_maps[] = {
624 {
625 .id = UAC3_FUNCTION_SUBCLASS_GENERIC_IO,
626 .map = uac3_badd_generic_io_map,
627 },
628 {
629 .id = UAC3_FUNCTION_SUBCLASS_HEADPHONE,
630 .map = uac3_badd_headphone_map,
631 },
632 {
633 .id = UAC3_FUNCTION_SUBCLASS_SPEAKER,
634 .map = uac3_badd_speaker_map,
635 },
636 {
637 .id = UAC3_FUNCTION_SUBCLASS_MICROPHONE,
638 .map = uac3_badd_microphone_map,
639 },
640 {
641 .id = UAC3_FUNCTION_SUBCLASS_HEADSET,
642 .map = uac3_badd_headset_map,
643 },
644 {
645 .id = UAC3_FUNCTION_SUBCLASS_HEADSET_ADAPTER,
646 .map = uac3_badd_headset_map,
647 },
648 {
649 .id = UAC3_FUNCTION_SUBCLASS_SPEAKERPHONE,
650 .map = uac3_badd_speakerphone_map,
651 },
652 { 0 }
653};
654