use new CubicInterpolation API
authorPaul Davis <paul@linuxaudiosystems.com>
Mon, 2 Oct 2017 16:43:20 +0000 (12:43 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 2 Oct 2017 16:46:12 +0000 (12:46 -0400)
libs/ardour/disk_io.cc
libs/ardour/disk_reader.cc
libs/ardour/session_process.cc
libs/ardour/session_state.cc

index 7275d5701b5ed46ec45a4e577fc24cb8ddbe22ca..1872c81ea9f3a67096534d09eca578b99be201cd 100644 (file)
@@ -240,7 +240,7 @@ DiskIOProcessor::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_
 {
        while (how_many--) {
                c->push_back (new ChannelInfo (_session.butler()->audio_diskstream_playback_buffer_size()));
-               interpolation.add_channel_to (_session.butler()->audio_diskstream_playback_buffer_size(), speed_buffer_size);
+               interpolation.add_channel ();
                DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: new channel, write space = %2 read = %3\n",
                                                            name(),
                                                            c->back()->buf->write_space(),
@@ -265,7 +265,7 @@ DiskIOProcessor::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t
        while (how_many-- && !c->empty()) {
                delete c->back();
                c->pop_back();
-               interpolation.remove_channel_from ();
+               interpolation.remove_channel ();
        }
 
        return 0;
index 4c5667b9db93f5ea83a64c4ca3e83f4f2d7a706f..9bd433718e05929f880dc63e485542bd50d610f4 100644 (file)
@@ -265,8 +265,7 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
 
        if (speed != 1.0f && speed != -1.0f) {
                interpolation.set_speed (speed);
-               midi_interpolation.set_speed (speed);
-               disk_samples_to_consume = midi_interpolation.distance (nframes);
+               disk_samples_to_consume = interpolation.distance (nframes);
                if (speed < 0.0) {
                        disk_samples_to_consume = -disk_samples_to_consume;
                }
@@ -321,12 +320,19 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
                                disk_signal = output.data ();
                        }
 
-                       if (start_sample < playback_sample) {
-                               cerr << owner()->name() << " SS = " << start_sample << " PS = " << playback_sample << endl;
-                               abort ();
+                       if (speed > 0) {
+                               if (start_sample < playback_sample) {
+                                       cerr << owner()->name() << " SS = " << start_sample << " PS = " << playback_sample << endl;
+                                       abort ();
+                               }
+                       } else if (speed < 0) {
+                               if (playback_sample < start_sample) {
+                                       cerr << owner()->name() << " SS = " << start_sample << " PS = " << playback_sample << " REVERSE" << endl;
+                                       abort ();
+                               }
                        }
 
-                       if (start_sample != playback_sample) {
+                       if ((speed > 0) && (start_sample != playback_sample)) {
                                cerr << owner()->name() << " playback not aligned, jump ahead " << (start_sample - playback_sample) << endl;
 
                                if (can_internal_playback_seek (start_sample - playback_sample)) {
@@ -342,10 +348,9 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
                        if (disk_samples_to_consume <= (samplecnt_t) chaninfo->rw_vector.len[0]) {
 
                                if (fabsf (speed) != 1.0f) {
-                                       (void) interpolation.interpolate (
-                                               n, disk_samples_to_consume,
-                                               chaninfo->rw_vector.buf[0],
-                                               disk_signal);
+                                       samplecnt_t ocnt = nframes;
+                                       samplecnt_t icnt = chaninfo->rw_vector.len[0];
+                                       (void) interpolation.interpolate (n, icnt, chaninfo->rw_vector.buf[0], ocnt, disk_signal);
                                } else if (speed != 0.0) {
                                        memcpy (disk_signal, chaninfo->rw_vector.buf[0], sizeof (Sample) * disk_samples_to_consume);
                                }
@@ -356,18 +361,18 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
 
                                if (disk_samples_to_consume <= total) {
 
-                                       /* We have enough samples, but not in one lump.
-                                        */
-
                                        if (fabsf (speed) != 1.0f) {
-                                               interpolation.interpolate (n, chaninfo->rw_vector.len[0],
-                                                                          chaninfo->rw_vector.buf[0],
-                                                                          disk_signal);
-                                               disk_signal += chaninfo->rw_vector.len[0];
-                                               interpolation.interpolate (n, disk_samples_to_consume - chaninfo->rw_vector.len[0],
-                                                                          chaninfo->rw_vector.buf[1],
-                                                                          disk_signal);
+                                               samplecnt_t ocnt = nframes;
+                                               samplecnt_t icnt = interpolation.interpolate (n, chaninfo->rw_vector.len[0], chaninfo->rw_vector.buf[0], ocnt, disk_signal);
+
+                                               if (ocnt < nframes) {
+                                                       disk_signal += ocnt;
+                                                       ocnt = nframes - ocnt;
+                                                       icnt = interpolation.interpolate (n, chaninfo->rw_vector.len[1], chaninfo->rw_vector.buf[1], ocnt, disk_signal);
+                                               }
+
                                        } else if (speed != 0.0) {
+
                                                memcpy (disk_signal,
                                                        chaninfo->rw_vector.buf[0],
                                                        chaninfo->rw_vector.len[0] * sizeof (Sample));
index 32c8f99734c4baaee98557ab02fb25dd70cee906..d16f7d3b0cad3f6ee12ed624e28e28467f865454 100644 (file)
@@ -436,9 +436,12 @@ Session::process_with_events (pframes_t nframes)
        if (_transport_speed == 1.0) {
                samples_moved = (samplecnt_t) nframes;
        } else {
-               interpolation.set_target_speed (_target_transport_speed);
-               interpolation.set_speed (_transport_speed);
-               samples_moved = (samplecnt_t) interpolation.interpolate (0, nframes, 0, 0);
+               /* use a cubic midi interpolation to compute the number of
+                * samples we will move at the current speed.
+                */
+               CubicInterpolation interp;
+               interp.set_speed (_transport_speed);
+               samples_moved = interp.distance (nframes);
        }
 
        end_sample = _transport_sample + samples_moved;
@@ -887,9 +890,8 @@ Session::process_without_events (pframes_t nframes)
        if (_transport_speed == 1.0) {
                samples_moved = (samplecnt_t) nframes;
        } else {
-               interpolation.set_target_speed (_target_transport_speed);
                interpolation.set_speed (_transport_speed);
-               samples_moved = (samplecnt_t) interpolation.interpolate (0, nframes, 0, 0);
+               samples_moved = interpolation.distance (nframes);
        }
 
        if (!_exporting && !timecode_transmission_suspended()) {
index 5ffc2a8cc7c5703ae60ffd16b00e782c7fde266b..5265e517bd41c955bde4f64025caa3153470a13c 100644 (file)
@@ -184,7 +184,7 @@ Session::pre_engine_init (string fullpath)
        g_atomic_int_set (&_capture_load, 100);
        set_next_event ();
        _all_route_group->set_active (true, this);
-       interpolation.add_channel_to (0, 0);
+       interpolation.add_channel ();
 
        if (config.get_use_video_sync()) {
                waiting_for_sync_offset = true;