ALSA: usb-audio - Add volume range check and warn if it too big
authorAlexey Fisher <bug-track@fisher-privat.net>
Thu, 10 Mar 2011 13:53:38 +0000 (14:53 +0100)
committerTakashi Iwai <tiwai@suse.de>
Thu, 10 Mar 2011 15:47:56 +0000 (16:47 +0100)
Signed-off-by: Alexey Fisher <bug-track@fisher-privat.net>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

sound/usb/mixer.c

index 7df89b3..3e3116c 100644 (file)
@@ -987,6 +987,7 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
        struct snd_kcontrol *kctl;
        struct usb_mixer_elem_info *cval;
        const struct usbmix_name_map *map;
+       unsigned int range;
 
        control++; /* change from zero-based to 1-based value */
 
@@ -1136,6 +1137,21 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
 
        }
 
+       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
+        * devices. It will definitively catch all buggy Logitech devices.
+        */
+       if (range > 384) {
+               snd_printk(KERN_WARNING "usb_audio: Warning! Unlikely big "
+                          "volume range (=%u), cval->res is probably wrong.",
+                          range);
+               snd_printk(KERN_WARNING "usb_audio: [%d] FU [%s] ch = %d, "
+                          "val = %d/%d/%d", cval->id,
+                          kctl->id.name, cval->channels,
+                          cval->min, cval->max, cval->res);
+       }
+
        snd_printdd(KERN_INFO "[%d] FU [%s] ch = %d, val = %d/%d/%d\n",
                    cval->id, kctl->id.name, cval->channels, cval->min, cval->max, cval->res);
        add_control_to_empty(state, kctl);