diff options
| author | Lennart Poettering <lennart@poettering.net> | 2009-04-06 16:38:38 +0200 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2009-04-06 16:38:38 +0200 | 
| commit | 7fc2382a0aaaec70401468940afd266252bda178 (patch) | |
| tree | fd8ff071d051261771d13c708fee81ab0b91221c /src | |
| parent | daa945aa324af5b71332a3cd07890d1cf3a1cb60 (diff) | |
properly handle interpolation when queried x is left of last data position
Diffstat (limited to 'src')
| -rw-r--r-- | src/pulsecore/time-smoother.c | 18 | 
1 files changed, 17 insertions, 1 deletions
| diff --git a/src/pulsecore/time-smoother.c b/src/pulsecore/time-smoother.c index 55ac8687..047ab6ce 100644 --- a/src/pulsecore/time-smoother.c +++ b/src/pulsecore/time-smoother.c @@ -291,7 +291,8 @@ static void estimate(pa_smoother *s, pa_usec_t x, pa_usec_t *y, double *deriv) {      pa_assert(s);      pa_assert(y); -    if (!s->smoothing || x >= s->px) { +    if (x >= s->px) { +        /* Linear interpolation right from px */          int64_t t;          /* The requested point is right of the point where we wanted @@ -307,7 +308,22 @@ static void estimate(pa_smoother *s, pa_usec_t x, pa_usec_t *y, double *deriv) {          if (deriv)              *deriv = s->dp; +    } else if (x <= s->ex) { +        /* Linear interpolation left from ex */ +        int64_t t; + +        t = (int64_t) s->ey - (int64_t) llrint(s->de * (double) (s->ex - x)); + +        if (t < 0) +            t = 0; + +        *y = (pa_usec_t) t; + +        if (deriv) +            *deriv = s->de; +      } else { +        /* Spline interpolation between ex and px */          double tx, ty;          /* Ok, we're not yet on track, thus let's interpolate, and | 
