[alsa-devel] HDA: Sound mutes when combination is below -48 dB

Takashi Iwai tiwai at suse.de
Fri Dec 3 16:50:22 CET 2010


At Fri, 03 Dec 2010 16:34:14 +0100,
David Henningsson wrote:
> 
> On 2010-12-03 12:59, Takashi Iwai wrote:
> > At Fri, 03 Dec 2010 12:30:02 +0100,
> > David Henningsson wrote:
> >>
> >> I'm trying to nail down a strange behaviour. I have one "Master" and one
> >> "Speaker" (or "Headphone") volume control, each ranging from -48 dB to 0
> >> dB. Whenever the sum of "Master" and "Speaker" is below -48 dB, the
> >> output mutes. Codec is attached.
> >>
> >> "Master" is a "Virtual master" control, and both "Master" and "Speaker"
> >> control amp-out on nid 0x13. Nid 0x13 does not have amp-out caps, but
> >> the AFG specifies a range of -96 dB to 0 dB in 0.75 dB steps.
> >>
> >> There is some strange things here. First, in
> >> patch_sigmatel:create_controls_idx, there is this comment:
> >>
> >> 		/* if dB scale is over -64dB, and finer enough,
> >> 		 * let's reduce it to half
> >> 		 */
> >> Hmm? Removing half of the volume slider?
> >>
> >> Second, assuming we actually buy this decision, wouldn't it make sense
> >> for people to be able to combine Master and Speaker to get the full -96
> >> to 0 dB range? Instead, "Master" is just working over the range defined
> >> by "Speaker".
> >
> > Well, the problem was fairly old.  You must think of the world before
> > anything dB evaluation was introduced in the mixer apps.  They just
> > took a percentage value, so we got to cut it off to give some "usable"
> > interface for them.
> >
> > The biggest problem right now is that you can't take it back so easily
> > "just for PA".  The PCM softvol is also the same.  There is no perfect
> > solution, and PA isn't by 100% people here.  However, we must not give
> > a regression in 100% manner.
> 
> Ok. I'm not certain I agree, but I see your point.
> 
> >
> > OK, let's back to the bug point...
> >
> >> Third, there is an interesting condition in hda_codec.c:update_amp_value:
> >>
> >> 	if (val>  0)
> >> 		val += ofs;
> >>
> >> Now this is in practice turning all volume controls which have ofs (e g
> >> those being "reduced to half") to a minimum-is-mute error: I can set the
> >> amp value to either 0 (-96 dB) or the 65 - 127 range (~ -48 dB - 0 dB).
> >> So it isn't really mute, it's -96 dB signal, but I can't hear that anyway.
> >
> > OK, this looks really like a bug that the driver gives min-mute flag.
> > The min-mute flag should be given only for the STAC codecs with lower
> > resolution, such as STAC9200.  It seems that STAC925x (and STAC9202)
> > are also in this category, while STAC9205 and other IDT codecs have
> > higher resolutions.
> >
> > Since both STAC9200 and STAC925x have own Master definition, the
> > simplest solution is to remove TLV_DB_SCALE_MUTE for vmaster like
> > below...
> 
> I've tried it, but it doesn't help. Test case is simple: run the codec 
> attached to the previous mail in hda-emu [1]. Then turn "Master" down 
> from 64 to 60, or anything that makes the combination of "Master" and 
> "Speaker" less than -48 dB, and notice that the amp value sent to the 
> codec is 0x0 (i e -96 dB).

Ah, it's vmaster that limits the min/max in the upper layer.
In the current code, 0 is always handled as 0 in update_amp_value(),
so this is the case.

Fixing it would be tricky.  The easiest way is to reduce this cut-off,
but then it will hit too many people.


> [1] If I never thanked you for that program, I do so now, it is a really 
> great tool!

Good to hear :)


thanks,

Takashi


More information about the Alsa-devel mailing list