sbawe: fix memory detection part 2
[safe/jmp/linux-2.6] / sound / usb / usbmixer_maps.c
index 1e994c9..77c3588 100644 (file)
@@ -26,10 +26,16 @@ struct usbmix_name_map {
        int control;
 };
 
+struct usbmix_selector_map {
+       int id;
+       int count;
+       const char **names;
+};
+
 struct usbmix_ctl_map {
-       int vendor;
-       int product;
+       u32 id;
        const struct usbmix_name_map *map;
+       const struct usbmix_selector_map *selector_map;
        int ignore_ctl_error;
 };
 
@@ -118,6 +124,76 @@ static struct usbmix_name_map mp3plus_map[] = {
        { 0 } /* terminator */
 };
 
+/* Topology of SB Audigy 2 NX
+
+          +----------------------------->EU[27]--+
+          |                                      v
+          | +----------------------------------->SU[29]---->FU[22]-->Dig_OUT[24]
+          | |                                    ^
+USB_IN[1]-+------------+              +->EU[17]->+->FU[11]-+
+            |          v              |          v         |
+Dig_IN[4]---+->FU[6]-->MU[16]->FU[18]-+->EU[21]->SU[31]----->FU[30]->Hph_OUT[20]
+            |          ^              |                    |
+Lin_IN[7]-+--->FU[8]---+              +->EU[23]->FU[28]------------->Spk_OUT[19]
+          | |                                              v
+          +--->FU[12]------------------------------------->SU[14]--->USB_OUT[15]
+            |                                              ^
+            +->FU[13]--------------------------------------+
+*/
+static struct usbmix_name_map audigy2nx_map[] = {
+       /* 1: IT pcm playback */
+       /* 4: IT digital in */
+       { 6, "Digital In Playback" }, /* FU */
+       /* 7: IT line in */
+       { 8, "Line Playback" }, /* FU */
+       { 11, "What-U-Hear Capture" }, /* FU */
+       { 12, "Line Capture" }, /* FU */
+       { 13, "Digital In Capture" }, /* FU */
+       { 14, "Capture Source" }, /* SU */
+       /* 15: OT pcm capture */
+       /* 16: MU w/o controls */
+       { 17, NULL }, /* DISABLED: EU (for what?) */
+       { 18, "Master Playback" }, /* FU */
+       /* 19: OT speaker */
+       /* 20: OT headphone */
+       { 21, NULL }, /* DISABLED: EU (for what?) */
+       { 22, "Digital Out Playback" }, /* FU */
+       { 23, NULL }, /* DISABLED: EU (for what?) */
+       /* 24: OT digital out */
+       { 27, NULL }, /* DISABLED: EU (for what?) */
+       { 28, "Speaker Playback" }, /* FU */
+       { 29, "Digital Out Source" }, /* SU */
+       { 30, "Headphone Playback" }, /* FU */
+       { 31, "Headphone Source" }, /* SU */
+       { 0 } /* terminator */
+};
+
+static struct usbmix_selector_map audigy2nx_selectors[] = {
+       {
+               .id = 14, /* Capture Source */
+               .count = 3,
+               .names = (const char*[]) {"Line", "Digital In", "What-U-Hear"}
+       },
+       {
+               .id = 29, /* Digital Out Source */
+               .count = 3,
+               .names = (const char*[]) {"Front", "PCM", "Digital In"}
+       },
+       {
+               .id = 31, /* Headphone Source */
+               .count = 2,
+               .names = (const char*[]) {"Front", "Side"}
+       },
+       { 0 } /* terminator */
+};
+
+/* Creative SoundBlaster Live! 24-bit External */
+static struct usbmix_name_map live24ext_map[] = {
+       /* 2: PCM Playback Volume */
+       { 5, "Mic Capture" }, /* FU, default PCM Capture Volume */
+       { 0 } /* terminator */
+};
+
 /* LineX FM Transmitter entry - needed to bypass controls bug */
 static struct usbmix_name_map linex_map[] = {
        /* 1: IT pcm */
@@ -126,6 +202,22 @@ static struct usbmix_name_map linex_map[] = {
        { 0 } /* terminator */
 };
 
+static struct usbmix_name_map maya44_map[] = {
+       /* 1: IT line */
+       { 2, "Line Playback" }, /* FU */
+       /* 3: IT line */
+       { 4, "Line Playback" }, /* FU */
+       /* 5: IT pcm playback */
+       /* 6: MU */
+       { 7, "Master Playback" }, /* FU */
+       /* 8: OT speaker */
+       /* 9: IT line */
+       { 10, "Line Capture" }, /* FU */
+       /* 11: MU */
+       /* 12: OT pcm capture */
+       { }
+};
+
 /* Section "justlink_map" below added by James Courtier-Dutton <James@superbug.demon.co.uk>
  * sourced from Maplin Electronics (http://www.maplin.co.uk), part number A56AK
  * Part has 2 connectors that act as a single output. (TOSLINK Optical for digital out, and 3.5mm Jack for Analogue out.)
@@ -149,15 +241,125 @@ static struct usbmix_name_map justlink_map[] = {
        { 0 } /* terminator */
 };
 
+/* TerraTec Aureon 5.1 MkII USB */
+static struct usbmix_name_map aureon_51_2_map[] = {
+       /* 1: IT USB */
+       /* 2: IT Mic */
+       /* 3: IT Line */
+       /* 4: IT SPDIF */
+       /* 5: OT SPDIF */
+       /* 6: OT Speaker */
+       /* 7: OT USB */
+       { 8, "Capture Source" }, /* SU */
+       { 9, "Master Playback" }, /* FU */
+       { 10, "Mic Capture" }, /* FU */
+       { 11, "Line Capture" }, /* FU */
+       { 12, "IEC958 In Capture" }, /* FU */
+       { 13, "Mic Playback" }, /* FU */
+       { 14, "Line Playback" }, /* FU */
+       /* 15: MU */
+       {} /* terminator */
+};
+
+static struct usbmix_name_map scratch_live_map[] = {
+       /* 1: IT Line 1 (USB streaming) */
+       /* 2: OT Line 1 (Speaker) */
+       /* 3: IT Line 1 (Line connector) */
+       { 4, "Line 1 In" }, /* FU */
+       /* 5: OT Line 1 (USB streaming) */
+       /* 6: IT Line 2 (USB streaming) */
+       /* 7: OT Line 2 (Speaker) */
+       /* 8: IT Line 2 (Line connector) */
+       { 9, "Line 2 In" }, /* FU */
+       /* 10: OT Line 2 (USB streaming) */
+       /* 11: IT Mic (Line connector) */
+       /* 12: OT Mic (USB streaming) */
+       { 0 } /* terminator */
+};
+
+/* "Gamesurround Muse Pocket LT" looks same like "Sound Blaster MP3+"
+ *  most importand difference is SU[8], it should be set to "Capture Source"
+ *  to make alsamixer and PA working properly.
+ *  FIXME: or mp3plus_map should use "Capture Source" too,
+ *  so this maps can be merget
+ */
+static struct usbmix_name_map hercules_usb51_map[] = {
+       { 8, "Capture Source" },        /* SU, default "PCM Capture Source" */
+       { 9, "Master Playback" },       /* FU, default "Speaker Playback" */
+       { 10, "Mic Boost", 7 },         /* FU, default "Auto Gain Input" */
+       { 11, "Line Capture" },         /* FU, default "PCM Capture" */
+       { 13, "Mic Bypass Playback" },  /* FU, default "Mic Playback" */
+       { 14, "Line Bypass Playback" }, /* FU, default "Line Playback" */
+       { 0 }                           /* terminator */
+};
+
 /*
  * Control map entries
  */
 
 static struct usbmix_ctl_map usbmix_ctl_maps[] = {
-       { 0x41e, 0x3000, extigy_map, 1 },
-       { 0x41e, 0x3010, mp3plus_map, 0 },
-       { 0x8bb, 0x2702, linex_map, 1 },
-       { 0xc45, 0x1158, justlink_map, 0 },
+       {
+               .id = USB_ID(0x041e, 0x3000),
+               .map = extigy_map,
+               .ignore_ctl_error = 1,
+       },
+       {
+               .id = USB_ID(0x041e, 0x3010),
+               .map = mp3plus_map,
+       },
+       {
+               .id = USB_ID(0x041e, 0x3020),
+               .map = audigy2nx_map,
+               .selector_map = audigy2nx_selectors,
+       },
+       {
+               .id = USB_ID(0x041e, 0x3040),
+               .map = live24ext_map,
+       },
+       {
+               .id = USB_ID(0x041e, 0x3048),
+               .map = audigy2nx_map,
+               .selector_map = audigy2nx_selectors,
+       },
+       {
+               /* Hercules DJ Console (Windows Edition) */
+               .id = USB_ID(0x06f8, 0xb000),
+               .ignore_ctl_error = 1,
+       },
+       {
+               /* Hercules DJ Console (Macintosh Edition) */
+               .id = USB_ID(0x06f8, 0xd002),
+               .ignore_ctl_error = 1,
+       },
+       {
+               /* Hercules Gamesurround Muse Pocket LT
+                * (USB 5.1 Channel Audio Adapter)
+                */
+               .id = USB_ID(0x06f8, 0xc000),
+               .map = hercules_usb51_map,
+       },
+       {
+               .id = USB_ID(0x08bb, 0x2702),
+               .map = linex_map,
+               .ignore_ctl_error = 1,
+       },
+       {
+               .id = USB_ID(0x0a92, 0x0091),
+               .map = maya44_map,
+       },
+       {
+               .id = USB_ID(0x0c45, 0x1158),
+               .map = justlink_map,
+       },
+       {
+               .id = USB_ID(0x0ccd, 0x0028),
+               .map = aureon_51_2_map,
+       },
+       {
+               .id = USB_ID(0x13e5, 0x0001),
+               .map = scratch_live_map,
+               .ignore_ctl_error = 1,
+       },
        { 0 } /* terminator */
 };