From d39f5acd9b4fd77c98dfdeb0aab18a91824a228a Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Fri, 5 Jun 2020 13:38:53 +0200 Subject: [PATCH] control: use more precise rounding in snd_ctl_ascii_value_parse() Signed-off-by: Jaroslav Kysela --- src/control/ctlparse.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/control/ctlparse.c b/src/control/ctlparse.c index b0bb5ee3..1ac31bb9 100644 --- a/src/control/ctlparse.c +++ b/src/control/ctlparse.c @@ -33,17 +33,20 @@ /* 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))) -- 2.47.1