void BiquadDSPKernel::getFrequencyResponse(int nFrequencies, const float* frequencyHz, float* magResponse, float* phaseResponse) { bool isGood = nFrequencies > 0 && frequencyHz && magResponse && phaseResponse; ASSERT(isGood); if (!isGood) return; std::vector<float> frequency(nFrequencies); double nyquist = this->nyquist(); // Convert from frequency in Hz to normalized frequency (0 -> 1), // with 1 equal to the Nyquist frequency. for (int k = 0; k < nFrequencies; ++k) frequency[k] = narrowPrecisionToFloat(frequencyHz[k] / nyquist); // We want to get the final values of the coefficients and compute // the response from that instead of some intermediate smoothed // set. Forcefully update the coefficients even if they are not // dirty. updateCoefficientsIfNecessary(false, true); m_biquad.getFrequencyResponse(nFrequencies, &frequency[0], magResponse, phaseResponse); }
void BiquadDSPKernel::process(const float* source, float* destination, size_t framesToProcess) { ASSERT(source && destination && biquadProcessor()); // Recompute filter coefficients if any of the parameters have changed. // FIXME: as an optimization, implement a way that a Biquad object can simply copy its internal filter coefficients from another Biquad object. // Then re-factor this code to only run for the first BiquadDSPKernel of each BiquadProcessor. updateCoefficientsIfNecessary(true, false); m_biquad.process(source, destination, framesToProcess); }
void BiquadDSPKernel::process(const float* source, float* destination, size_t framesToProcess) { ASSERT(source); ASSERT(destination); ASSERT(biquadProcessor()); // Recompute filter coefficients if any of the parameters have changed. // FIXME: as an optimization, implement a way that a Biquad object can simply copy its internal filter coefficients from another Biquad object. // Then re-factor this code to only run for the first BiquadDSPKernel of each BiquadProcessor. // The audio thread can't block on this lock; skip updating the coefficients for this block if // necessary. We'll get them the next time around. { MutexTryLocker tryLocker(m_processLock); if (tryLocker.locked()) updateCoefficientsIfNecessary(); } m_biquad.process(source, destination, framesToProcess); }