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) {
}
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;
+}