Bug 1265408 - Add buffersAreZero to IIRFilter; r=karlt
MozReview-Commit-ID: CM5x62GMXcj
--- a/dom/media/webaudio/blink/IIRFilter.cpp
+++ b/dom/media/webaudio/blink/IIRFilter.cpp
@@ -124,9 +124,29 @@ void IIRFilter::getFrequencyResponse(int
std::complex<double> numerator = evaluatePolynomial(m_feedforward->Elements(), zRecip, m_feedforward->Length() - 1);
std::complex<double> denominator = evaluatePolynomial(m_feedback->Elements(), zRecip, m_feedback->Length() - 1);
std::complex<double> response = numerator / denominator;
magResponse[k] = static_cast<float>(abs(response));
phaseResponse[k] = static_cast<float>(atan2(imag(response), real(response)));
}
}
+bool IIRFilter::buffersAreZero()
+{
+ double* xBuffer = m_xBuffer.Elements();
+ double* yBuffer = m_yBuffer.Elements();
+
+ for (size_t k = 0; k < m_feedforward->Length(); ++k) {
+ if (xBuffer[(m_bufferIndex - k) & (kBufferLength - 1)] != 0.0) {
+ return false;
+ }
+ }
+
+ for (size_t k = 0; k < m_feedback->Length(); ++k) {
+ if (fabs(yBuffer[(m_bufferIndex - k) & (kBufferLength - 1)]) >= FLT_MIN) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
} // namespace blink
--- a/dom/media/webaudio/blink/IIRFilter.h
+++ b/dom/media/webaudio/blink/IIRFilter.h
@@ -21,16 +21,18 @@ public:
void reset();
void getFrequencyResponse(int nFrequencies,
const float* frequency,
float* magResponse,
float* phaseResponse);
+ bool buffersAreZero();
+
private:
// Filter memory
//
// For simplicity, we assume |m_xBuffer| and |m_yBuffer| have the same length, and the length is
// a power of two. Since the number of coefficients has a fixed upper length, the size of
// xBuffer and yBuffer is fixed. |m_xBuffer| holds the old input values and |m_yBuffer| holds
// the old output values needed to compute the new output value.
//