Bug 1265408 - Add buffersAreZero to IIRFilter; r=karlt draft
authorDan Minor <dminor@mozilla.com>
Tue, 31 May 2016 09:28:06 -0400
changeset 375223 4dc066366e54ce6100dd2672966f5d61d859b693
parent 375222 eb43277ad4ad17786f64fb5d8a7d80296e0cf3e5
child 375224 07e566f903b8747f97ba15d84662f14e430f546b
push id20195
push userdminor@mozilla.com
push dateFri, 03 Jun 2016 18:18:51 +0000
reviewerskarlt
bugs1265408
milestone49.0a1
Bug 1265408 - Add buffersAreZero to IIRFilter; r=karlt MozReview-Commit-ID: CM5x62GMXcj
dom/media/webaudio/blink/IIRFilter.cpp
dom/media/webaudio/blink/IIRFilter.h
--- 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.
     //