Revert "snd_tlv_convert_to_dB: Fix mute handling for MINMAX_MUTE type"
Some checks failed
Build alsa-lib / fedora_latest_build (push) Has been cancelled
Build alsa-lib / ubuntu_last_build (push) Has been cancelled

This reverts commit 41039b49ad.

SND_CTL_TLVT_DB_MINMAX_MUTE means that the hardware is muted on lowest
hardware volume value (not on lowest dB value).

Analysis:

Range:  min=0, max=7248
dB:     min=-2837, max=-6
dB span: 2831 centibels (28.31 dB)

Volume | After revert/origin | PR#478 behavior
-------|---------------------|----------------------
     0 |  MUTE               | MUTE
     1 |  -2837 (-28.37 dB)  | MUTE <- DIFFERS!
     2 |  -2837 (-28.37 dB)  | MUTE <- DIFFERS!
     5 |  -2836 (-28.36 dB)  |  -2836 (-28.36 dB)
    10 |  -2834 (-28.34 dB)  |  -2834 (-28.34 dB)
    50 |  -2818 (-28.18 dB)  |  -2818 (-28.18 dB)

Range:  min=0, max=999
dB:     min=0, max=390
dB span: 390 centibels (3.90 dB)

Volume | After revert/origin | PR#478 behavior
-------|---------------------|----------------------
     0 | MUTE                | MUTE
     1 |      0 (0.00 dB)    | MUTE <- DIFFERS!
     2 |      0 (0.00 dB)    | MUTE <- DIFFERS!
     5 |      1 (0.01 dB)    |      1 (0.01 dB)
    10 |      3 (0.03 dB)    |      3 (0.03 dB)
    50 |     19 (0.19 dB)    |     19 (0.19 dB)

Fixes: https://github.com/alsa-project/alsa-lib/issues/504
Link: https://github.com/alsa-project/alsa-lib/pull/478
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2026-05-01 07:39:58 +02:00
parent 62c24074ae
commit 96f23dda14

View file

@ -246,17 +246,16 @@ 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 (rangemax <= rangemin)
*db_gain = mindb;
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;
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