Commit 20170114 authored by Raymond Toy's avatar Raymond Toy Committed by Commit Bot

Split out sample-accurate processing in AudioDelayDspKernel

To facilitate optimizations for the delay node processing, split out
the sample-accurate path and non-sample-accurate path into independent
bits of code (mostly duplicated now).

Then we can look at optimizing each path independently.

No functional changes.

Bug: 1012198
Change-Id: I6170aaa3a6c0dfc7ecf96c20963a4edcdac8a920
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1856725Reviewed-by: default avatarAndrew MacPherson <andrew.macpherson@soundtrap.com>
Commit-Queue: Raymond Toy <rtoy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#705568}
parent 8371fb91
...@@ -83,52 +83,74 @@ void AudioDelayDSPKernel::Process(const float* source, ...@@ -83,52 +83,74 @@ void AudioDelayDSPKernel::Process(const float* source,
DCHECK(destination); DCHECK(destination);
float sample_rate = this->SampleRate(); float sample_rate = this->SampleRate();
double delay_time = 0;
float* delay_times = delay_times_.Data();
double max_time = MaxDelayTime(); double max_time = MaxDelayTime();
bool sample_accurate = HasSampleAccurateValues(); if (HasSampleAccurateValues()) {
float* delay_times = delay_times_.Data();
if (sample_accurate) {
CalculateSampleAccurateValues(delay_times, frames_to_process); CalculateSampleAccurateValues(delay_times, frames_to_process);
} else {
delay_time = this->DelayTime(sample_rate);
// Make sure the delay time is in a valid range. for (unsigned i = 0; i < frames_to_process; ++i) {
delay_time = clampTo(delay_time, 0.0, max_time); double delay_time = delay_times[i];
}
for (unsigned i = 0; i < frames_to_process; ++i) {
if (sample_accurate) {
delay_time = delay_times[i];
if (std::isnan(delay_time)) if (std::isnan(delay_time))
delay_time = max_time; delay_time = max_time;
else else
delay_time = clampTo(delay_time, 0.0, max_time); delay_time = clampTo(delay_time, 0.0, max_time);
double desired_delay_frames = delay_time * sample_rate;
double read_position =
write_index_ + buffer_length - desired_delay_frames;
if (read_position >= buffer_length)
read_position -= buffer_length;
// Linearly interpolate in-between delay times.
int read_index1 = static_cast<int>(read_position);
int read_index2 = (read_index1 + 1) % buffer_length;
double interpolation_factor = read_position - read_index1;
double input = static_cast<float>(*source++);
buffer[write_index_] = static_cast<float>(input);
write_index_ = (write_index_ + 1) % buffer_length;
double sample1 = buffer[read_index1];
double sample2 = buffer[read_index2];
double output = (1.0 - interpolation_factor) * sample1 +
interpolation_factor * sample2;
*destination++ = static_cast<float>(output);
} }
} else {
double delay_time = this->DelayTime(sample_rate);
double desired_delay_frames = delay_time * sample_rate; // Make sure the delay time is in a valid range.
delay_time = clampTo(delay_time, 0.0, max_time);
double read_position = write_index_ + buffer_length - desired_delay_frames; for (unsigned i = 0; i < frames_to_process; ++i) {
if (read_position >= buffer_length) double desired_delay_frames = delay_time * sample_rate;
read_position -= buffer_length;
// Linearly interpolate in-between delay times. double read_position =
int read_index1 = static_cast<int>(read_position); write_index_ + buffer_length - desired_delay_frames;
int read_index2 = (read_index1 + 1) % buffer_length; if (read_position >= buffer_length)
double interpolation_factor = read_position - read_index1; read_position -= buffer_length;
double input = static_cast<float>(*source++); // Linearly interpolate in-between delay times.
buffer[write_index_] = static_cast<float>(input); int read_index1 = static_cast<int>(read_position);
write_index_ = (write_index_ + 1) % buffer_length; int read_index2 = (read_index1 + 1) % buffer_length;
double interpolation_factor = read_position - read_index1;
double sample1 = buffer[read_index1]; double input = static_cast<float>(*source++);
double sample2 = buffer[read_index2]; buffer[write_index_] = static_cast<float>(input);
write_index_ = (write_index_ + 1) % buffer_length;
double output = double sample1 = buffer[read_index1];
(1.0 - interpolation_factor) * sample1 + interpolation_factor * sample2; double sample2 = buffer[read_index2];
*destination++ = static_cast<float>(output); double output = (1.0 - interpolation_factor) * sample1 +
interpolation_factor * sample2;
*destination++ = static_cast<float>(output);
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment