From 3f48d00081aa2f34e42d4219c01757b6f27392e3 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 2 Oct 2017 12:43:20 -0400 Subject: use new CubicInterpolation API --- libs/ardour/disk_io.cc | 4 ++-- libs/ardour/disk_reader.cc | 45 +++++++++++++++++++++++------------------- libs/ardour/session_process.cc | 12 ++++++----- libs/ardour/session_state.cc | 2 +- 4 files changed, 35 insertions(+), 28 deletions(-) (limited to 'libs') diff --git a/libs/ardour/disk_io.cc b/libs/ardour/disk_io.cc index 7275d5701b..1872c81ea9 100644 --- a/libs/ardour/disk_io.cc +++ b/libs/ardour/disk_io.cc @@ -240,7 +240,7 @@ DiskIOProcessor::add_channel_to (boost::shared_ptr 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 c, uint32_t while (how_many-- && !c->empty()) { delete c->back(); c->pop_back(); - interpolation.remove_channel_from (); + interpolation.remove_channel (); } return 0; diff --git a/libs/ardour/disk_reader.cc b/libs/ardour/disk_reader.cc index 4c5667b9db..9bd433718e 100644 --- a/libs/ardour/disk_reader.cc +++ b/libs/ardour/disk_reader.cc @@ -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)); diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 32c8f99734..d16f7d3b0c 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -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()) { diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 5ffc2a8cc7..5265e517bd 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -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; -- cgit v1.2.3