spline interpolation: fix crash bugs on negative speed and NULL inputs
authorHans Baier <hansfbaier@googlemail.com>
Wed, 22 Jul 2009 09:27:13 +0000 (09:27 +0000)
committerHans Baier <hansfbaier@googlemail.com>
Wed, 22 Jul 2009 09:27:13 +0000 (09:27 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@5411 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/interpolation.cc
libs/ardour/session_process.cc

index 716ebd4139570f275cd73cce0f379da87e0e5461..e0035ea11b264b0eab23b037a2f71025c74c22fd 100644 (file)
@@ -146,19 +146,22 @@ SplineInterpolation::interpolate (int channel, nframes_t nframes, Sample *input,
     M[0]     = 0.0;
     M[n - 1] = 0.0;
     
-    // solve L * t = d
-    t[0] = 6.0 * (input[0] - 2*input[1] + input[2]); 
-    for (nframes_t i = 1; i <= n - 3; i++) {
-        t[i] = 6.0 * (input[i] - 2*input[i+1] + input[i+2])
-               - l(i-1) * t[i-1];
+    if (input) {
+        // solve L * t = d
+        t[0] = 6.0 * (input[0] - 2*input[1] + input[2]); 
+        for (nframes_t i = 1; i <= n - 3; i++) {
+            t[i] = 6.0 * (input[i] - 2*input[i+1] + input[i+2])
+                   - l(i-1) * t[i-1];
+        }
+        
+        // solve U * M = t
+        M[n-2] = t[n-3] / m(n-3);
+        for (nframes_t i = n-4;; i--) {
+            M[i+1] = (t[i]-M[i+2])/m(i);
+            if ( i == 0 ) break;
+        }
     }
     
-    // solve U * M = t
-    M[n-2] = t[n-3] / m(n-3);
-    for (nframes_t i = n-4;; i--) {
-        M[i+1] = (t[i]-M[i+2])/m(i);
-        if ( i == 0 ) break;
-    }
     assert (M[0] == 0.0 && M[n-1] == 0.0);
     
     // now interpolate
@@ -185,7 +188,7 @@ SplineInterpolation::interpolate (int channel, nframes_t nframes, Sample *input,
         if (x >= 1.0) {
             x = 0.0;
             i++;
-        }
+        } 
         
         assert(x >= 0.0 && x < 1.0);
         
index 8ab43df7212a7568547f253d85ff5889ed258e0e..2dd68744b4266c390e32a6e04a0791bcd5778d73 100644 (file)
@@ -325,8 +325,8 @@ Session::process_with_events (nframes_t nframes)
        if (_transport_speed == 1.0) {
                frames_moved = (long) nframes;
        } else {                
-               interpolation.set_target_speed (_target_transport_speed);
-               interpolation.set_speed (_transport_speed);
+               interpolation.set_target_speed (fabs(_target_transport_speed));
+               interpolation.set_speed (fabs(_transport_speed));
                frames_moved = (long) interpolation.interpolate (0, nframes, 0, 0);
        }
 
@@ -846,8 +846,8 @@ Session::process_without_events (nframes_t nframes)
        if (_transport_speed == 1.0) {
                frames_moved = (long) nframes;
        } else {                
-               interpolation.set_target_speed (_target_transport_speed);
-               interpolation.set_speed (_transport_speed);
+               interpolation.set_target_speed (fabs(_target_transport_speed));
+               interpolation.set_speed (fabs(_transport_speed));
                frames_moved = (long) interpolation.interpolate (0, nframes, 0, 0);
        }