]> git.alsa-project.org Git - alsa-utils.git/commitdiff
alsamixer: fix calculation in set_normalized_volume (overflow)
authorJaroslav Kysela <perex@perex.cz>
Thu, 23 May 2024 11:13:42 +0000 (13:13 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 23 May 2024 11:14:20 +0000 (13:14 +0200)
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>
alsamixer/volume_mapping.c

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