Index: third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp |
diff --git a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp |
index 22c9d897d99810465b4ad61a4ed96922a3d1530e..9c27d38a878f0101b55878311a927ab82e69fc61 100644 |
--- a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp |
+++ b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp |
@@ -50,6 +50,7 @@ |
#include "modules/webaudio/DelayNode.h" |
#include "modules/webaudio/DynamicsCompressorNode.h" |
#include "modules/webaudio/GainNode.h" |
+#include "modules/webaudio/IIRFilterNode.h" |
#include "modules/webaudio/MediaElementAudioSourceNode.h" |
#include "modules/webaudio/MediaStreamAudioDestinationNode.h" |
#include "modules/webaudio/MediaStreamAudioSourceNode.h" |
@@ -63,6 +64,7 @@ |
#include "modules/webaudio/StereoPannerNode.h" |
#include "modules/webaudio/WaveShaperNode.h" |
#include "platform/ThreadSafeFunctional.h" |
+#include "platform/audio/IIRFilter.h" |
#include "public/platform/Platform.h" |
#include "wtf/text/WTFString.h" |
@@ -590,6 +592,90 @@ PeriodicWave* AbstractAudioContext::createPeriodicWave(DOMFloat32Array* real, DO |
return PeriodicWave::create(sampleRate(), real, imag, isNormalizationDisabled); |
} |
+IIRFilterNode* AbstractAudioContext::createIIRFilter(Vector<double> feedforwardCoef, Vector<double> feedbackCoef, ExceptionState& exceptionState) |
+{ |
+ ASSERT(isMainThread()); |
+ |
+ if (isContextClosed()) { |
+ throwExceptionForClosedState(exceptionState); |
+ return nullptr; |
+ } |
+ |
+ if (feedbackCoef.size() == 0 || (feedbackCoef.size() > IIRFilter::kMaxOrder + 1)) { |
+ exceptionState.throwDOMException( |
+ NotSupportedError, |
+ ExceptionMessages::indexOutsideRange<size_t>( |
+ "number of feedback coefficients", |
+ feedbackCoef.size(), |
+ 1, |
+ ExceptionMessages::InclusiveBound, |
+ IIRFilter::kMaxOrder + 1, |
+ ExceptionMessages::InclusiveBound)); |
+ return nullptr; |
+ } |
+ |
+ if (feedforwardCoef.size() == 0 || (feedforwardCoef.size() > IIRFilter::kMaxOrder + 1)) { |
+ exceptionState.throwDOMException( |
+ NotSupportedError, |
+ ExceptionMessages::indexOutsideRange<size_t>( |
+ "number of feedforward coefficients", |
+ feedforwardCoef.size(), |
+ 1, |
+ ExceptionMessages::InclusiveBound, |
+ IIRFilter::kMaxOrder + 1, |
+ ExceptionMessages::InclusiveBound)); |
+ return nullptr; |
+ } |
+ |
+ if (feedbackCoef[0] == 0) { |
+ exceptionState.throwDOMException( |
+ InvalidStateError, |
+ "First feedback coefficient cannot be zero."); |
+ return nullptr; |
+ } |
+ |
+ bool hasNonZeroCoef = false; |
+ |
+ for (size_t k = 0; k < feedforwardCoef.size(); ++k) { |
+ if (feedforwardCoef[k] != 0) { |
+ hasNonZeroCoef = true; |
+ break; |
+ } |
+ } |
+ |
+ if (!hasNonZeroCoef) { |
+ exceptionState.throwDOMException( |
+ InvalidStateError, |
+ "At least one feedforward coefficient must be non-zero."); |
+ return nullptr; |
+ } |
+ |
+ // Make sure all coefficents are finite. |
+ for (size_t k = 0; k < feedforwardCoef.size(); ++k) { |
+ double c = feedforwardCoef[k]; |
+ if (!std::isfinite(c)) { |
+ String name = "feedforward coefficient " + String::number(k); |
+ exceptionState.throwDOMException( |
+ InvalidStateError, |
+ ExceptionMessages::notAFiniteNumber(c, name.ascii().data())); |
+ return nullptr; |
+ } |
+ } |
+ |
+ for (size_t k = 0; k < feedbackCoef.size(); ++k) { |
+ double c = feedbackCoef[k]; |
+ if (!std::isfinite(c)) { |
+ String name = "feedback coefficient " + String::number(k); |
+ exceptionState.throwDOMException( |
+ InvalidStateError, |
+ ExceptionMessages::notAFiniteNumber(c, name.ascii().data())); |
+ return nullptr; |
+ } |
+ } |
+ |
+ return IIRFilterNode::create(*this, sampleRate(), feedforwardCoef, feedbackCoef); |
+} |
+ |
PeriodicWave* AbstractAudioContext::periodicWave(int type) |
{ |
switch (type) { |