[alsa-devel] [regression] probably in mixer.c code
Takashi Iwai
tiwai at suse.de
Tue Nov 8 10:59:01 CET 2011
At Tue, 08 Nov 2011 09:49:13 +0100,
Alexey Fisher wrote:
>
> Hallo all, Takashi,
>
> there is one regression in current linux main tree:
>
> cval->res quirks do not work any more. See usb/mixer.c:1150
> Are there was some work in this area or may be some one bisected this
> bug down?
Are you referring to the device 046d:09a4, which sets the mixer range
manually? If yes, does the patch below work?
Takashi
---
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
index 60f65ac..92feff1 100644
--- a/sound/usb/mixer.c
+++ b/sound/usb/mixer.c
@@ -765,6 +765,28 @@ static void usb_mixer_elem_free(struct snd_kcontrol *kctl)
* interface to ALSA control for feature/mixer units
*/
+/* convert from USB descriptions to dB scale
+ * USB descriptions contain the dB scale in 1/256 dB unit
+ * while ALSA TLV contains in 1/100 dB unit
+ */
+static int convert_cval_to_dB(struct usb_mixer_elem_info *cval)
+{
+ cval->dBmin = (convert_signed_value(cval, cval->min) * 100) / 256;
+ cval->dBmax = (convert_signed_value(cval, cval->max) * 100) / 256;
+ if (cval->dBmin > cval->dBmax) {
+ /* something is wrong; assume it's either from/to 0dB */
+ if (cval->dBmin < 0)
+ cval->dBmax = 0;
+ else if (cval->dBmin > 0)
+ cval->dBmin = 0;
+ if (cval->dBmin > cval->dBmax) {
+ /* totally crap, return an error */
+ return -EINVAL;
+ }
+ }
+ return 0;
+}
+
/*
* retrieve the minimum and maximum values for the specified control
*/
@@ -844,24 +866,7 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min)
cval->initialized = 1;
}
- /* USB descriptions contain the dB scale in 1/256 dB unit
- * while ALSA TLV contains in 1/100 dB unit
- */
- cval->dBmin = (convert_signed_value(cval, cval->min) * 100) / 256;
- cval->dBmax = (convert_signed_value(cval, cval->max) * 100) / 256;
- if (cval->dBmin > cval->dBmax) {
- /* something is wrong; assume it's either from/to 0dB */
- if (cval->dBmin < 0)
- cval->dBmax = 0;
- else if (cval->dBmin > 0)
- cval->dBmin = 0;
- if (cval->dBmin > cval->dBmax) {
- /* totally crap, return an error */
- return -EINVAL;
- }
- }
-
- return 0;
+ return convert_cval_to_dB(cval);
}
@@ -1134,6 +1139,7 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
snd_printk(KERN_INFO
"set volume quirk for UDA1321/N101 chip\n");
cval->max = -256;
+ convert_cval_to_dB(cval);
}
break;
@@ -1144,6 +1150,8 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
cval->min = 6080;
cval->max = 8768;
cval->res = 192;
+ cval->initialized = 1;
+ convert_cval_to_dB(cval);
}
break;
More information about the Alsa-devel
mailing list