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 dce992d003012f5d41d6429afa6e7242d77fc68b..43a5c47709c94bf8768f4b3425d94532e8b8adf0 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" |
@@ -550,6 +552,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() || (feedbackCoef.size() > IIRFilter::kMaxOrder + 1)) { |
tkent
2016/01/13 03:28:28
nit: You may compare with 0 like |feedbackCoef.siz
Raymond Toy
2016/01/13 18:30:53
Ah, this seems to have changed from the original w
|
+ 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() || (feedforwardCoef.size() > IIRFilter::kMaxOrder + 1)) { |
tkent
2016/01/13 03:28:28
Ditto.
Raymond Toy
2016/01/13 18:30:53
Done.
|
+ 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]) { |
tkent
2016/01/13 03:28:28
Ditto.
Raymond Toy
2016/01/13 18:30:53
Done.
|
+ 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]) { |
tkent
2016/01/13 03:28:28
Ditto.
Raymond Toy
2016/01/13 18:30:53
Done.
|
+ 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); |
+} |
+ |
String AbstractAudioContext::state() const |
{ |
// These strings had better match the strings for AudioContextState in AudioContext.idl. |