alsamixer: handle out-of-range volume values
authorClemens Ladisch <clemens@ladisch.de>
Mon, 22 Feb 2010 08:42:03 +0000 (09:42 +0100)
committerClemens Ladisch <clemens@ladisch.de>
Mon, 22 Feb 2010 08:42:03 +0000 (09:42 +0100)
Ensure that control volume values are in their allowed range; otherwise,
the displayed values could be outside the range 0..100 and mess up the
layout.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>

alsamixer/mixer_display.c

index 260c9b0..20d6d6a 100644 (file)
@@ -390,6 +390,15 @@ static void display_string_centered_in_control(int y, int col, const char *s, in
        display_string_in_field(y, x, s, width, ALIGN_CENTER);
 }
 
+static long clamp(long value, long min, long max)
+{
+       if (value < min)
+               return min;
+       if (value > max)
+               return max;
+       return value;
+}
+
 static void display_control(unsigned int control_index)
 {
        struct control *control;
@@ -462,8 +471,10 @@ static void display_control(unsigned int control_index)
                        err = snd_mixer_selem_get_capture_volume_range(control->elem, &min, &max);
                if (err < 0)
                        return;
-               if (min == max)
+               if (min >= max)
                        max = min + 1;
+               volumes[0] = clamp(volumes[0], min, max);
+               volumes[1] = clamp(volumes[1], min, max);
 
                if (control->flags & IS_ACTIVE)
                        wattrset(mixer_widget.window, 0);