]> git.alsa-project.org Git - alsa-lib.git/commitdiff
snd_tlv_convert_to_dB: Fix mute handling for MINMAX_MUTE type
authorqaqland <anguoli@uniontech.com>
Mon, 15 Sep 2025 06:01:18 +0000 (14:01 +0800)
committerJaroslav Kysela <perex@perex.cz>
Fri, 7 Nov 2025 20:56:41 +0000 (21:56 +0100)
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 <anguoli@uniontech.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/control/tlv.c

index cc60703daf335f2f3f1fccb149c4d1eeef4b4fc1..271da984e558ba18633410c34325df860a6d9353 100644 (file)
@@ -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