|
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 |
|