]> git.alsa-project.org Git - alsa-utils.git/commitdiff
alsamixer: increase step size for big control value ranges
authorClemens Ladisch <clemens@ladisch.de>
Mon, 6 Dec 2010 13:05:10 +0000 (14:05 +0100)
committerClemens Ladisch <clemens@ladisch.de>
Mon, 6 Dec 2010 13:05:10 +0000 (14:05 +0100)
For controls with a big range, stepping through all values can become
tedious and make it impossible to adjust the volume easily.  Therefore,
ensure that all steps are big enough so that the full range has at most
one hundred steps.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
alsamixer/mixer_widget.c

index c8ca156730b9abcce553a4823c1de4e1242aa4ed..adb45684e38d90abd85dadae5352916e50faabe7 100644 (file)
@@ -318,7 +318,7 @@ static void change_volume_to_percent(struct control *control, int value, unsigne
                set_func(control->elem, control->volume_channels[1], min + (max - min) * value / 100);
 }
 
-static void change_volume_relative(struct control *control, int delta, unsigned int channels)
+static void change_volume_relative(struct control *control, long delta, unsigned int channels)
 {
        int (*get_range_func)(snd_mixer_elem_t *, long *, long *);
        int (*get_func)(snd_mixer_elem_t *, snd_mixer_selem_channel_id_t, long *);
@@ -352,6 +352,8 @@ static void change_volume_relative(struct control *control, int delta, unsigned
                if (err < 0)
                        return;
        }
+       if (max - min > 100)
+               delta = (delta * (max - min) + (delta > 0 ? 99 : -99)) / 100;
        if (channels & LEFT) {
                value = left + delta;
                if (value < min)