]> git.sesse.net Git - nageru/blobdiff - nageru/resampling_queue.cpp
When the delay analyzer wants audio from an ALSA card, temporarily auto-enable captur...
[nageru] / nageru / resampling_queue.cpp
index ef7b73511ff596f7e93894fd703038ad370c8841..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) {
@@ -115,7 +115,7 @@ bool ResamplingQueue::get_output_samples(steady_clock::time_point ts, float *sam
                        // 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.
@@ -143,7 +143,7 @@ bool ResamplingQueue::get_output_samples(steady_clock::time_point ts, float *sam
                // (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;
@@ -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;
+}