4 #include "ardour/interpolation.h"
6 using namespace ARDOUR;
9 FixedPointLinearInterpolation::interpolate (int channel, nframes_t nframes, Sample *input, Sample *output)
11 // the idea behind phase is that when the speed is not 1.0, we have to
12 // interpolate between samples and then we have to store where we thought we were.
13 // rather than being at sample N or N+1, we were at N+0.8792922
14 // so the "phase" element, if you want to think about this way,
15 // varies from 0 to 1, representing the "offset" between samples
16 uint64_t phase = last_phase[channel];
21 // phi = fixed point speed
22 if (phi != target_phi) {
23 phi_delta = ((int64_t)(target_phi - phi)) / nframes;
28 // index in the input buffers
31 for (nframes_t outsample = 0; outsample < nframes; ++outsample) {
33 Sample fractional_phase_part = (phase & fractional_part_mask) / binary_scaling_factor;
35 if (input && output) {
36 // Linearly interpolate into the output buffer
38 input[i] * (1.0f - fractional_phase_part) +
39 input[i+1] * fractional_phase_part;
42 phase += phi + phi_delta;
45 last_phase[channel] = (phase & fractional_part_mask);
52 FixedPointLinearInterpolation::add_channel_to (int /*input_buffer_size*/, int /*output_buffer_size*/)
54 last_phase.push_back (0);
58 FixedPointLinearInterpolation::remove_channel_from ()
60 last_phase.pop_back ();
64 FixedPointLinearInterpolation::reset()
66 for (size_t i = 0; i <= last_phase.size(); i++) {
73 LinearInterpolation::interpolate (int channel, nframes_t nframes, Sample *input, Sample *output)
75 // index in the input buffers
79 double distance = 0.0;
81 if (_speed != _target_speed) {
82 acceleration = _target_speed - _speed;
87 distance = phase[channel];
88 //printf("processing channel: %d\n", channel);
89 //printf("phase before: %lf\n", phase[channel]);
90 for (nframes_t outsample = 0; outsample < nframes; ++outsample) {
92 Sample fractional_phase_part = distance - i;
93 if (fractional_phase_part >= 1.0) {
94 fractional_phase_part -= 1.0;
97 //printf("I: %u, distance: %lf, fractional_phase_part: %lf\n", i, distance, fractional_phase_part);
99 if (input && output) {
100 // Linearly interpolate into the output buffer
102 input[i] * (1.0f - fractional_phase_part) +
103 input[i+1] * fractional_phase_part;
105 //printf("distance before: %lf\n", distance);
106 distance += _speed + acceleration;
107 //printf("distance after: %lf, _speed: %lf\n", distance, _speed);
110 //printf("before assignment: i: %d, distance: %lf\n", i, distance);
112 //printf("after assignment: i: %d, distance: %16lf\n", i, distance);
113 phase[channel] = distance - floor(distance);
114 //printf("speed: %16lf, i after: %d, distance after: %16lf, phase after: %16lf\n", _speed, i, distance, phase[channel]);
120 LinearInterpolation::add_channel_to (int /*input_buffer_size*/, int /*output_buffer_size*/)
122 phase.push_back (0.0);
126 LinearInterpolation::remove_channel_from ()
133 LinearInterpolation::reset()
135 for (size_t i = 0; i <= phase.size(); i++) {
140 LibSamplerateInterpolation::LibSamplerateInterpolation() : state (0)
145 LibSamplerateInterpolation::~LibSamplerateInterpolation()
147 for (size_t i = 0; i < state.size(); i++) {
148 state[i] = src_delete (state[i]);
153 LibSamplerateInterpolation::set_speed (double new_speed)
156 for (size_t i = 0; i < state.size(); i++) {
157 src_set_ratio (state[i], 1.0/_speed);
162 LibSamplerateInterpolation::reset_state ()
164 printf("INTERPOLATION: reset_state()\n");
165 for (size_t i = 0; i < state.size(); i++) {
167 src_reset (state[i]);
169 state[i] = src_new (SRC_SINC_FASTEST, 1, &error);
175 LibSamplerateInterpolation::add_channel_to (int input_buffer_size, int output_buffer_size)
177 SRC_DATA* newdata = new SRC_DATA;
179 /* Set up sample rate converter info. */
180 newdata->end_of_input = 0 ;
182 newdata->input_frames = input_buffer_size;
183 newdata->output_frames = output_buffer_size;
185 newdata->input_frames_used = 0 ;
186 newdata->output_frames_gen = 0 ;
188 newdata->src_ratio = 1.0/_speed;
190 data.push_back (newdata);
197 LibSamplerateInterpolation::remove_channel_from ()
199 SRC_DATA* d = data.back ();
203 src_delete (state.back ());
210 LibSamplerateInterpolation::interpolate (int channel, nframes_t nframes, Sample *input, Sample *output)
213 printf ("ERROR: trying to interpolate with no channels\n");
217 data[channel]->data_in = input;
218 data[channel]->data_out = output;
220 data[channel]->input_frames = nframes * _speed;
221 data[channel]->output_frames = nframes;
222 data[channel]->src_ratio = 1.0/_speed;
224 if ((error = src_process (state[channel], data[channel]))) {
225 printf ("\nError : %s\n\n", src_strerror (error));
229 //printf("INTERPOLATION: channel %d input_frames_used: %d\n", channel, data[channel]->input_frames_used);
231 return data[channel]->input_frames_used;