2011/8/19 Takashi Iwai tiwai@suse.de:
At Fri, 19 Aug 2011 07:53:44 +0200, Takashi Iwai wrote:
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;
I have doubt about this removal of tlv is enough since values of dB scale are calculated from min and max of the control , as dBmin >= dBmax imply min >= max and the control already has a invalid range and unusable