* [regression] probably in mixer.c code
@ 2011-11-08 8:49 Alexey Fisher
2011-11-08 9:59 ` Takashi Iwai
0 siblings, 1 reply; 11+ messages in thread
From: Alexey Fisher @ 2011-11-08 8:49 UTC (permalink / raw)
To: alsa-devel, tiwai
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.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [regression] probably in mixer.c code
2011-11-08 8:49 [regression] probably in mixer.c code Alexey Fisher
@ 2011-11-08 9:59 ` Takashi Iwai
2011-11-08 11:25 ` Alexey Fisher
0 siblings, 1 reply; 11+ messages in thread
From: Takashi Iwai @ 2011-11-08 9:59 UTC (permalink / raw)
To: Alexey Fisher; +Cc: alsa-devel
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;
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [regression] probably in mixer.c code
2011-11-08 9:59 ` Takashi Iwai
@ 2011-11-08 11:25 ` Alexey Fisher
2011-11-08 12:11 ` Takashi Iwai
0 siblings, 1 reply; 11+ messages in thread
From: Alexey Fisher @ 2011-11-08 11:25 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel
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;
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [regression] probably in mixer.c code
2011-11-08 11:25 ` Alexey Fisher
@ 2011-11-08 12:11 ` Takashi Iwai
2011-11-08 12:39 ` Alexey Fisher
0 siblings, 1 reply; 11+ messages in thread
From: Takashi Iwai @ 2011-11-08 12:11 UTC (permalink / raw)
To: Alexey Fisher; +Cc: alsa-devel
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
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [regression] probably in mixer.c code
2011-11-08 12:11 ` Takashi Iwai
@ 2011-11-08 12:39 ` Alexey Fisher
2011-11-08 13:05 ` Takashi Iwai
0 siblings, 1 reply; 11+ messages in thread
From: Alexey Fisher @ 2011-11-08 12:39 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel
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.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [regression] probably in mixer.c code
2011-11-08 12:39 ` Alexey Fisher
@ 2011-11-08 13:05 ` Takashi Iwai
2011-11-08 13:09 ` Takashi Iwai
0 siblings, 1 reply; 11+ messages in thread
From: Takashi Iwai @ 2011-11-08 13:05 UTC (permalink / raw)
To: Alexey Fisher; +Cc: alsa-devel
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
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [regression] probably in mixer.c code
2011-11-08 13:05 ` Takashi Iwai
@ 2011-11-08 13:09 ` Takashi Iwai
2011-11-08 14:32 ` Alexey Fisher
0 siblings, 1 reply; 11+ messages in thread
From: Takashi Iwai @ 2011-11-08 13:09 UTC (permalink / raw)
To: Alexey Fisher; +Cc: alsa-devel
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
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [regression] probably in mixer.c code
2011-11-08 13:09 ` Takashi Iwai
@ 2011-11-08 14:32 ` Alexey Fisher
2011-11-08 14:54 ` Takashi Iwai
0 siblings, 1 reply; 11+ messages in thread
From: Alexey Fisher @ 2011-11-08 14:32 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel
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
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [regression] probably in mixer.c code
2011-11-08 14:32 ` Alexey Fisher
@ 2011-11-08 14:54 ` Takashi Iwai
2011-11-08 16:46 ` Alexey Fisher
0 siblings, 1 reply; 11+ messages in thread
From: Takashi Iwai @ 2011-11-08 14:54 UTC (permalink / raw)
To: Alexey Fisher; +Cc: alsa-devel
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
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [regression] probably in mixer.c code
2011-11-08 14:54 ` Takashi Iwai
@ 2011-11-08 16:46 ` Alexey Fisher
2011-11-08 16:55 ` Takashi Iwai
0 siblings, 1 reply; 11+ messages in thread
From: Alexey Fisher @ 2011-11-08 16:46 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel
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!
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [regression] probably in mixer.c code
2011-11-08 16:46 ` Alexey Fisher
@ 2011-11-08 16:55 ` Takashi Iwai
0 siblings, 0 replies; 11+ messages in thread
From: Takashi Iwai @ 2011-11-08 16:55 UTC (permalink / raw)
To: Alexey Fisher; +Cc: alsa-devel
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
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2011-11-08 16:55 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-08 8:49 [regression] probably in mixer.c code Alexey Fisher
2011-11-08 9:59 ` Takashi Iwai
2011-11-08 11:25 ` Alexey Fisher
2011-11-08 12:11 ` Takashi Iwai
2011-11-08 12:39 ` Alexey Fisher
2011-11-08 13:05 ` Takashi Iwai
2011-11-08 13:09 ` Takashi Iwai
2011-11-08 14:32 ` Alexey Fisher
2011-11-08 14:54 ` Takashi Iwai
2011-11-08 16:46 ` Alexey Fisher
2011-11-08 16:55 ` Takashi Iwai
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.