From dcbb7f2680a2b8a74691ec0ef1334fb655cf9bf6 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 26 Jun 2008 18:49:02 +0200 Subject: convert to double only once, and make sure we can deal with negative results of -y --- src/pulsecore/time-smoother.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'src/pulsecore/time-smoother.c') diff --git a/src/pulsecore/time-smoother.c b/src/pulsecore/time-smoother.c index 40220ad9..d0231486 100644 --- a/src/pulsecore/time-smoother.c +++ b/src/pulsecore/time-smoother.c @@ -295,24 +295,29 @@ static void estimate(pa_smoother *s, pa_usec_t x, pa_usec_t *y, double *deriv) { *deriv = s->dp; } else { + double tx, ty; /* Ok, we're not yet on track, thus let's interpolate, and * make sure that the first derivative is smooth */ calc_abc(s); + tx = (double) x; + /* Move to origin */ - x -= s->ex; + tx -= (double) s->ex; /* Horner scheme */ - *y = (pa_usec_t) ((double) x * (s->c + (double) x * (s->b + (double) x * s->a))); + ty = (tx * (s->c + tx * (s->b + tx * s->a))); /* Move back from origin */ - *y += s->ey; + ty += (double) s->ey; + + *y = ty >= 0 ? (pa_usec_t) ty : 0; /* Horner scheme */ if (deriv) - *deriv = s->c + ((double) x * (s->b*2 + (double) x * s->a*3)); + *deriv = s->c + (tx * (s->b*2 + tx * s->a*3)); } /* Guarantee monotonicity */ -- cgit