summaryrefslogtreecommitdiffstats
path: root/sound/usb
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2009-06-16 14:27:35 +0200
committerTakashi Iwai <tiwai@suse.de>2009-06-17 10:57:02 +0200
commiteedbdf03a25ab3b2c332ad7fa205aa8ffbe477ba (patch)
treeeafa68659da3dfa66bd7383f4cea6f48470435c1 /sound/usb
parentb8e1c73f4608b8b9ca1e8f1a09f9fd8684e78071 (diff)
downloadlinux-eedbdf03a25ab3b2c332ad7fa205aa8ffbe477ba.tar.gz
linux-eedbdf03a25ab3b2c332ad7fa205aa8ffbe477ba.tar.bz2
linux-eedbdf03a25ab3b2c332ad7fa205aa8ffbe477ba.zip
ALSA: usb-audio - Correct bogus volume dB information
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>
Diffstat (limited to 'sound/usb')
-rw-r--r--sound/usb/usbmixer.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c
index f127bfd97c07..539b427d08c6 100644
--- a/sound/usb/usbmixer.c
+++ b/sound/usb/usbmixer.c
@@ -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;