AudioContext createChannelMerger() method should have optional argument for number of inputs.
https://bugs.webkit.org/show_bug.cgi?id=83759
Patch by Raymond Liu <raymond.liu@intel.com> on 2012-04-13
Reviewed by Chris Rogers.
Check https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html for the optional argument.
Source/WebCore:
Test: webaudio/audiochannelmerger-basic.html
* Modules/webaudio/AudioChannelMerger.cpp:
(WebCore):
(WebCore::AudioChannelMerger::create):
(WebCore::AudioChannelMerger::AudioChannelMerger):
* Modules/webaudio/AudioChannelMerger.h:
(AudioChannelMerger):
* Modules/webaudio/AudioContext.cpp:
(WebCore::AudioContext::createChannelMerger):
(WebCore):
* Modules/webaudio/AudioContext.h:
(AudioContext):
* Modules/webaudio/AudioContext.idl:
LayoutTests:
* webaudio/audiochannelmerger-basic-expected.txt: Added.
* webaudio/audiochannelmerger-basic.html: Added.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@114193 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 0bd6544..302b96a 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,15 @@
+2012-04-13 Raymond Liu <raymond.liu@intel.com>
+
+ AudioContext createChannelMerger() method should have optional argument for number of inputs.
+ https://bugs.webkit.org/show_bug.cgi?id=83759
+
+ Reviewed by Chris Rogers.
+
+ Check https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html for the optional argument.
+
+ * webaudio/audiochannelmerger-basic-expected.txt: Added.
+ * webaudio/audiochannelmerger-basic.html: Added.
+
2012-04-13 Mihnea Ovidenie <mihnea@adobe.com>
[CSSRegions]Implement NamedFlow::contentNodes attribute
diff --git a/LayoutTests/webaudio/audiochannelmerger-basic-expected.txt b/LayoutTests/webaudio/audiochannelmerger-basic-expected.txt
new file mode 100644
index 0000000..5a6a16d
--- /dev/null
+++ b/LayoutTests/webaudio/audiochannelmerger-basic-expected.txt
@@ -0,0 +1,12 @@
+Basic tests for AudioChannelMerger.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS Exception was thrown for numberOfInputs <= 0.
+PASS Exception was thrown for numberOfInputs >= 32.
+PASS AudioChannelMerger created successfully with numberOfInputs = 32.
+PASS AudioChannelMerger created successfully with empty parameter.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/webaudio/audiochannelmerger-basic.html b/LayoutTests/webaudio/audiochannelmerger-basic.html
new file mode 100644
index 0000000..4f6061f
--- /dev/null
+++ b/LayoutTests/webaudio/audiochannelmerger-basic.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+<script src="../fast/js/resources/js-test-pre.js"></script>
+</head>
+
+<body>
+
+<div id="description"></div>
+<div id="console"></div>
+
+<script>
+description("Basic tests for AudioChannelMerger.");
+
+function runTest() {
+ if (window.layoutTestController) {
+ layoutTestController.dumpAsText();
+ layoutTestController.waitUntilDone();
+ }
+
+ window.jsTestIsAsync = true;
+
+ var context = new webkitAudioContext();
+
+ try {
+ var mergernode = context.createChannelMerger(0);
+ testFailed("Exception should be thrown for numberOfInputs <= 0.");
+ } catch(e) {
+ testPassed("Exception was thrown for numberOfInputs <= 0.");
+ }
+
+ try {
+ var mergernode = context.createChannelMerger(33);
+ testFailed("Exception should be thrown for numberOfInputs >= 32.");
+ } catch(e) {
+ testPassed("Exception was thrown for numberOfInputs >= 32.");
+ }
+
+ try {
+ var mergernode = context.createChannelMerger(32);
+ testPassed("AudioChannelMerger created successfully with numberOfInputs = 32.");
+ } catch(e) {
+ testFailed("Failed to create AudioChannelMerger with numberOfInputs = 32.");
+ }
+
+ try {
+ var mergernode = context.createChannelMerger();
+ testPassed("AudioChannelMerger created successfully with empty parameter.");
+ } catch(e) {
+ testFailed("Failed to create AudioChannelMerger with empty parameter.");
+ }
+
+ finishJSTest();
+}
+
+runTest();
+
+</script>
+
+<script src="../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 6e0d56c..739b6ac 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,27 @@
+2012-04-13 Raymond Liu <raymond.liu@intel.com>
+
+ AudioContext createChannelMerger() method should have optional argument for number of inputs.
+ https://bugs.webkit.org/show_bug.cgi?id=83759
+
+ Reviewed by Chris Rogers.
+
+ Check https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html for the optional argument.
+
+ Test: webaudio/audiochannelmerger-basic.html
+
+ * Modules/webaudio/AudioChannelMerger.cpp:
+ (WebCore):
+ (WebCore::AudioChannelMerger::create):
+ (WebCore::AudioChannelMerger::AudioChannelMerger):
+ * Modules/webaudio/AudioChannelMerger.h:
+ (AudioChannelMerger):
+ * Modules/webaudio/AudioContext.cpp:
+ (WebCore::AudioContext::createChannelMerger):
+ (WebCore):
+ * Modules/webaudio/AudioContext.h:
+ (AudioContext):
+ * Modules/webaudio/AudioContext.idl:
+
2012-04-13 Dana Jansens <danakj@chromium.org>
[chromium] Remove viewport memory restrictions
diff --git a/Source/WebCore/Modules/webaudio/AudioChannelMerger.cpp b/Source/WebCore/Modules/webaudio/AudioChannelMerger.cpp
index 59adaa0..f9dfcce 100644
--- a/Source/WebCore/Modules/webaudio/AudioChannelMerger.cpp
+++ b/Source/WebCore/Modules/webaudio/AudioChannelMerger.cpp
@@ -37,16 +37,20 @@
#include "AudioNodeOutput.h"
namespace WebCore {
-
-// This is considering that 5.1 (6 channels) is the largest we'll ever deal with.
-// It can easily be increased to support more if the web audio specification is updated.
-const unsigned NumberOfInputs = 6;
-AudioChannelMerger::AudioChannelMerger(AudioContext* context, float sampleRate)
+PassRefPtr<AudioChannelMerger> AudioChannelMerger::create(AudioContext* context, float sampleRate, unsigned numberOfInputs)
+{
+ if (!numberOfInputs || numberOfInputs > AudioContext::maxNumberOfChannels())
+ return 0;
+
+ return adoptRef(new AudioChannelMerger(context, sampleRate, numberOfInputs));
+}
+
+AudioChannelMerger::AudioChannelMerger(AudioContext* context, float sampleRate, unsigned numberOfInputs)
: AudioNode(context, sampleRate)
{
- // Create a fixed number of inputs (able to handle the maximum number of channels we deal with).
- for (unsigned i = 0; i < NumberOfInputs; ++i)
+ // Create the requested number of inputs.
+ for (unsigned i = 0; i < numberOfInputs; ++i)
addInput(adoptPtr(new AudioNodeInput(this)));
addOutput(adoptPtr(new AudioNodeOutput(this, 1)));
diff --git a/Source/WebCore/Modules/webaudio/AudioChannelMerger.h b/Source/WebCore/Modules/webaudio/AudioChannelMerger.h
index 35dd06d..4a1d575 100644
--- a/Source/WebCore/Modules/webaudio/AudioChannelMerger.h
+++ b/Source/WebCore/Modules/webaudio/AudioChannelMerger.h
@@ -38,10 +38,7 @@
class AudioChannelMerger : public AudioNode {
public:
- static PassRefPtr<AudioChannelMerger> create(AudioContext* context, float sampleRate)
- {
- return adoptRef(new AudioChannelMerger(context, sampleRate));
- }
+ static PassRefPtr<AudioChannelMerger> create(AudioContext*, float sampleRate, unsigned numberOfInputs);
// AudioNode
virtual void process(size_t framesToProcess);
@@ -54,7 +51,7 @@
virtual double tailTime() const OVERRIDE { return 0; }
virtual double latencyTime() const OVERRIDE { return 0; }
- AudioChannelMerger(AudioContext*, float sampleRate);
+ AudioChannelMerger(AudioContext*, float sampleRate, unsigned numberOfInputs);
};
} // namespace WebCore
diff --git a/Source/WebCore/Modules/webaudio/AudioContext.cpp b/Source/WebCore/Modules/webaudio/AudioContext.cpp
index 6c1e17e..a2b63bf 100644
--- a/Source/WebCore/Modules/webaudio/AudioContext.cpp
+++ b/Source/WebCore/Modules/webaudio/AudioContext.cpp
@@ -479,11 +479,25 @@
return node;
}
-PassRefPtr<AudioChannelMerger> AudioContext::createChannelMerger()
+PassRefPtr<AudioChannelMerger> AudioContext::createChannelMerger(ExceptionCode& ec)
+{
+ const unsigned ChannelMergerDefaultNumberOfInputs = 6;
+ return createChannelMerger(ChannelMergerDefaultNumberOfInputs, ec);
+}
+
+PassRefPtr<AudioChannelMerger> AudioContext::createChannelMerger(size_t numberOfInputs, ExceptionCode& ec)
{
ASSERT(isMainThread());
lazyInitialize();
- return AudioChannelMerger::create(this, m_destinationNode->sampleRate());
+
+ RefPtr<AudioChannelMerger> node = AudioChannelMerger::create(this, m_destinationNode->sampleRate(), numberOfInputs);
+
+ if (!node.get()) {
+ ec = SYNTAX_ERR;
+ return 0;
+ }
+
+ return node;
}
PassRefPtr<Oscillator> AudioContext::createOscillator()
diff --git a/Source/WebCore/Modules/webaudio/AudioContext.h b/Source/WebCore/Modules/webaudio/AudioContext.h
index 01b0c6fd8..5254ef6 100644
--- a/Source/WebCore/Modules/webaudio/AudioContext.h
+++ b/Source/WebCore/Modules/webaudio/AudioContext.h
@@ -128,7 +128,8 @@
PassRefPtr<JavaScriptAudioNode> createJavaScriptNode(size_t bufferSize, size_t numberOfInputChannels, size_t numberOfOutputChannels, ExceptionCode&);
PassRefPtr<AudioChannelSplitter> createChannelSplitter(ExceptionCode&);
PassRefPtr<AudioChannelSplitter> createChannelSplitter(size_t numberOfOutputs, ExceptionCode&);
- PassRefPtr<AudioChannelMerger> createChannelMerger();
+ PassRefPtr<AudioChannelMerger> createChannelMerger(ExceptionCode&);
+ PassRefPtr<AudioChannelMerger> createChannelMerger(size_t numberOfInputs, ExceptionCode&);
PassRefPtr<Oscillator> createOscillator();
PassRefPtr<WaveTable> createWaveTable(Float32Array* real, Float32Array* imag, ExceptionCode&);
diff --git a/Source/WebCore/Modules/webaudio/AudioContext.idl b/Source/WebCore/Modules/webaudio/AudioContext.idl
index a129b08..1d02288 100644
--- a/Source/WebCore/Modules/webaudio/AudioContext.idl
+++ b/Source/WebCore/Modules/webaudio/AudioContext.idl
@@ -80,7 +80,8 @@
// Channel splitting and merging
AudioChannelSplitter createChannelSplitter(in [Optional] unsigned long numberOfOutputs)
raises(DOMException);
- AudioChannelMerger createChannelMerger();
+ AudioChannelMerger createChannelMerger(in [Optional] unsigned long numberOfInputs)
+ raises(DOMException);
// Offline rendering
// void prepareOfflineBufferRendering(in unsigned long numberOfChannels, in unsigned long numberOfFrames, in float sampleRate);