Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mixer_maps.c
Go to the documentation of this file.
1 /*
2  * Additional mixer mapping
3  *
4  * Copyright (c) 2002 by Takashi Iwai <[email protected]>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  *
20  */
21 
22 struct usbmix_dB_map {
25 };
26 
28  int id;
29  const char *name;
30  int control;
31  struct usbmix_dB_map *dB;
32 };
33 
35  int id;
36  int count;
37  const char **names;
38 };
39 
42  const struct usbmix_name_map *map;
45 };
46 
47 /*
48  * USB control mappers for SB Exitigy
49  */
50 
51 /*
52  * Topology of SB Extigy (see on the wide screen :)
53 
54 USB_IN[1] --->FU[2]------------------------------+->MU[16]-->PU[17]-+->FU[18]--+->EU[27]--+->EU[21]-->FU[22]--+->FU[23] > Dig_OUT[24]
55  ^ | | | |
56 USB_IN[3] -+->SU[5]-->FU[6]--+->MU[14] ->PU[15]->+ | | | +->FU[25] > Dig_OUT[26]
57  ^ ^ | | | |
58 Dig_IN[4] -+ | | | | +->FU[28]---------------------> Spk_OUT[19]
59  | | | |
60 Lin-IN[7] -+-->FU[8]---------+ | | +----------------------------------------> Hph_OUT[20]
61  | | |
62 Mic-IN[9] --+->FU[10]----------------------------+ |
63  || |
64  || +----------------------------------------------------+
65  VV V
66  ++--+->SU[11]-->FU[12] --------------------------------------------------------------------------------------> USB_OUT[13]
67 */
68 
69 static struct usbmix_name_map extigy_map[] = {
70  /* 1: IT pcm */
71  { 2, "PCM Playback" }, /* FU */
72  /* 3: IT pcm */
73  /* 4: IT digital in */
74  { 5, NULL }, /* DISABLED: this seems to be bogus on some firmware */
75  { 6, "Digital In" }, /* FU */
76  /* 7: IT line */
77  { 8, "Line Playback" }, /* FU */
78  /* 9: IT mic */
79  { 10, "Mic Playback" }, /* FU */
80  { 11, "Capture Source" }, /* SU */
81  { 12, "Capture" }, /* FU */
82  /* 13: OT pcm capture */
83  /* 14: MU (w/o controls) */
84  /* 15: PU (3D enh) */
85  /* 16: MU (w/o controls) */
86  { 17, NULL, 1 }, /* DISABLED: PU-switch (any effect?) */
87  { 17, "Channel Routing", 2 }, /* PU: mode select */
88  { 18, "Tone Control - Bass", UAC_FU_BASS }, /* FU */
89  { 18, "Tone Control - Treble", UAC_FU_TREBLE }, /* FU */
90  { 18, "Master Playback" }, /* FU; others */
91  /* 19: OT speaker */
92  /* 20: OT headphone */
93  { 21, NULL }, /* DISABLED: EU (for what?) */
94  { 22, "Digital Out Playback" }, /* FU */
95  { 23, "Digital Out1 Playback" }, /* FU */ /* FIXME: corresponds to 24 */
96  /* 24: OT digital out */
97  { 25, "IEC958 Optical Playback" }, /* FU */
98  { 26, "IEC958 Optical Playback" }, /* OT */
99  { 27, NULL }, /* DISABLED: EU (for what?) */
100  /* 28: FU speaker (mute) */
101  { 29, NULL }, /* Digital Input Playback Source? */
102  { 0 } /* terminator */
103 };
104 
105 /* Sound Blaster MP3+ controls mapping
106  * The default mixer channels have totally misleading names,
107  * e.g. no Master and fake PCM volume
108  * Pavel Mihaylov <[email protected]>
109  */
110 static struct usbmix_dB_map mp3plus_dB_1 = {-4781, 0}; /* just guess */
111 static struct usbmix_dB_map mp3plus_dB_2 = {-1781, 618}; /* just guess */
112 
113 static struct usbmix_name_map mp3plus_map[] = {
114  /* 1: IT pcm */
115  /* 2: IT mic */
116  /* 3: IT line */
117  /* 4: IT digital in */
118  /* 5: OT digital out */
119  /* 6: OT speaker */
120  /* 7: OT pcm capture */
121  { 8, "Capture Source" }, /* FU, default PCM Capture Source */
122  /* (Mic, Input 1 = Line input, Input 2 = Optical input) */
123  { 9, "Master Playback" }, /* FU, default Speaker 1 */
124  /* { 10, "Mic Capture", 1 }, */ /* FU, Mic Capture */
125  { 10, /* "Mic Capture", */ NULL, 2, .dB = &mp3plus_dB_2 },
126  /* FU, Mic Capture */
127  { 10, "Mic Boost", 7 }, /* FU, default Auto Gain Input */
128  { 11, "Line Capture", .dB = &mp3plus_dB_2 },
129  /* FU, default PCM Capture */
130  { 12, "Digital In Playback" }, /* FU, default PCM 1 */
131  { 13, /* "Mic Playback", */ .dB = &mp3plus_dB_1 },
132  /* FU, default Mic Playback */
133  { 14, "Line Playback", .dB = &mp3plus_dB_1 }, /* FU, default Speaker */
134  /* 15: MU */
135  { 0 } /* terminator */
136 };
137 
138 /* Topology of SB Audigy 2 NX
139 
140  +----------------------------->EU[27]--+
141  | v
142  | +----------------------------------->SU[29]---->FU[22]-->Dig_OUT[24]
143  | | ^
144 USB_IN[1]-+------------+ +->EU[17]->+->FU[11]-+
145  | v | v |
146 Dig_IN[4]---+->FU[6]-->MU[16]->FU[18]-+->EU[21]->SU[31]----->FU[30]->Hph_OUT[20]
147  | ^ | |
148 Lin_IN[7]-+--->FU[8]---+ +->EU[23]->FU[28]------------->Spk_OUT[19]
149  | | v
150  +--->FU[12]------------------------------------->SU[14]--->USB_OUT[15]
151  | ^
152  +->FU[13]--------------------------------------+
153 */
154 static struct usbmix_name_map audigy2nx_map[] = {
155  /* 1: IT pcm playback */
156  /* 4: IT digital in */
157  { 6, "Digital In Playback" }, /* FU */
158  /* 7: IT line in */
159  { 8, "Line Playback" }, /* FU */
160  { 11, "What-U-Hear Capture" }, /* FU */
161  { 12, "Line Capture" }, /* FU */
162  { 13, "Digital In Capture" }, /* FU */
163  { 14, "Capture Source" }, /* SU */
164  /* 15: OT pcm capture */
165  /* 16: MU w/o controls */
166  { 17, NULL }, /* DISABLED: EU (for what?) */
167  { 18, "Master Playback" }, /* FU */
168  /* 19: OT speaker */
169  /* 20: OT headphone */
170  { 21, NULL }, /* DISABLED: EU (for what?) */
171  { 22, "Digital Out Playback" }, /* FU */
172  { 23, NULL }, /* DISABLED: EU (for what?) */
173  /* 24: OT digital out */
174  { 27, NULL }, /* DISABLED: EU (for what?) */
175  { 28, "Speaker Playback" }, /* FU */
176  { 29, "Digital Out Source" }, /* SU */
177  { 30, "Headphone Playback" }, /* FU */
178  { 31, "Headphone Source" }, /* SU */
179  { 0 } /* terminator */
180 };
181 
182 static struct usbmix_selector_map audigy2nx_selectors[] = {
183  {
184  .id = 14, /* Capture Source */
185  .count = 3,
186  .names = (const char*[]) {"Line", "Digital In", "What-U-Hear"}
187  },
188  {
189  .id = 29, /* Digital Out Source */
190  .count = 3,
191  .names = (const char*[]) {"Front", "PCM", "Digital In"}
192  },
193  {
194  .id = 31, /* Headphone Source */
195  .count = 2,
196  .names = (const char*[]) {"Front", "Side"}
197  },
198  { 0 } /* terminator */
199 };
200 
201 /* Creative SoundBlaster Live! 24-bit External */
202 static struct usbmix_name_map live24ext_map[] = {
203  /* 2: PCM Playback Volume */
204  { 5, "Mic Capture" }, /* FU, default PCM Capture Volume */
205  { 0 } /* terminator */
206 };
207 
208 /* LineX FM Transmitter entry - needed to bypass controls bug */
209 static struct usbmix_name_map linex_map[] = {
210  /* 1: IT pcm */
211  /* 2: OT Speaker */
212  { 3, "Master" }, /* FU: master volume - left / right / mute */
213  { 0 } /* terminator */
214 };
215 
216 static struct usbmix_name_map maya44_map[] = {
217  /* 1: IT line */
218  { 2, "Line Playback" }, /* FU */
219  /* 3: IT line */
220  { 4, "Line Playback" }, /* FU */
221  /* 5: IT pcm playback */
222  /* 6: MU */
223  { 7, "Master Playback" }, /* FU */
224  /* 8: OT speaker */
225  /* 9: IT line */
226  { 10, "Line Capture" }, /* FU */
227  /* 11: MU */
228  /* 12: OT pcm capture */
229  { }
230 };
231 
232 /* Section "justlink_map" below added by James Courtier-Dutton <[email protected]>
233  * sourced from Maplin Electronics (http://www.maplin.co.uk), part number A56AK
234  * Part has 2 connectors that act as a single output. (TOSLINK Optical for digital out, and 3.5mm Jack for Analogue out.)
235  * The USB Mixer publishes a Microphone and extra Volume controls for it, but none exist on the device,
236  * so this map removes all unwanted sliders from alsamixer
237  */
238 
239 static struct usbmix_name_map justlink_map[] = {
240  /* 1: IT pcm playback */
241  /* 2: Not present */
242  { 3, NULL}, /* IT mic (No mic input on device) */
243  /* 4: Not present */
244  /* 5: OT speacker */
245  /* 6: OT pcm capture */
246  { 7, "Master Playback" }, /* Mute/volume for speaker */
247  { 8, NULL }, /* Capture Switch (No capture inputs on device) */
248  { 9, NULL }, /* Capture Mute/volume (No capture inputs on device */
249  /* 0xa: Not present */
250  /* 0xb: MU (w/o controls) */
251  { 0xc, NULL }, /* Mic feedback Mute/volume (No capture inputs on device) */
252  { 0 } /* terminator */
253 };
254 
255 /* TerraTec Aureon 5.1 MkII USB */
256 static struct usbmix_name_map aureon_51_2_map[] = {
257  /* 1: IT USB */
258  /* 2: IT Mic */
259  /* 3: IT Line */
260  /* 4: IT SPDIF */
261  /* 5: OT SPDIF */
262  /* 6: OT Speaker */
263  /* 7: OT USB */
264  { 8, "Capture Source" }, /* SU */
265  { 9, "Master Playback" }, /* FU */
266  { 10, "Mic Capture" }, /* FU */
267  { 11, "Line Capture" }, /* FU */
268  { 12, "IEC958 In Capture" }, /* FU */
269  { 13, "Mic Playback" }, /* FU */
270  { 14, "Line Playback" }, /* FU */
271  /* 15: MU */
272  {} /* terminator */
273 };
274 
275 static struct usbmix_name_map scratch_live_map[] = {
276  /* 1: IT Line 1 (USB streaming) */
277  /* 2: OT Line 1 (Speaker) */
278  /* 3: IT Line 1 (Line connector) */
279  { 4, "Line 1 In" }, /* FU */
280  /* 5: OT Line 1 (USB streaming) */
281  /* 6: IT Line 2 (USB streaming) */
282  /* 7: OT Line 2 (Speaker) */
283  /* 8: IT Line 2 (Line connector) */
284  { 9, "Line 2 In" }, /* FU */
285  /* 10: OT Line 2 (USB streaming) */
286  /* 11: IT Mic (Line connector) */
287  /* 12: OT Mic (USB streaming) */
288  { 0 } /* terminator */
289 };
290 
291 static struct usbmix_name_map ebox44_map[] = {
292  { 4, NULL }, /* FU */
293  { 6, NULL }, /* MU */
294  { 7, NULL }, /* FU */
295  { 10, NULL }, /* FU */
296  { 11, NULL }, /* MU */
297  { 0 }
298 };
299 
300 /* "Gamesurround Muse Pocket LT" looks same like "Sound Blaster MP3+"
301  * most importand difference is SU[8], it should be set to "Capture Source"
302  * to make alsamixer and PA working properly.
303  * FIXME: or mp3plus_map should use "Capture Source" too,
304  * so this maps can be merget
305  */
306 static struct usbmix_name_map hercules_usb51_map[] = {
307  { 8, "Capture Source" }, /* SU, default "PCM Capture Source" */
308  { 9, "Master Playback" }, /* FU, default "Speaker Playback" */
309  { 10, "Mic Boost", 7 }, /* FU, default "Auto Gain Input" */
310  { 11, "Line Capture" }, /* FU, default "PCM Capture" */
311  { 13, "Mic Bypass Playback" }, /* FU, default "Mic Playback" */
312  { 14, "Line Bypass Playback" }, /* FU, default "Line Playback" */
313  { 0 } /* terminator */
314 };
315 
316 /*
317  * Control map entries
318  */
319 
320 static struct usbmix_ctl_map usbmix_ctl_maps[] = {
321  {
322  .id = USB_ID(0x041e, 0x3000),
323  .map = extigy_map,
324  .ignore_ctl_error = 1,
325  },
326  {
327  .id = USB_ID(0x041e, 0x3010),
328  .map = mp3plus_map,
329  },
330  {
331  .id = USB_ID(0x041e, 0x3020),
332  .map = audigy2nx_map,
333  .selector_map = audigy2nx_selectors,
334  },
335  {
336  .id = USB_ID(0x041e, 0x3040),
337  .map = live24ext_map,
338  },
339  {
340  .id = USB_ID(0x041e, 0x3048),
341  .map = audigy2nx_map,
342  .selector_map = audigy2nx_selectors,
343  },
344  { /* Logitech, Inc. QuickCam Pro for Notebooks */
345  .id = USB_ID(0x046d, 0x0991),
346  .ignore_ctl_error = 1,
347  },
348  { /* Logitech, Inc. QuickCam E 3500 */
349  .id = USB_ID(0x046d, 0x09a4),
350  .ignore_ctl_error = 1,
351  },
352  {
353  /* Hercules DJ Console (Windows Edition) */
354  .id = USB_ID(0x06f8, 0xb000),
355  .ignore_ctl_error = 1,
356  },
357  {
358  /* Hercules DJ Console (Macintosh Edition) */
359  .id = USB_ID(0x06f8, 0xd002),
360  .ignore_ctl_error = 1,
361  },
362  {
363  /* Hercules Gamesurround Muse Pocket LT
364  * (USB 5.1 Channel Audio Adapter)
365  */
366  .id = USB_ID(0x06f8, 0xc000),
367  .map = hercules_usb51_map,
368  },
369  {
370  .id = USB_ID(0x08bb, 0x2702),
371  .map = linex_map,
372  .ignore_ctl_error = 1,
373  },
374  {
375  .id = USB_ID(0x0a92, 0x0091),
376  .map = maya44_map,
377  },
378  {
379  .id = USB_ID(0x0c45, 0x1158),
380  .map = justlink_map,
381  },
382  {
383  .id = USB_ID(0x0ccd, 0x0028),
384  .map = aureon_51_2_map,
385  },
386  {
387  .id = USB_ID(0x13e5, 0x0001),
388  .map = scratch_live_map,
389  .ignore_ctl_error = 1,
390  },
391  {
392  .id = USB_ID(0x200c, 0x1018),
393  .map = ebox44_map,
394  },
395  { 0 } /* terminator */
396 };
397