diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-06-16 14:27:35 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-06-17 10:57:02 +0200 |
commit | eedbdf03a25ab3b2c332ad7fa205aa8ffbe477ba (patch) | |
tree | eafa68659da3dfa66bd7383f4cea6f48470435c1 /sound | |
parent | b8e1c73f4608b8b9ca1e8f1a09f9fd8684e78071 (diff) | |
download | op-kernel-dev-eedbdf03a25ab3b2c332ad7fa205aa8ffbe477ba.zip op-kernel-dev-eedbdf03a25ab3b2c332ad7fa205aa8ffbe477ba.tar.gz |
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')
-rw-r--r-- | sound/usb/usbmixer.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c index f127bfd..539b427 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; |