
At Tue, 08 Nov 2011 15:32:10 +0100, Alexey Fisher wrote:
Am 08.11.2011 14:09, schrieb Takashi Iwai:
At Tue, 08 Nov 2011 14:05:32 +0100, Takashi Iwai wrote:
At Tue, 08 Nov 2011 13:39:38 +0100, Alexey Fisher wrote:
Am 08.11.2011 13:11, schrieb Takashi Iwai:
At Tue, 08 Nov 2011 12:25:06 +0100, Alexey Fisher wrote:
Am 08.11.2011 10:59, schrieb Takashi Iwai: > At Tue, 08 Nov 2011 09:49:13 +0100, > Alexey Fisher wrote: >> >> Hallo all, Takashi, >> >> there is one regression in current linux main tree: >> >> cval->res quirks do not work any more. See usb/mixer.c:1150 >> Are there was some work in this area or may be some one bisected this >> bug down? > > Are you referring to the device 046d:09a4, which sets the mixer range > manually? If yes, does the patch below work? >
No, i referring to devices 046d:0991, 046d:081d, i don't have access to 046d:09a4.
This part is broken for me: case USB_ID(0x046d, 0x0991): /* Most audio usb devices lie about volume resolution. * Most Logitech webcams have res = 384. * Proboly there is some logitech magic behind this number --fishor */ if (!strcmp(kctl->id.name, "Mic Capture Volume")) { snd_printk(KERN_INFO "set resolution quirk: cval->res = 384\n"); cval->res = 384; } break;
OK, so _what_ is actually broken? Do you see the message but cval->res is overridden later?
yes.
To which value?
Also you should have got a message like "0:1: cannot get min/max values for ..." when built with CONFIG_SND_DEBUG. Check whether you get it actually.
It sets the res value to 1. I get fallowing message after i plug in the webcam:
[ 132.878150] usb 1-3.2: new high-speed USB device number 8 using ehci_hcd [ 133.087255] usb 1-3.2: New USB device found, idVendor=046d, idProduct=0991 [ 133.087259] usb 1-3.2: New USB device strings: Mfr=0, Product=0, SerialNumber=2 [ 133.087261] usb 1-3.2: SerialNumber: 9671DCEE [ 133.088428] uvcvideo: Found UVC 1.00 device <unnamed> (046d:0991) [ 133.122400] input: UVC Camera (046d:0991) as /devices/pci0000:00/0000:00:1a.7/usb1/1-3/1-3.2/1-3.2:1.0/input/input15 [ 133.488506] ALSA mixer.c:817 5:2: cannot get min/max values for control 2 (id 5) [ 133.488524] ALSA mixer.c:1168 set resolution quirk: cval->res = 384 [ 133.488527] ALSA mixer.c:817 5:2: cannot get min/max values for control 2 (id 5) [ 133.492187] ALSA mixer.c:817 5:2: cannot get min/max values for control 2 (id 5)
With amixer i get this: amixer -c U0x46d0x991 Simple mixer control 'Mic',0 Capabilities: cvolume cvolume-joined cswitch cswitch-joined penum Capture channels: Mono Limits: Capture 0 - 3072 Mono: Capture 2749 [89%] [28.73dB] [on]
But Limits should be 0-7 instead of 0-3072
OK, then the problem is that the first few reads of min/max values failed, but cval->res quirk is applied only for the first read.
Does the patch below fix?
Takashi
--- diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 60f65ac..c5444e0 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -765,10 +765,60 @@ static void usb_mixer_elem_free(struct snd_kcontrol *kctl) * interface to ALSA control for feature/mixer units */
+/* volume control quirks */ +static void volume_control_quirks(struct usb_mixer_elem_info *cval, + struct snd_kcontrol *kctl) +{ + switch (cval->mixer->chip->usb_id) { + case USB_ID(0x0471, 0x0101): + case USB_ID(0x0471, 0x0104): + case USB_ID(0x0471, 0x0105): + case USB_ID(0x0672, 0x1041): + /* quirk for UDA1321/N101. + * note that detection between firmware 2.1.1.7 (N101) + * and later 2.1.1.21 is not very clear from datasheets. + * I hope that the min value is -15360 for newer firmware --jk + */ + if (!strcmp(kctl->id.name, "PCM Playback Volume") && + cval->min == -15616) { + snd_printk(KERN_INFO + "set volume quirk for UDA1321/N101 chip\n"); + cval->max = -256; + } + break; + + case USB_ID(0x046d, 0x09a4): + if (!strcmp(kctl->id.name, "Mic Capture Volume")) { + snd_printk(KERN_INFO + "set volume quirk for QuickCam E3500\n"); + cval->min = 6080; + cval->max = 8768; + cval->res = 192; + } + break; + + case USB_ID(0x046d, 0x0808): + case USB_ID(0x046d, 0x0809): + case USB_ID(0x046d, 0x0991): + /* Most audio usb devices lie about volume resolution. + * Most Logitech webcams have res = 384. + * Proboly there is some logitech magic behind this number --fishor + */ + if (!strcmp(kctl->id.name, "Mic Capture Volume")) { + snd_printk(KERN_INFO + "set resolution quirk: cval->res = 384\n"); + cval->res = 384; + } + break; + + } +} + /* * retrieve the minimum and maximum values for the specified control */ -static int get_min_max(struct usb_mixer_elem_info *cval, int default_min) +static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval, + int default_min, struct snd_kcontrol *kctl) { /* for failsafe */ cval->min = default_min; @@ -844,6 +894,9 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min) cval->initialized = 1; }
+ if (kctl) + volume_control_quirks(cval, kctl); + /* USB descriptions contain the dB scale in 1/256 dB unit * while ALSA TLV contains in 1/100 dB unit */ @@ -864,6 +917,7 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min) return 0; }
+#define get_min_max(cval, def) get_min_max_with_quirks(cval, def, NULL)
/* get a feature/mixer unit info */ static int mixer_ctl_feature_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) @@ -882,7 +936,7 @@ static int mixer_ctl_feature_info(struct snd_kcontrol *kcontrol, struct snd_ctl_ uinfo->value.integer.max = 1; } else { if (!cval->initialized) { - get_min_max(cval, 0); + get_min_max_with_quirks(cval, 0, kcontrol); if (cval->initialized && cval->dBmin >= cval->dBmax) { kcontrol->vd[0].access &= ~(SNDRV_CTL_ELEM_ACCESS_TLV_READ | @@ -1045,9 +1099,6 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc, cval->ch_readonly = readonly_mask; }
- /* get min/max values */ - get_min_max(cval, 0); - /* if all channels in the mask are marked read-only, make the control * read-only. set_cur_mix_value() will check the mask again and won't * issue write commands to read-only channels. */ @@ -1069,6 +1120,9 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc, len = snd_usb_copy_string_desc(state, nameid, kctl->id.name, sizeof(kctl->id.name));
+ /* get min/max values */ + get_min_max_with_quirks(cval, 0, kctl); + switch (control) { case UAC_FU_MUTE: case UAC_FU_VOLUME: @@ -1118,51 +1172,6 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc, break; }
- /* volume control quirks */ - switch (state->chip->usb_id) { - case USB_ID(0x0471, 0x0101): - case USB_ID(0x0471, 0x0104): - case USB_ID(0x0471, 0x0105): - case USB_ID(0x0672, 0x1041): - /* quirk for UDA1321/N101. - * note that detection between firmware 2.1.1.7 (N101) - * and later 2.1.1.21 is not very clear from datasheets. - * I hope that the min value is -15360 for newer firmware --jk - */ - if (!strcmp(kctl->id.name, "PCM Playback Volume") && - cval->min == -15616) { - snd_printk(KERN_INFO - "set volume quirk for UDA1321/N101 chip\n"); - cval->max = -256; - } - break; - - case USB_ID(0x046d, 0x09a4): - if (!strcmp(kctl->id.name, "Mic Capture Volume")) { - snd_printk(KERN_INFO - "set volume quirk for QuickCam E3500\n"); - cval->min = 6080; - cval->max = 8768; - cval->res = 192; - } - break; - - case USB_ID(0x046d, 0x0808): - case USB_ID(0x046d, 0x0809): - case USB_ID(0x046d, 0x0991): - /* Most audio usb devices lie about volume resolution. - * Most Logitech webcams have res = 384. - * Proboly there is some logitech magic behind this number --fishor - */ - if (!strcmp(kctl->id.name, "Mic Capture Volume")) { - snd_printk(KERN_INFO - "set resolution quirk: cval->res = 384\n"); - cval->res = 384; - } - break; - - } - range = (cval->max - cval->min) / cval->res; /* Are there devices with volume range more than 255? I use a bit more * to be sure. 384 is a resolution magic number found on Logitech