Colin Guthrie wrote:
Hmm, just thinking about this (as I don't know the volume control logic particularly well in PA), the call snd_mixer_selem_set_playback_dB() is used with a dir argument of +1.
From what I understand, this would allow me to say "set the volume to 50dB" and due to the +1 dir, it should select -46.499999 ( because -46.5 mutes it).
In this case however, the value of -99999.999dB is ultimately selected (aka 0).
I'm wondering if the TLV fix actually affects how snd_mixer_selem_set_playback_dB() call works with the dir argument.
Uh, oh. snd_tlv_convert_from_dB() ignores the minimum-is-mute flag. Please try this hack:
--- alsa-lib/src/control/tlv.c +++ alsa-lib/src/control/tlv.c @@ -335,6 +335,9 @@ int snd_tlv_convert_from_dB(unsigned int *tlv, long rangemin, long rangemax, if (xdir > 0) v += (max - min) - 1; v = v / (max - min) + rangemin; + if (v == rangemin && xdir > 0 && (tlv[3] & 0x10000) && + db_gain > SND_CTL_TLV_DB_GAIN_MUTE) + v++; *value = v; } return 0;