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 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 int ignore_ctl_error;
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 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 struct usbmix_dB_map mp3plus_dB_1 = {.min = -4781, .max = 0};
97
98static struct usbmix_dB_map mp3plus_dB_2 = {.min = -1781, .max = 618};
99
100
101static 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 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 struct usbmix_name_map mbox1_map[] = {
171 { 1, "Clock" },
172 { 0 }
173};
174
175static 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 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 struct usbmix_name_map live24ext_map[] = {
205
206 { 5, "Mic Capture" },
207 { 0 }
208};
209
210
211static struct usbmix_name_map linex_map[] = {
212
213
214 { 3, "Master" },
215 { 0 }
216};
217
218static 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 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 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 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 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 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 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 struct usbmix_dB_map bose_companion5_dB = {-5006, -6};
334static struct usbmix_name_map bose_companion5_map[] = {
335 { 3, NULL, .dB = &bose_companion5_dB },
336 { 0 }
337};
338
339
340
341
342
343
344
345static const struct usbmix_name_map dell_alc4020_map[] = {
346 { 4, NULL },
347 { 16, NULL },
348 { 19, NULL },
349 { 0 }
350};
351
352
353
354
355
356static struct usbmix_ctl_map usbmix_ctl_maps[] = {
357 {
358 .id = USB_ID(0x041e, 0x3000),
359 .map = extigy_map,
360 .ignore_ctl_error = 1,
361 },
362 {
363 .id = USB_ID(0x041e, 0x3010),
364 .map = mp3plus_map,
365 },
366 {
367 .id = USB_ID(0x041e, 0x3020),
368 .map = audigy2nx_map,
369 .selector_map = audigy2nx_selectors,
370 },
371 {
372 .id = USB_ID(0x041e, 0x3040),
373 .map = live24ext_map,
374 },
375 {
376 .id = USB_ID(0x041e, 0x3048),
377 .map = audigy2nx_map,
378 .selector_map = audigy2nx_selectors,
379 },
380 {
381 .id = USB_ID(0x046d, 0x0991),
382 .ignore_ctl_error = 1,
383 },
384 {
385 .id = USB_ID(0x046d, 0x09a4),
386 .ignore_ctl_error = 1,
387 },
388 {
389 .id = USB_ID(0x047f, 0xc010),
390 .map = gamecom780_map,
391 },
392 {
393
394 .id = USB_ID(0x06f8, 0xb000),
395 .ignore_ctl_error = 1,
396 },
397 {
398
399 .id = USB_ID(0x06f8, 0xd002),
400 .ignore_ctl_error = 1,
401 },
402 {
403
404
405
406 .id = USB_ID(0x06f8, 0xc000),
407 .map = hercules_usb51_map,
408 },
409 {
410 .id = USB_ID(0x0763, 0x2030),
411 .selector_map = c400_selectors,
412 },
413 {
414 .id = USB_ID(0x0763, 0x2031),
415 .selector_map = c400_selectors,
416 },
417 {
418 .id = USB_ID(0x08bb, 0x2702),
419 .map = linex_map,
420 .ignore_ctl_error = 1,
421 },
422 {
423 .id = USB_ID(0x0a92, 0x0091),
424 .map = maya44_map,
425 },
426 {
427 .id = USB_ID(0x0c45, 0x1158),
428 .map = justlink_map,
429 },
430 {
431 .id = USB_ID(0x0ccd, 0x0028),
432 .map = aureon_51_2_map,
433 },
434 {
435 .id = USB_ID(0x0bda, 0x4014),
436 .map = dell_alc4020_map,
437 },
438 {
439 .id = USB_ID(0x0dba, 0x1000),
440 .map = mbox1_map,
441 },
442 {
443 .id = USB_ID(0x13e5, 0x0001),
444 .map = scratch_live_map,
445 .ignore_ctl_error = 1,
446 },
447 {
448 .id = USB_ID(0x200c, 0x1018),
449 .map = ebox44_map,
450 },
451 {
452
453 .id = USB_ID(0x2573, 0x0008),
454 .map = maya44_map,
455 },
456 {
457
458 .id = USB_ID(0x27ac, 0x1000),
459 .map = scms_usb3318_map,
460 },
461 {
462
463 .id = USB_ID(0x25c4, 0x0003),
464 .map = scms_usb3318_map,
465 },
466 {
467
468 .id = USB_ID(0x05a7, 0x1020),
469 .map = bose_companion5_map,
470 },
471 { 0 }
472};
473
474
475
476
477
478static struct usbmix_name_map uac3_badd_generic_io_map[] = {
479 { UAC3_BADD_FU_ID2, "Generic Out Playback" },
480 { UAC3_BADD_FU_ID5, "Generic In Capture" },
481 { 0 }
482};
483static struct usbmix_name_map uac3_badd_headphone_map[] = {
484 { UAC3_BADD_FU_ID2, "Headphone Playback" },
485 { 0 }
486};
487static struct usbmix_name_map uac3_badd_speaker_map[] = {
488 { UAC3_BADD_FU_ID2, "Speaker Playback" },
489 { 0 }
490};
491static struct usbmix_name_map uac3_badd_microphone_map[] = {
492 { UAC3_BADD_FU_ID5, "Mic Capture" },
493 { 0 }
494};
495
496static struct usbmix_name_map uac3_badd_headset_map[] = {
497 { UAC3_BADD_FU_ID2, "Headset Playback" },
498 { UAC3_BADD_FU_ID5, "Headset Capture" },
499 { UAC3_BADD_FU_ID7, "Sidetone Mixing" },
500 { 0 }
501};
502static struct usbmix_name_map uac3_badd_speakerphone_map[] = {
503 { UAC3_BADD_FU_ID2, "Speaker Playback" },
504 { UAC3_BADD_FU_ID5, "Mic Capture" },
505 { 0 }
506};
507
508static struct usbmix_ctl_map uac3_badd_usbmix_ctl_maps[] = {
509 {
510 .id = UAC3_FUNCTION_SUBCLASS_GENERIC_IO,
511 .map = uac3_badd_generic_io_map,
512 },
513 {
514 .id = UAC3_FUNCTION_SUBCLASS_HEADPHONE,
515 .map = uac3_badd_headphone_map,
516 },
517 {
518 .id = UAC3_FUNCTION_SUBCLASS_SPEAKER,
519 .map = uac3_badd_speaker_map,
520 },
521 {
522 .id = UAC3_FUNCTION_SUBCLASS_MICROPHONE,
523 .map = uac3_badd_microphone_map,
524 },
525 {
526 .id = UAC3_FUNCTION_SUBCLASS_HEADSET,
527 .map = uac3_badd_headset_map,
528 },
529 {
530 .id = UAC3_FUNCTION_SUBCLASS_HEADSET_ADAPTER,
531 .map = uac3_badd_headset_map,
532 },
533 {
534 .id = UAC3_FUNCTION_SUBCLASS_SPEAKERPHONE,
535 .map = uac3_badd_speakerphone_map,
536 },
537 { 0 }
538};
539