]> git.sesse.net Git - nageru/blobdiff - nageru/resampling_queue.cpp
Make it possible to adjust the delay without resetting the resampler.
[nageru] / nageru / resampling_queue.cpp
index 711c1c5239f44aad7df9000711556bc2ff39c2d6..167909d26d4f7f02afd63da999ccbbfe2448705b 100644 (file)
@@ -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<int>(-samples_to_add, buffer.size());
+               buffer.erase(buffer.begin(), buffer.begin() + samples_to_remove);
+               adjustment_samples -= samples_to_remove;
+       }
+       expected_delay = new_delay;
+}