OSDN Git Service

control: use more precise rounding in snd_ctl_ascii_value_parse()
authorJaroslav Kysela <perex@perex.cz>
Fri, 5 Jun 2020 11:38:53 +0000 (13:38 +0200)
committerJaroslav Kysela <perex@perex.cz>
Fri, 5 Jun 2020 15:04:18 +0000 (17:04 +0200)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/control/ctlparse.c

index b0bb5ee..1ac31bb 100644 (file)
 
 /* Function to convert from percentage to volume. val = percentage */
 
-#ifdef HAVE_SOFT_FLOAT
-static inline long int convert_prange1(long val, long min, long max)
+static inline long int convert_prange1(long perc, long min, long max)
 {
-       long temp = val * (max - min);
-       return temp / 100 + min + ((temp % 100) == 0 ? 0 : 1);
-}
-#else
+       long tmp;
 
-#define convert_prange1(val, min, max) \
-       ceil((val) * ((max) - (min)) * 0.01 + (min))
+#ifdef HAVE_SOFT_FLOAT
+       tmp = perc * (max - min);
+       tmp = tmp / 100 + ((tmp % 100) < 50 ? 0 : 1);
+#else
+       tmp = rint((double)perc * (double)(max - min) * 0.01);
 #endif
+       if (tmp == 0 && perc > 0)
+               tmp++;
+       return tmp + min;
+}
 
 #define check_range(val, min, max) \
        ((val < min) ? (min) : ((val > max) ? (max) : (val)))