Some improvements to performance with crossfades: don't recompute a whole track's...
[ardour.git] / libs / ardour / session_process.cc
index eb192f6dc90fb0f60ca06853bc212309df6523dd..2dd68744b4266c390e32a6e04a0791bcd5778d73 100644 (file)
@@ -322,14 +322,12 @@ Session::process_with_events (nframes_t nframes)
                return;
        }
 
-       /// TODO: Figure out what happens to phi and phase, if transport speed momentarily becomes
-       /// 1.0 eg. during the adjustments of a slave. If that is a bug, then AudioDiskstream::process
-       /// is very likely broken too
        if (_transport_speed == 1.0) {
                frames_moved = (long) nframes;
        } else {                
-               frames_moved = (long) AudioDiskstream::
-                       calculate_varispeed_playback_distance(nframes, phase, phi, target_phi); 
+               interpolation.set_target_speed (fabs(_target_transport_speed));
+               interpolation.set_speed (fabs(_transport_speed));
+               frames_moved = (long) interpolation.interpolate (0, nframes, 0, 0);
        }
 
        end_frame = _transport_frame + (nframes_t)frames_moved;
@@ -385,6 +383,7 @@ Session::process_with_events (nframes_t nframes)
                while (nframes) {
 
                        this_nframes = nframes; /* real (jack) time relative */
+                       frames_moved = (long) floor (_transport_speed * nframes); /* transport relative */
 
                        /* running an event, position transport precisely to its time */
                        if (this_event && this_event->action_frame <= end_frame && this_event->action_frame >= _transport_frame) {
@@ -508,7 +507,7 @@ Session::follow_slave (nframes_t nframes)
                slave_speed = 0.0f;
        }
 
-       if (_slave->is_always_synced() || Config->get_timecode_source_is_synced()) {
+       if (_slave->is_always_synced() || config.get_timecode_source_is_synced()) {
 
                /* if the TC source is synced, then we assume that its 
                   speed is binary: 0.0 or 1.0
@@ -530,7 +529,7 @@ Session::follow_slave (nframes_t nframes)
        
        track_slave_state(slave_speed, slave_transport_frame, this_delta, starting);
 
-       if (slave_state == Running && !_slave->is_always_synced() && !Config->get_timecode_source_is_synced()) {
+       if (slave_state == Running && !_slave->is_always_synced() && !config.get_timecode_source_is_synced()) {
 
                if (_transport_speed != 0.0f) {
                        
@@ -844,14 +843,12 @@ Session::process_without_events (nframes_t nframes)
 
        prepare_diskstreams ();
        
-       /// TODO: Figure out what happens to phi and phase, if transport speed momentarily becomes
-       /// 1.0 eg. during the adjustments of a slave. If that is a bug, then AudioDiskstream::process
-       /// is very likely broken too
        if (_transport_speed == 1.0) {
                frames_moved = (long) nframes;
        } else {                
-               frames_moved = (long) AudioDiskstream::
-                       calculate_varispeed_playback_distance(nframes, phase, phi, target_phi); 
+               interpolation.set_target_speed (fabs(_target_transport_speed));
+               interpolation.set_speed (fabs(_transport_speed));
+               frames_moved = (long) interpolation.interpolate (0, nframes, 0, 0);
        }
 
        if (process_routes (nframes)) {