At Fri, 19 Aug 2011 07:53:44 +0200, Takashi Iwai wrote:
At Fri, 19 Aug 2011 06:55:54 +0800, Raymond Yau wrote:
2011/8/18 Takashi Iwai tiwai@suse.de:
At Tue, 16 Aug 2011 13:31:52 +0100, Colin Guthrie wrote:
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index c04d7c7..cdd19d7 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -152,6 +152,7 @@ static inline void check_mapped_dB(const struct usbmix_name_map *p, if (p && p->dB) { cval->dBmin = p->dB->min; cval->dBmax = p->dB->max;
- cval->initialized = 1;
} }
@@ -1092,7 +1093,7 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc, " Switch" : " Volume"); if (control == UAC_FU_VOLUME) { check_mapped_dB(map, cval);
- if (cval->dBmin < cval->dBmax) {
- if (cval->dBmin < cval->dBmax || !cval->initialized) {
kctl->tlv.c = mixer_vol_tlv; kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ |
Not had a chance to test this yet but I will when I get a moment.
Any chance to test the patch?
The patch seem fix the no dB scale problem , however the broken dB test which you added seem redundant as cval->dBmin and cval->dBmax are still zero because error in get_min_max() at build_feature_ctl() and it seem that the valid dBmin and dBMax are calculated by get_min_max() at mixer_ctl_feature_info() on my usb logitech web cam
Yeah, that's a known problem. The dB-test is missing when reading dB failed at probing time and later it gives a wrong value.
We can add another dB-test later, and remove TLV bit from kcontrol.access on the fly. But for that, we'd need to notify via SNDRV_CTL_EVENT_MASK_INFO, too.
I meant something like below.
Takashi
--- diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index cdd19d7..78a5abd 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -881,8 +881,17 @@ static int mixer_ctl_feature_info(struct snd_kcontrol *kcontrol, struct snd_ctl_ uinfo->value.integer.min = 0; uinfo->value.integer.max = 1; } else { - if (! cval->initialized) - get_min_max(cval, 0); + if (!cval->initialized) { + get_min_max(cval, 0); + if (cval->initialized && cval->dBmin >= cval->dBmax) { + kcontrol->vd[0].access &= + ~(SNDRV_CTL_ELEM_ACCESS_TLV_READ | + SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK); + snd_ctl_notify(cval->mixer->chip->card, + SNDRV_CTL_EVENT_MASK_INFO, + &kcontrol->id); + } + } uinfo->value.integer.min = 0; uinfo->value.integer.max = (cval->max - cval->min + cval->res - 1) / cval->res;