diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-06-16 08:27:35 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-06-17 04:57:02 -0400 |
commit | eedbdf03a25ab3b2c332ad7fa205aa8ffbe477ba (patch) | |
tree | eafa68659da3dfa66bd7383f4cea6f48470435c1 | |
parent | b8e1c73f4608b8b9ca1e8f1a09f9fd8684e78071 (diff) |
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>
-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 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, | |||
470 | */ | 470 | */ |
471 | scale[2] = (convert_signed_value(cval, cval->min) * 100) / 256; | 471 | scale[2] = (convert_signed_value(cval, cval->min) * 100) / 256; |
472 | scale[3] = (convert_signed_value(cval, cval->max) * 100) / 256; | 472 | scale[3] = (convert_signed_value(cval, cval->max) * 100) / 256; |
473 | if (scale[3] <= scale[2]) { | ||
474 | /* something is wrong; assume it's either from/to 0dB */ | ||
475 | if (scale[2] < 0) | ||
476 | scale[3] = 0; | ||
477 | else if (scale[2] > 0) | ||
478 | scale[2] = 0; | ||
479 | else /* totally crap, return an error */ | ||
480 | return -EINVAL; | ||
481 | } | ||
473 | if (copy_to_user(_tlv, scale, sizeof(scale))) | 482 | if (copy_to_user(_tlv, scale, sizeof(scale))) |
474 | return -EFAULT; | 483 | return -EFAULT; |
475 | return 0; | 484 | return 0; |