X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=resampler.cpp;h=138f837250f154c35b42031654cdc15e8e19b3b0;hb=5c12e871c54ae453cdc2eb81cb437b02c56ebb4b;hp=efa0f178da950680fa55a5c2594b95abc754841c;hpb=1dfcb58d4eda2c5c3ca8283f1467b6100460daed;p=nageru diff --git a/resampler.cpp b/resampler.cpp index efa0f17..138f837 100644 --- a/resampler.cpp +++ b/resampler.cpp @@ -18,8 +18,10 @@ #include "resampler.h" -#include #include +#include +#include +#include #include Resampler::Resampler(unsigned freq_in, unsigned freq_out, unsigned num_channels) @@ -54,7 +56,7 @@ void Resampler::add_input_samples(double pts, const float *samples, ssize_t num_ } } -void Resampler::get_output_samples(double pts, float *samples, ssize_t num_samples) +bool Resampler::get_output_samples(double pts, float *samples, ssize_t num_samples) { double last_output_len; if (first_output) { @@ -87,8 +89,10 @@ void Resampler::get_output_samples(double pts, float *samples, ssize_t num_sampl // Compute loop filter coefficients for the two filters. We need to compute them // every time, since they depend on the number of samples the user asked for. // - // The loop bandwidth starts at 1.0 Hz, then goes down to 0.05 Hz after four seconds. - double loop_bandwidth_hz = (k_a0 < 4 * freq_in) ? 1.0 : 0.05; + // The loop bandwidth is at 0.02 Hz; we trust the initial estimate quite well, + // and our jitter is pretty large since none of the threads involved run at + // real-time priority. + double loop_bandwidth_hz = 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; @@ -114,7 +118,8 @@ void Resampler::get_output_samples(double pts, float *samples, ssize_t num_sampl // or we're dropping a lot of data. fprintf(stderr, "PANIC: Out of input samples to resample, still need %d output samples!\n", int(vresampler.out_count)); - break; + memset(vresampler.out_data, 0, vresampler.out_count * sizeof(float)); + return false; } float inbuf[1024]; @@ -135,4 +140,5 @@ void Resampler::get_output_samples(double pts, float *samples, ssize_t num_sampl total_consumed_samples += consumed_samples; buffer.erase(buffer.begin(), buffer.begin() + consumed_samples * num_channels); } + return true; }