const double input_samples_consumed = total_consumed_samples +
num_samples / (ratio * rcorr);
- double actual_delay = input_samples_received - input_samples_consumed;
+ double actual_delay = input_samples_received - input_samples_consumed + adjustment_samples;
actual_delay += vresampler.inpdist(); // Delay in the resampler itself.
double err = actual_delay - expected_delay;
if (first_output) {
// so that we don't need a long period to stabilize at the beginning.
if (err < 0.0) {
int delay_samples_to_add = lrintf(-err);
- for (ssize_t i = 0; i < delay_samples_to_add * num_channels; ++i) {
+ for (ssize_t i = 0; i < delay_samples_to_add * int(num_channels); ++i) {
buffer.push_front(0.0f);
}
total_consumed_samples -= delay_samples_to_add; // Equivalent to increasing input_samples_received on a0 and a1.
// (we start ResamplingQueues also when we e.g. switch sound sources),
// but in general, a little bit of increased timing jitter is acceptable
// right after a setup change like this.
- double loop_bandwidth_hz = (total_consumed_samples < 4 * freq_in) ? 0.2 : 0.02;
+ double loop_bandwidth_hz = (total_consumed_samples < 4 * int(freq_in)) ? 0.2 : 0.02;
// Set filters. The first filter much wider than the first one (20x as wide).
double w = (2.0 * M_PI) * loop_bandwidth_hz * num_samples / freq_out;
}
return true;
}
+
+void ResamplingQueue::change_expected_delay(double expected_delay_seconds)
+{
+ double new_delay = expected_delay_seconds * OUTPUT_FREQUENCY;
+
+ if (a1.input_samples_received == 0) {
+ // Before the first block, so no need to adjust the queue.
+ expected_delay = new_delay;
+ return;
+ }
+
+ int samples_to_add = lrint(new_delay - expected_delay);
+ if (samples_to_add > 0) {
+ adjustment_samples += samples_to_add;
+ buffer.insert(buffer.end(), samples_to_add, 0.0f);
+ } else if (samples_to_add < 0) {
+ int samples_to_remove = min<int>(-samples_to_add, buffer.size());
+ buffer.erase(buffer.begin(), buffer.begin() + samples_to_remove);
+ adjustment_samples -= samples_to_remove;
+ }
+ expected_delay = new_delay;
+}