alsamixer: fix calculation in set_normalized_volume (overflow)

Lowering volume below 0 causes overflow spike to 100% volume (volume goes
below 0 and back to 100 repeatedly). 0 overflows past infinity when holding
down z,x,c.

> value = lrint_dir(6000.0 * log10(volume), dir) + max;
   (where volume = 0 , and dir = -1 . min = -9999999 , and max = -6)
> log10(0) is negative infinity = error

Fixes: https://github.com/alsa-project/alsa-utils/pull/266
Reported-by: genr8eofl <genBTC@gmx.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2024-05-23 13:13:42 +02:00
parent cc0bcef813
commit 84d0a91f11

View file

@ -146,6 +146,8 @@ static int set_normalized_volume(snd_mixer_elem_t *elem,
min_norm = pow(10, (min - max) / 6000.0); min_norm = pow(10, (min - max) / 6000.0);
volume = volume * (1 - min_norm) + min_norm; volume = volume * (1 - min_norm) + min_norm;
} }
if (volume <= 0)
volume = 1e-36;
value = lrint_dir(6000.0 * log10(volume), dir) + max; value = lrint_dir(6000.0 * log10(volume), dir) + max;
return set_dB[ctl_dir](elem, channel, value, dir); return set_dB[ctl_dir](elem, channel, value, dir);
} }