]> code.delx.au - pulseaudio/commitdiff
properly handle interpolation when queried x is left of last data position
authorLennart Poettering <lennart@poettering.net>
Mon, 6 Apr 2009 14:38:38 +0000 (16:38 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 6 Apr 2009 14:38:38 +0000 (16:38 +0200)
src/pulsecore/time-smoother.c

index 55ac8687738a12571a65e67dc8be285ec9441d9c..047ab6ce9e646c79f14046f32aef0e73ef981c68 100644 (file)
@@ -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