]> nv-tegra.nvidia Code Review - linux-2.6.git/commitdiff
ALSA: usb-audio - Correct bogus volume dB information
authorTakashi Iwai <tiwai@suse.de>
Tue, 16 Jun 2009 12:27:35 +0000 (14:27 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 17 Jun 2009 08:57:02 +0000 (10:57 +0200)
Some USB devices give bogus dB information and it screws up PA.
It's better to detect a broken value and correct it in the driver
before exposing the value to the outside.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/usbmixer.c

index f127bfd97c0793da527fd119387997a1682ed71c..539b427d08c6aca54ff1b0f1393bdbd3f55c6fef 100644 (file)
@@ -470,6 +470,15 @@ static int mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
         */
        scale[2] = (convert_signed_value(cval, cval->min) * 100) / 256;
        scale[3] = (convert_signed_value(cval, cval->max) * 100) / 256;
+       if (scale[3] <= scale[2]) {
+               /* something is wrong; assume it's either from/to 0dB */
+               if (scale[2] < 0)
+                       scale[3] = 0;
+               else if (scale[2] > 0)
+                       scale[2] = 0;
+               else /* totally crap, return an error */
+                       return -EINVAL;
+       }
        if (copy_to_user(_tlv, scale, sizeof(scale)))
                return -EFAULT;
        return 0;