using namespace std;
using namespace std::chrono;
-ResamplingQueue::ResamplingQueue(unsigned card_num, unsigned freq_in, unsigned freq_out, unsigned num_channels, double expected_delay_seconds)
- : card_num(card_num), freq_in(freq_in), freq_out(freq_out), num_channels(num_channels),
+ResamplingQueue::ResamplingQueue(DeviceSpec device_spec, unsigned freq_in, unsigned freq_out, unsigned num_channels, double expected_delay_seconds)
+ : device_spec(device_spec), freq_in(freq_in), freq_out(freq_out), num_channels(num_channels),
current_estimated_freq_in(freq_in),
ratio(double(freq_out) / double(freq_in)), expected_delay(expected_delay_seconds * OUTPUT_FREQUENCY)
{
a1.good_sample = good_sample;
if (a0.good_sample && a1.good_sample) {
current_estimated_freq_in = (a1.input_samples_received - a0.input_samples_received) / duration<double>(a1.ts - a0.ts).count();
- assert(current_estimated_freq_in >= 0.0);
+ if (!(current_estimated_freq_in >= 0.0)) {
+ fprintf(stderr, "%s: PANIC: Input audio clock going backwards, ignoring.\n",
+ spec_to_string(device_spec).c_str());
+ current_estimated_freq_in = freq_in;
+ }
// Bound the frequency, so that a single wild result won't throw the filter off guard.
current_estimated_freq_in = min(current_estimated_freq_in, 1.2 * freq_in);
// forward, depending on the timing of the calls.
const InputPoint &base_point = a1.good_sample ? a1 : a0;
assert(duration<double>(base_point.ts.time_since_epoch()).count() >= 0.0);
+
+ // NOTE: Due to extrapolation, input_samples_received can
+ // actually go negative here the few first calls (ie., we asked
+ // about a timestamp where we hadn't actually started producing
+ // samples yet), but that is harmless.
const double input_samples_received = base_point.input_samples_received +
current_estimated_freq_in * duration<double>(ts - base_point.ts).count();
- assert(input_samples_received >= 0.0);
// Estimate the number of input samples _consumed_ after we've run the resampler.
const double input_samples_consumed = total_consumed_samples +
if (buffer.empty()) {
// This should never happen unless delay is set way too low,
// or we're dropping a lot of data.
- fprintf(stderr, "Card %u: PANIC: Out of input samples to resample, still need %d output samples! (correction factor is %f)\n",
- card_num, int(vresampler.out_count), rcorr);
+ fprintf(stderr, "%s: PANIC: Out of input samples to resample, still need %d output samples! (correction factor is %f)\n",
+ spec_to_string(device_spec).c_str(), int(vresampler.out_count), rcorr);
memset(vresampler.out_data, 0, vresampler.out_count * num_channels * sizeof(float));
// Reset the loop filter.