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>
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