[alsa-devel] [regression] probably in mixer.c code

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?
Regards, Alexey.

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?
Takashi
--- diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 60f65ac..92feff1 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -765,6 +765,28 @@ static void usb_mixer_elem_free(struct snd_kcontrol *kctl) * interface to ALSA control for feature/mixer units */
+/* convert from USB descriptions to dB scale + * USB descriptions contain the dB scale in 1/256 dB unit + * while ALSA TLV contains in 1/100 dB unit + */ +static int convert_cval_to_dB(struct usb_mixer_elem_info *cval) +{ + cval->dBmin = (convert_signed_value(cval, cval->min) * 100) / 256; + cval->dBmax = (convert_signed_value(cval, cval->max) * 100) / 256; + if (cval->dBmin > cval->dBmax) { + /* something is wrong; assume it's either from/to 0dB */ + if (cval->dBmin < 0) + cval->dBmax = 0; + else if (cval->dBmin > 0) + cval->dBmin = 0; + if (cval->dBmin > cval->dBmax) { + /* totally crap, return an error */ + return -EINVAL; + } + } + return 0; +} + /* * retrieve the minimum and maximum values for the specified control */ @@ -844,24 +866,7 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min) cval->initialized = 1; }
- /* USB descriptions contain the dB scale in 1/256 dB unit - * while ALSA TLV contains in 1/100 dB unit - */ - cval->dBmin = (convert_signed_value(cval, cval->min) * 100) / 256; - cval->dBmax = (convert_signed_value(cval, cval->max) * 100) / 256; - if (cval->dBmin > cval->dBmax) { - /* something is wrong; assume it's either from/to 0dB */ - if (cval->dBmin < 0) - cval->dBmax = 0; - else if (cval->dBmin > 0) - cval->dBmin = 0; - if (cval->dBmin > cval->dBmax) { - /* totally crap, return an error */ - return -EINVAL; - } - } - - return 0; + return convert_cval_to_dB(cval); }
@@ -1134,6 +1139,7 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc, snd_printk(KERN_INFO "set volume quirk for UDA1321/N101 chip\n"); cval->max = -256; + convert_cval_to_dB(cval); } break;
@@ -1144,6 +1150,8 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc, cval->min = 6080; cval->max = 8768; cval->res = 192; + cval->initialized = 1; + convert_cval_to_dB(cval); } break;

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;

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

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.

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

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

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

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

Am 08.11.2011 15:54, schrieb Takashi Iwai:
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?
Yes. Thanks a lot!

At Tue, 08 Nov 2011 17:46:57 +0100, Alexey Fisher wrote:
Am 08.11.2011 15:54, schrieb Takashi Iwai:
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?
Yes. Thanks a lot!
Thanks for a quick test. Now I queued the patch up for the next pull request.
Takashi
participants (2)
-
Alexey Fisher
-
Takashi Iwai