X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fresampling_queue.cpp;fp=nageru%2Fresampling_queue.cpp;h=167909d26d4f7f02afd63da999ccbbfe2448705b;hb=5b1f88aa6f4e44f497e951f572a0fe2987389330;hp=711c1c5239f44aad7df9000711556bc2ff39c2d6;hpb=ee730b45534f03e407c287fc1ee9da7d92d46454;p=nageru diff --git a/nageru/resampling_queue.cpp b/nageru/resampling_queue.cpp index 711c1c5..167909d 100644 --- a/nageru/resampling_queue.cpp +++ b/nageru/resampling_queue.cpp @@ -107,7 +107,7 @@ bool ResamplingQueue::get_output_samples(steady_clock::time_point ts, float *sam 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) { @@ -198,3 +198,25 @@ bool ResamplingQueue::get_output_samples(steady_clock::time_point ts, float *sam } 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(-samples_to_add, buffer.size()); + buffer.erase(buffer.begin(), buffer.begin() + samples_to_remove); + adjustment_samples -= samples_to_remove; + } + expected_delay = new_delay; +}