X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=resampling_queue.cpp;h=a1a2395533ae168abf1efe2a737cf710a9722e0a;hb=4a0187ffb4075b4d217b8d9e9c96cac548b199d8;hp=df0c335447d7fad746be1fbb176be6716cbe4590;hpb=1f1e960da00f1adf70a57dd9337e5a62c4ef9e97;p=nageru diff --git a/resampling_queue.cpp b/resampling_queue.cpp index df0c335..a1a2395 100644 --- a/resampling_queue.cpp +++ b/resampling_queue.cpp @@ -30,8 +30,8 @@ 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) { @@ -91,9 +91,13 @@ bool ResamplingQueue::get_output_samples(steady_clock::time_point ts, float *sam // forward, depending on the timing of the calls. const InputPoint &base_point = a1.good_sample ? a1 : a0; assert(duration(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(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 + @@ -161,8 +165,8 @@ bool ResamplingQueue::get_output_samples(steady_clock::time_point ts, float *sam 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.