From: qaqland Date: Mon, 15 Sep 2025 06:01:18 +0000 (+0800) Subject: snd_tlv_convert_to_dB: Fix mute handling for MINMAX_MUTE type X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=41039b49ad3e20506134864028c77aeaba4c0d51;p=alsa-lib.git snd_tlv_convert_to_dB: Fix mute handling for MINMAX_MUTE type Ensure the SND_CTL_TLV_DB_GAIN_MUTE value is returned when the calculated gain equals the minimum dB value for the SNDRV_CTL_TLVT_DB_MINMAX_MUTE type. The previous check based solely on the volume value could miss cases where the linear calculation resulted in the minimum gain. Closes: https://github.com/alsa-project/alsa-lib/pull/478 Signed-off-by: qaqland Signed-off-by: Jaroslav Kysela --- diff --git a/src/control/tlv.c b/src/control/tlv.c index cc60703d..271da984 100644 --- a/src/control/tlv.c +++ b/src/control/tlv.c @@ -246,16 +246,17 @@ int snd_tlv_convert_to_dB(unsigned int *tlv, long rangemin, long rangemax, int mindb, maxdb; mindb = tlv[SNDRV_CTL_TLVO_DB_MINMAX_MIN]; maxdb = tlv[SNDRV_CTL_TLVO_DB_MINMAX_MAX]; - if (volume <= rangemin || rangemax <= rangemin) { - if (type == SND_CTL_TLVT_DB_MINMAX_MUTE) - *db_gain = SND_CTL_TLV_DB_GAIN_MUTE; - else - *db_gain = mindb; - } else if (volume >= rangemax) - *db_gain = maxdb; + if (rangemax <= rangemin) + *db_gain = mindb; else *db_gain = (maxdb - mindb) * (volume - rangemin) / (rangemax - rangemin) + mindb; + if (*db_gain < mindb) + *db_gain = mindb; + if (*db_gain > maxdb) + *db_gain = maxdb; + if (type == SND_CTL_TLVT_DB_MINMAX_MUTE && *db_gain == mindb) + *db_gain = SND_CTL_TLV_DB_GAIN_MUTE; return 0; } #ifndef HAVE_SOFT_FLOAT