Chuck Ebbert b5010d0
From 82ff9c3b767ec5bfaed3d99c9ed1160e44cbfd53 Mon Sep 17 00:00:00 2001
Chuck Ebbert b5010d0
From: Jaroslav Kysela <perex@perex.cz>
Chuck Ebbert b5010d0
Date: Thu, 11 Feb 2010 17:50:44 +0100
Chuck Ebbert b5010d0
Subject: ALSA: usbmixer - add possibility to remap dB values
Chuck Ebbert b5010d0
Chuck Ebbert b5010d0
USB devices tends to represent dB ranges in different way than ALSA expects.
Chuck Ebbert b5010d0
Add possibility to override these values and add guessed values for
Chuck Ebbert b5010d0
SoundBlaster MP3+.
Chuck Ebbert b5010d0
Chuck Ebbert b5010d0
Also rename 'Capture Input Source' control to 'Capture Source' for
Chuck Ebbert b5010d0
SoundBlaster MP3+ and Extigy.
Chuck Ebbert b5010d0
Chuck Ebbert b5010d0
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Chuck Ebbert b5010d0
---
Chuck Ebbert b5010d0
 sound/usb/usbmixer.c      |  125 +++++++++++++++++++++++++++------------------
Chuck Ebbert b5010d0
 sound/usb/usbmixer_maps.c |   23 ++++++--
Chuck Ebbert b5010d0
 2 files changed, 93 insertions(+), 55 deletions(-)
Chuck Ebbert b5010d0
Chuck Ebbert b5010d0
diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c
Chuck Ebbert b5010d0
index c998220..c72ad0c 100644
Chuck Ebbert b5010d0
--- a/sound/usb/usbmixer.c
Chuck Ebbert b5010d0
+++ b/sound/usb/usbmixer.c
Chuck Ebbert b5010d0
@@ -123,6 +123,7 @@ struct usb_mixer_elem_info {
Chuck Ebbert b5010d0
 	int channels;
Chuck Ebbert b5010d0
 	int val_type;
Chuck Ebbert b5010d0
 	int min, max, res;
Chuck Ebbert b5010d0
+	int dBmin, dBmax;
Chuck Ebbert b5010d0
 	int cached;
Chuck Ebbert b5010d0
 	int cache_val[MAX_CHANNELS];
Chuck Ebbert b5010d0
 	u8 initialized;
Chuck Ebbert b5010d0
@@ -194,42 +195,50 @@ enum {
Chuck Ebbert b5010d0
  */
Chuck Ebbert b5010d0
 #include "usbmixer_maps.c"
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
-/* get the mapped name if the unit matches */
Chuck Ebbert b5010d0
-static int check_mapped_name(struct mixer_build *state, int unitid, int control, char *buf, int buflen)
Chuck Ebbert b5010d0
+static const struct usbmix_name_map *
Chuck Ebbert b5010d0
+find_map(struct mixer_build *state, int unitid, int control)
Chuck Ebbert b5010d0
 {
Chuck Ebbert b5010d0
-	const struct usbmix_name_map *p;
Chuck Ebbert b5010d0
+	const struct usbmix_name_map *p = state->map;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
-	if (! state->map)
Chuck Ebbert b5010d0
-		return 0;
Chuck Ebbert b5010d0
+	if (!p)
Chuck Ebbert b5010d0
+		return NULL;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 	for (p = state->map; p->id; p++) {
Chuck Ebbert b5010d0
-		if (p->id == unitid && p->name &&
Chuck Ebbert b5010d0
-		    (! control || ! p->control || control == p->control)) {
Chuck Ebbert b5010d0
-			buflen--;
Chuck Ebbert b5010d0
-			return strlcpy(buf, p->name, buflen);
Chuck Ebbert b5010d0
-		}
Chuck Ebbert b5010d0
+		if (p->id == unitid &&
Chuck Ebbert b5010d0
+		    (!control || !p->control || control == p->control))
Chuck Ebbert b5010d0
+			return p;
Chuck Ebbert b5010d0
 	}
Chuck Ebbert b5010d0
-	return 0;
Chuck Ebbert b5010d0
+	return NULL;
Chuck Ebbert b5010d0
 }
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
-/* check whether the control should be ignored */
Chuck Ebbert b5010d0
-static int check_ignored_ctl(struct mixer_build *state, int unitid, int control)
Chuck Ebbert b5010d0
+/* get the mapped name if the unit matches */
Chuck Ebbert b5010d0
+static int
Chuck Ebbert b5010d0
+check_mapped_name(const struct usbmix_name_map *p, char *buf, int buflen)
Chuck Ebbert b5010d0
 {
Chuck Ebbert b5010d0
-	const struct usbmix_name_map *p;
Chuck Ebbert b5010d0
+	if (!p || !p->name)
Chuck Ebbert b5010d0
+		return 0;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
-	if (! state->map)
Chuck Ebbert b5010d0
+	buflen--;
Chuck Ebbert b5010d0
+	return strlcpy(buf, p->name, buflen);
Chuck Ebbert b5010d0
+}
Chuck Ebbert b5010d0
+
Chuck Ebbert b5010d0
+/* check whether the control should be ignored */
Chuck Ebbert b5010d0
+static inline int
Chuck Ebbert b5010d0
+check_ignored_ctl(const struct usbmix_name_map *p)
Chuck Ebbert b5010d0
+{
Chuck Ebbert b5010d0
+	if (!p || p->name || p->dB)
Chuck Ebbert b5010d0
 		return 0;
Chuck Ebbert b5010d0
-	for (p = state->map; p->id; p++) {
Chuck Ebbert b5010d0
-		if (p->id == unitid && ! p->name &&
Chuck Ebbert b5010d0
-		    (! control || ! p->control || control == p->control)) {
Chuck Ebbert b5010d0
-			/*
Chuck Ebbert b5010d0
-			printk(KERN_DEBUG "ignored control %d:%d\n",
Chuck Ebbert b5010d0
-			       unitid, control);
Chuck Ebbert b5010d0
-			*/
Chuck Ebbert b5010d0
-			return 1;
Chuck Ebbert b5010d0
-		}
Chuck Ebbert b5010d0
+	return 1;
Chuck Ebbert b5010d0
+}
Chuck Ebbert b5010d0
+
Chuck Ebbert b5010d0
+/* dB mapping */
Chuck Ebbert b5010d0
+static inline void check_mapped_dB(const struct usbmix_name_map *p,
Chuck Ebbert b5010d0
+				   struct usb_mixer_elem_info *cval)
Chuck Ebbert b5010d0
+{
Chuck Ebbert b5010d0
+	if (p && p->dB) {
Chuck Ebbert b5010d0
+		cval->dBmin = p->dB->min;
Chuck Ebbert b5010d0
+		cval->dBmax = p->dB->max;
Chuck Ebbert b5010d0
 	}
Chuck Ebbert b5010d0
-	return 0;
Chuck Ebbert b5010d0
 }
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 /* get the mapped selector source name */
Chuck Ebbert b5010d0
@@ -466,20 +475,8 @@ static int mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 	if (size < sizeof(scale))
Chuck Ebbert b5010d0
 		return -ENOMEM;
Chuck Ebbert b5010d0
-	/* USB descriptions contain the dB scale in 1/256 dB unit
Chuck Ebbert b5010d0
-	 * while ALSA TLV contains in 1/100 dB unit
Chuck Ebbert b5010d0
-	 */
Chuck Ebbert b5010d0
-	scale[2] = (convert_signed_value(cval, cval->min) * 100) / 256;
Chuck Ebbert b5010d0
-	scale[3] = (convert_signed_value(cval, cval->max) * 100) / 256;
Chuck Ebbert b5010d0
-	if (scale[3] <= scale[2]) {
Chuck Ebbert b5010d0
-		/* something is wrong; assume it's either from/to 0dB */
Chuck Ebbert b5010d0
-		if (scale[2] < 0)
Chuck Ebbert b5010d0
-			scale[3] = 0;
Chuck Ebbert b5010d0
-		else if (scale[2] > 0)
Chuck Ebbert b5010d0
-			scale[2] = 0;
Chuck Ebbert b5010d0
-		else /* totally crap, return an error */
Chuck Ebbert b5010d0
-			return -EINVAL;
Chuck Ebbert b5010d0
-	}
Chuck Ebbert b5010d0
+	scale[2] = cval->dBmin;
Chuck Ebbert b5010d0
+	scale[3] = cval->dBmax;
Chuck Ebbert b5010d0
 	if (copy_to_user(_tlv, scale, sizeof(scale)))
Chuck Ebbert b5010d0
 		return -EFAULT;
Chuck Ebbert b5010d0
 	return 0;
Chuck Ebbert b5010d0
@@ -720,6 +717,7 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min)
Chuck Ebbert b5010d0
 	cval->min = default_min;
Chuck Ebbert b5010d0
 	cval->max = cval->min + 1;
Chuck Ebbert b5010d0
 	cval->res = 1;
Chuck Ebbert b5010d0
+	cval->dBmin = cval->dBmax = 0;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 	if (cval->val_type == USB_MIXER_BOOLEAN ||
Chuck Ebbert b5010d0
 	    cval->val_type == USB_MIXER_INV_BOOLEAN) {
Chuck Ebbert b5010d0
@@ -787,6 +785,24 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min)
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 		cval->initialized = 1;
Chuck Ebbert b5010d0
 	}
Chuck Ebbert b5010d0
+
Chuck Ebbert b5010d0
+	/* USB descriptions contain the dB scale in 1/256 dB unit
Chuck Ebbert b5010d0
+	 * while ALSA TLV contains in 1/100 dB unit
Chuck Ebbert b5010d0
+	 */
Chuck Ebbert b5010d0
+	cval->dBmin = (convert_signed_value(cval, cval->min) * 100) / 256;
Chuck Ebbert b5010d0
+	cval->dBmax = (convert_signed_value(cval, cval->max) * 100) / 256;
Chuck Ebbert b5010d0
+	if (cval->dBmin > cval->dBmax) {
Chuck Ebbert b5010d0
+		/* something is wrong; assume it's either from/to 0dB */
Chuck Ebbert b5010d0
+		if (cval->dBmin < 0)
Chuck Ebbert b5010d0
+			cval->dBmax = 0;
Chuck Ebbert b5010d0
+		else if (cval->dBmin > 0)
Chuck Ebbert b5010d0
+			cval->dBmin = 0;
Chuck Ebbert b5010d0
+		if (cval->dBmin > cval->dBmax) {
Chuck Ebbert b5010d0
+			/* totally crap, return an error */
Chuck Ebbert b5010d0
+			return -EINVAL;
Chuck Ebbert b5010d0
+		}
Chuck Ebbert b5010d0
+	}
Chuck Ebbert b5010d0
+
Chuck Ebbert b5010d0
 	return 0;
Chuck Ebbert b5010d0
 }
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
@@ -912,6 +928,7 @@ static void build_feature_ctl(struct mixer_build *state, unsigned char *desc,
Chuck Ebbert b5010d0
 	int nameid = desc[desc[0] - 1];
Chuck Ebbert b5010d0
 	struct snd_kcontrol *kctl;
Chuck Ebbert b5010d0
 	struct usb_mixer_elem_info *cval;
Chuck Ebbert b5010d0
+	const struct usbmix_name_map *map;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 	control++; /* change from zero-based to 1-based value */
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
@@ -920,7 +937,8 @@ static void build_feature_ctl(struct mixer_build *state, unsigned char *desc,
Chuck Ebbert b5010d0
 		return;
Chuck Ebbert b5010d0
 	}
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
-	if (check_ignored_ctl(state, unitid, control))
Chuck Ebbert b5010d0
+	map = find_map(state, unitid, control);
Chuck Ebbert b5010d0
+	if (check_ignored_ctl(map))
Chuck Ebbert b5010d0
 		return;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 	cval = kzalloc(sizeof(*cval), GFP_KERNEL);
Chuck Ebbert b5010d0
@@ -954,10 +972,11 @@ static void build_feature_ctl(struct mixer_build *state, unsigned char *desc,
Chuck Ebbert b5010d0
 	}
Chuck Ebbert b5010d0
 	kctl->private_free = usb_mixer_elem_free;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
-	len = check_mapped_name(state, unitid, control, kctl->id.name, sizeof(kctl->id.name));
Chuck Ebbert b5010d0
+	len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
Chuck Ebbert b5010d0
 	mapped_name = len != 0;
Chuck Ebbert b5010d0
 	if (! len && nameid)
Chuck Ebbert b5010d0
-		len = snd_usb_copy_string_desc(state, nameid, kctl->id.name, sizeof(kctl->id.name));
Chuck Ebbert b5010d0
+		len = snd_usb_copy_string_desc(state, nameid,
Chuck Ebbert b5010d0
+				kctl->id.name, sizeof(kctl->id.name));
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 	switch (control) {
Chuck Ebbert b5010d0
 	case USB_FEATURE_MUTE:
Chuck Ebbert b5010d0
@@ -995,6 +1014,7 @@ static void build_feature_ctl(struct mixer_build *state, unsigned char *desc,
Chuck Ebbert b5010d0
 			kctl->vd[0].access |= 
Chuck Ebbert b5010d0
 				SNDRV_CTL_ELEM_ACCESS_TLV_READ |
Chuck Ebbert b5010d0
 				SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
Chuck Ebbert b5010d0
+			check_mapped_dB(map, cval);
Chuck Ebbert b5010d0
 		}
Chuck Ebbert b5010d0
 		break;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
@@ -1122,8 +1142,10 @@ static void build_mixer_unit_ctl(struct mixer_build *state, unsigned char *desc,
Chuck Ebbert b5010d0
 	unsigned int num_outs = desc[5 + input_pins];
Chuck Ebbert b5010d0
 	unsigned int i, len;
Chuck Ebbert b5010d0
 	struct snd_kcontrol *kctl;
Chuck Ebbert b5010d0
+	const struct usbmix_name_map *map;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
-	if (check_ignored_ctl(state, unitid, 0))
Chuck Ebbert b5010d0
+	map = find_map(state, unitid, 0);
Chuck Ebbert b5010d0
+	if (check_ignored_ctl(map))
Chuck Ebbert b5010d0
 		return;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 	cval = kzalloc(sizeof(*cval), GFP_KERNEL);
Chuck Ebbert b5010d0
@@ -1152,7 +1174,7 @@ static void build_mixer_unit_ctl(struct mixer_build *state, unsigned char *desc,
Chuck Ebbert b5010d0
 	}
Chuck Ebbert b5010d0
 	kctl->private_free = usb_mixer_elem_free;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
-	len = check_mapped_name(state, unitid, 0, kctl->id.name, sizeof(kctl->id.name));
Chuck Ebbert b5010d0
+	len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
Chuck Ebbert b5010d0
 	if (! len)
Chuck Ebbert b5010d0
 		len = get_term_name(state, iterm, kctl->id.name, sizeof(kctl->id.name), 0);
Chuck Ebbert b5010d0
 	if (! len)
Chuck Ebbert b5010d0
@@ -1342,6 +1364,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, unsigned
Chuck Ebbert b5010d0
 	int i, err, nameid, type, len;
Chuck Ebbert b5010d0
 	struct procunit_info *info;
Chuck Ebbert b5010d0
 	struct procunit_value_info *valinfo;
Chuck Ebbert b5010d0
+	const struct usbmix_name_map *map;
Chuck Ebbert b5010d0
 	static struct procunit_value_info default_value_info[] = {
Chuck Ebbert b5010d0
 		{ 0x01, "Switch", USB_MIXER_BOOLEAN },
Chuck Ebbert b5010d0
 		{ 0 }
Chuck Ebbert b5010d0
@@ -1371,7 +1394,8 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, unsigned
Chuck Ebbert b5010d0
 		/* FIXME: bitmap might be longer than 8bit */
Chuck Ebbert b5010d0
 		if (! (dsc[12 + num_ins] & (1 << (valinfo->control - 1))))
Chuck Ebbert b5010d0
 			continue;
Chuck Ebbert b5010d0
-		if (check_ignored_ctl(state, unitid, valinfo->control))
Chuck Ebbert b5010d0
+		map = find_map(state, unitid, valinfo->control);
Chuck Ebbert b5010d0
+		if (check_ignored_ctl(map))
Chuck Ebbert b5010d0
 			continue;
Chuck Ebbert b5010d0
 		cval = kzalloc(sizeof(*cval), GFP_KERNEL);
Chuck Ebbert b5010d0
 		if (! cval) {
Chuck Ebbert b5010d0
@@ -1402,8 +1426,9 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, unsigned
Chuck Ebbert b5010d0
 		}
Chuck Ebbert b5010d0
 		kctl->private_free = usb_mixer_elem_free;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
-		if (check_mapped_name(state, unitid, cval->control, kctl->id.name, sizeof(kctl->id.name)))
Chuck Ebbert b5010d0
-			;
Chuck Ebbert b5010d0
+		if (check_mapped_name(map, kctl->id.name,
Chuck Ebbert b5010d0
+						sizeof(kctl->id.name)))
Chuck Ebbert b5010d0
+			/* nothing */ ;
Chuck Ebbert b5010d0
 		else if (info->name)
Chuck Ebbert b5010d0
 			strlcpy(kctl->id.name, info->name, sizeof(kctl->id.name));
Chuck Ebbert b5010d0
 		else {
Chuck Ebbert b5010d0
@@ -1542,6 +1567,7 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, unsi
Chuck Ebbert b5010d0
 	int err;
Chuck Ebbert b5010d0
 	struct usb_mixer_elem_info *cval;
Chuck Ebbert b5010d0
 	struct snd_kcontrol *kctl;
Chuck Ebbert b5010d0
+	const struct usbmix_name_map *map;
Chuck Ebbert b5010d0
 	char **namelist;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 	if (! num_ins || desc[0] < 5 + num_ins) {
Chuck Ebbert b5010d0
@@ -1557,7 +1583,8 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, unsi
Chuck Ebbert b5010d0
 	if (num_ins == 1) /* only one ? nonsense! */
Chuck Ebbert b5010d0
 		return 0;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
-	if (check_ignored_ctl(state, unitid, 0))
Chuck Ebbert b5010d0
+	map = find_map(state, unitid, 0);
Chuck Ebbert b5010d0
+	if (check_ignored_ctl(map))
Chuck Ebbert b5010d0
 		return 0;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 	cval = kzalloc(sizeof(*cval), GFP_KERNEL);
Chuck Ebbert b5010d0
@@ -1612,7 +1639,7 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, unsi
Chuck Ebbert b5010d0
 	kctl->private_free = usb_mixer_selector_elem_free;
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 	nameid = desc[desc[0] - 1];
Chuck Ebbert b5010d0
-	len = check_mapped_name(state, unitid, 0, kctl->id.name, sizeof(kctl->id.name));
Chuck Ebbert b5010d0
+	len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
Chuck Ebbert b5010d0
 	if (len)
Chuck Ebbert b5010d0
 		;
Chuck Ebbert b5010d0
 	else if (nameid)
Chuck Ebbert b5010d0
diff --git a/sound/usb/usbmixer_maps.c b/sound/usb/usbmixer_maps.c
Chuck Ebbert b5010d0
index 77c3588..79e903a 100644
Chuck Ebbert b5010d0
--- a/sound/usb/usbmixer_maps.c
Chuck Ebbert b5010d0
+++ b/sound/usb/usbmixer_maps.c
Chuck Ebbert b5010d0
@@ -19,11 +19,16 @@
Chuck Ebbert b5010d0
  *
Chuck Ebbert b5010d0
  */
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
+struct usbmix_dB_map {
Chuck Ebbert b5010d0
+	u32 min;
Chuck Ebbert b5010d0
+	u32 max;
Chuck Ebbert b5010d0
+};
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 struct usbmix_name_map {
Chuck Ebbert b5010d0
 	int id;
Chuck Ebbert b5010d0
 	const char *name;
Chuck Ebbert b5010d0
 	int control;
Chuck Ebbert b5010d0
+	struct usbmix_dB_map *dB;
Chuck Ebbert b5010d0
 };
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 struct usbmix_selector_map {
Chuck Ebbert b5010d0
@@ -72,7 +77,7 @@ static struct usbmix_name_map extigy_map[] = {
Chuck Ebbert b5010d0
 	{ 8, "Line Playback" }, /* FU */
Chuck Ebbert b5010d0
 	/* 9: IT mic */
Chuck Ebbert b5010d0
 	{ 10, "Mic Playback" }, /* FU */
Chuck Ebbert b5010d0
-	{ 11, "Capture Input Source" }, /* SU */
Chuck Ebbert b5010d0
+	{ 11, "Capture Source" }, /* SU */
Chuck Ebbert b5010d0
 	{ 12, "Capture" }, /* FU */
Chuck Ebbert b5010d0
 	/* 13: OT pcm capture */
Chuck Ebbert b5010d0
 	/* 14: MU (w/o controls) */
Chuck Ebbert b5010d0
@@ -102,6 +107,9 @@ static struct usbmix_name_map extigy_map[] = {
Chuck Ebbert b5010d0
  * e.g. no Master and fake PCM volume
Chuck Ebbert b5010d0
  *			Pavel Mihaylov <bin@bash.info>
Chuck Ebbert b5010d0
  */
Chuck Ebbert b5010d0
+static struct usbmix_dB_map mp3plus_dB_1 = {-4781, 0};	/* just guess */
Chuck Ebbert b5010d0
+static struct usbmix_dB_map mp3plus_dB_2 = {-1781, 618}; /* just guess */
Chuck Ebbert b5010d0
+
Chuck Ebbert b5010d0
 static struct usbmix_name_map mp3plus_map[] = {
Chuck Ebbert b5010d0
 	/* 1: IT pcm */
Chuck Ebbert b5010d0
 	/* 2: IT mic */
Chuck Ebbert b5010d0
@@ -110,16 +118,19 @@ static struct usbmix_name_map mp3plus_map[] = {
Chuck Ebbert b5010d0
 	/* 5: OT digital out */
Chuck Ebbert b5010d0
 	/* 6: OT speaker */
Chuck Ebbert b5010d0
 	/* 7: OT pcm capture */
Chuck Ebbert b5010d0
-	{ 8, "Capture Input Source" }, /* FU, default PCM Capture Source */
Chuck Ebbert b5010d0
+	{ 8, "Capture Source" }, /* FU, default PCM Capture Source */
Chuck Ebbert b5010d0
 		/* (Mic, Input 1 = Line input, Input 2 = Optical input) */
Chuck Ebbert b5010d0
 	{ 9, "Master Playback" }, /* FU, default Speaker 1 */
Chuck Ebbert b5010d0
 	/* { 10, "Mic Capture", 1 }, */ /* FU, Mic Capture */
Chuck Ebbert b5010d0
-	/* { 10, "Mic Capture", 2 }, */ /* FU, Mic Capture */
Chuck Ebbert b5010d0
+	{ 10, /* "Mic Capture", */ NULL, 2, .dB = &mp3plus_dB_2 },
Chuck Ebbert b5010d0
+		/* FU, Mic Capture */
Chuck Ebbert b5010d0
 	{ 10, "Mic Boost", 7 }, /* FU, default Auto Gain Input */
Chuck Ebbert b5010d0
-	{ 11, "Line Capture" }, /* FU, default PCM Capture */
Chuck Ebbert b5010d0
+	{ 11, "Line Capture", .dB = &mp3plus_dB_2 },
Chuck Ebbert b5010d0
+		/* FU, default PCM Capture */
Chuck Ebbert b5010d0
 	{ 12, "Digital In Playback" }, /* FU, default PCM 1 */
Chuck Ebbert b5010d0
-	/* { 13, "Mic Playback" }, */ /* FU, default Mic Playback */
Chuck Ebbert b5010d0
-	{ 14, "Line Playback" }, /* FU, default Speaker */
Chuck Ebbert b5010d0
+	{ 13, /* "Mic Playback", */ .dB = &mp3plus_dB_1 },
Chuck Ebbert b5010d0
+		/* FU, default Mic Playback */
Chuck Ebbert b5010d0
+	{ 14, "Line Playback", .dB = &mp3plus_dB_1 }, /* FU, default Speaker */
Chuck Ebbert b5010d0
 	/* 15: MU */
Chuck Ebbert b5010d0
 	{ 0 } /* terminator */
Chuck Ebbert b5010d0
 };
Chuck Ebbert b5010d0
-- 
Chuck Ebbert b5010d0
1.7.0.1
Chuck Ebbert b5010d0