summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface')
-rw-r--r--testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/.gitkeep0
-rw-r--r--testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/gain-expected.wavbin0 -> 281400 bytes
-rw-r--r--testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/idl-test.html152
-rw-r--r--testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html121
4 files changed, 273 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/.gitkeep b/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/.gitkeep
diff --git a/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/gain-expected.wav b/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/gain-expected.wav
new file mode 100644
index 000000000..b445bd8a6
--- /dev/null
+++ b/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/gain-expected.wav
Binary files differ
diff --git a/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/idl-test.html b/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/idl-test.html
new file mode 100644
index 000000000..dea13b179
--- /dev/null
+++ b/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/idl-test.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html>
+<html class="a">
+<head>
+<title>GainNode IDL Test</title>
+<script src="/resources/testharness.js"></script><script src="/resources/testharnessreport.js"></script><script src="/resources/idlharness.js"></script><script src="/resources/WebIDLParser.js"></script><script src="/webaudio/js/lodash.js"></script><script src="/webaudio/js/vendor-prefixes.js"></script><script src="/webaudio/js/helpers.js"></script><style type="text/css">
+ #event-target-idl,
+ #audio-context-idl,
+ #audio-node-idl,
+ #audio-param-idl
+ { visibility:hidden; height: 0px;}
+ </style>
+</head>
+<body class="a">
+
+ <pre id="event-target-idl">interface EventTarget {
+ void addEventListener(DOMString type, EventListener? callback, optional boolean capture = false);
+ void removeEventListener(DOMString type, EventListener? callback, optional boolean capture = false);
+ boolean dispatchEvent(Event event);
+};
+
+/*
+callback interface EventListener {
+ void handleEvent(Event event);
+};
+*/
+// Callback interfaces are not supported yet, but that's ok
+interface EventListener {};
+</pre>
+
+ <pre id="audio-context-idl">callback DecodeSuccessCallback = void (AudioBuffer decodedData);
+callback DecodeErrorCallback = void ();
+
+[Constructor]
+interface AudioContext : EventTarget {
+
+ readonly attribute AudioDestinationNode destination;
+ readonly attribute float sampleRate;
+ readonly attribute double currentTime;
+ readonly attribute AudioListener listener;
+
+ AudioBuffer createBuffer(unsigned long numberOfChannels, unsigned long length, float sampleRate);
+
+ void decodeAudioData(ArrayBuffer audioData,
+ DecodeSuccessCallback successCallback,
+ optional DecodeErrorCallback errorCallback);
+
+
+ // AudioNode creation
+ AudioBufferSourceNode createBufferSource();
+
+ MediaElementAudioSourceNode createMediaElementSource(HTMLMediaElement mediaElement);
+
+ MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream);
+ MediaStreamAudioDestinationNode createMediaStreamDestination();
+
+ ScriptProcessorNode createScriptProcessor(optional unsigned long bufferSize = 0,
+ optional unsigned long numberOfInputChannels = 2,
+ optional unsigned long numberOfOutputChannels = 2);
+
+ AnalyserNode createAnalyser();
+ GainNode createGain();
+ DelayNode createDelay(optional double maxDelayTime = 1.0);
+ BiquadFilterNode createBiquadFilter();
+ WaveShaperNode createWaveShaper();
+ PannerNode createPanner();
+ ConvolverNode createConvolver();
+
+ ChannelSplitterNode createChannelSplitter(optional unsigned long numberOfOutputs = 6);
+ ChannelMergerNode createChannelMerger(optional unsigned long numberOfInputs = 6);
+
+ DynamicsCompressorNode createDynamicsCompressor();
+
+ OscillatorNode createOscillator();
+ PeriodicWave createPeriodicWave(Float32Array real, Float32Array imag);
+
+};</pre>
+
+ <pre id="audio-node-idl">enum ChannelCountMode {
+ "max",
+ "clamped-max",
+ "explicit"
+};
+
+enum ChannelInterpretation {
+ "speakers",
+ "discrete"
+};
+
+interface AudioNode : EventTarget {
+
+ void connect(AudioNode destination, optional unsigned long output = 0, optional unsigned long input = 0);
+ void connect(AudioParam destination, optional unsigned long output = 0);
+ void disconnect(optional unsigned long output = 0);
+
+ readonly attribute AudioContext context;
+ readonly attribute unsigned long numberOfInputs;
+ readonly attribute unsigned long numberOfOutputs;
+
+ // Channel up-mixing and down-mixing rules for all inputs.
+ attribute unsigned long channelCount;
+ attribute ChannelCountMode channelCountMode;
+ attribute ChannelInterpretation channelInterpretation;
+
+};</pre>
+
+ <pre id="audio-param-idl">interface AudioParam {
+
+ attribute float value;
+ readonly attribute float defaultValue;
+
+ // Parameter automation.
+ void setValueAtTime(float value, double startTime);
+ void linearRampToValueAtTime(float value, double endTime);
+ void exponentialRampToValueAtTime(float value, double endTime);
+
+ // Exponentially approach the target value with a rate having the given time constant.
+ void setTargetAtTime(float target, double startTime, double timeConstant);
+
+ // Sets an array of arbitrary parameter values starting at time for the given duration.
+ // The number of values will be scaled to fit into the desired duration.
+ void setValueCurveAtTime(Float32Array values, double startTime, double duration);
+
+ // Cancels all scheduled parameter changes with times greater than or equal to startTime.
+ void cancelScheduledValues(double startTime);
+
+};</pre>
+
+<pre id="gain-node-idl">interface GainNode : AudioNode {
+
+ readonly attribute AudioParam gain;
+
+};</pre>
+
+ <div id="log"></div>
+
+ <script>
+(function() {
+ var idl_array = new IdlArray();
+ idl_array.add_untested_idls(document.getElementById("event-target-idl").textContent);
+ idl_array.add_untested_idls(document.getElementById("audio-context-idl").textContent);
+ idl_array.add_untested_idls(document.getElementById("audio-node-idl").textContent);
+ idl_array.add_untested_idls(document.getElementById("audio-param-idl").textContent);
+ idl_array.add_idls(document.getElementById("gain-node-idl").textContent);
+
+ gain_node = (new AudioContext).createGain();
+
+ idl_array.add_objects({GainNode: ["gain_node"]});
+ idl_array.test();
+})();
+ </script>
+</body>
+</html>
diff --git a/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html b/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html
new file mode 100644
index 000000000..4f92fbbe5
--- /dev/null
+++ b/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html
@@ -0,0 +1,121 @@
+<!doctype html>
+
+<!--
+Tests that GainNode is properly scaling the gain.
+We'll render 11 notes, starting at a gain of 1.0, decreasing in gain by 0.1.
+The 11th note will be of gain 0.0, so it should be silent (at the end in the rendered output).
+
+Based on a test from the WebKit test suite
+(https://github.com/WebKit/webkit/blob/master/LayoutTests/webaudio/gain.html)
+-->
+
+<html class="a">
+ <head>
+ <title>GainNode interface</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/webaudio/js/lodash.js"></script>
+ <script src="/webaudio/js/vendor-prefixes.js"></script>
+ <script src="/webaudio/js/helpers.js"></script>
+ <script src="/webaudio/js/buffer-loader.js"></script>
+ </head>
+ <body class="a">
+ <div id="log"></div>
+ <script>
+var gainNodeTest = async_test("GainNode");
+
+var sampleRate = 44100.0;
+var bufferDurationSeconds = 0.125;
+var numberOfNotes = 11;
+var noteSpacing = bufferDurationSeconds + 0.020; // leave 20ms of silence between each "note"
+var lengthInSeconds = numberOfNotes * noteSpacing;
+
+var context = 0;
+var expectedBuffer = 0;
+var actualBuffer = 0;
+var sinWaveBuffer = 0;
+
+function createSinWaveBuffer(lengthInSeconds, frequency) {
+ var audioBuffer = context.createBuffer(2, lengthInSeconds * sampleRate, sampleRate);
+
+ var n = audioBuffer.length;
+ var channelL = audioBuffer.getChannelData(0);
+ var channelR = audioBuffer.getChannelData(1);
+
+ for (var i = 0; i < n; ++i) {
+ channelL[i] = Math.sin(frequency * 2.0*Math.PI * i / sampleRate);
+ channelR[i] = channelL[i];
+ }
+
+ return audioBuffer;
+}
+
+function playNote(time, gain) {
+ var source = context.createBufferSource();
+ source.buffer = sinWaveBuffer;
+
+ var gainNode = context.createGain();
+ gainNode.gain.value = gain;
+
+ source.connect(gainNode);
+ gainNode.connect(context.destination);
+
+ source.start(time);
+}
+
+function loadExpectedBuffer(event) {
+ actualBuffer = event.renderedBuffer;
+
+ bufferLoader = new BufferLoader(
+ context,
+ ['/webaudio/the-audio-api/the-gainnode-interface/gain-expected.wav'],
+ bufferLoadCompleted
+ );
+ bufferLoader.load();
+};
+
+function bufferLoadCompleted(buffer) {
+ compareExpectedWithActualBuffer(buffer);
+};
+
+setup( function() {
+ // Create offline audio context.
+ context = new OfflineAudioContext(2, sampleRate * lengthInSeconds, sampleRate);
+
+ // Create a buffer for a short "note".
+ sinWaveBuffer = createSinWaveBuffer(bufferDurationSeconds, 880.0);
+
+ // Render 11 notes, starting at a gain of 1.0, decreasing in gain by 0.1.
+ // The last note will be of gain 0.0, so shouldn't be perceptible in the rendered output.
+ for (var i = 0; i < numberOfNotes; ++i) {
+ var time = i * noteSpacing;
+ var gain = 1.0 - i / (numberOfNotes - 1);
+ playNote(time, gain);
+ }
+
+ context.oncomplete = loadExpectedBuffer;
+ context.startRendering();
+}, {timeout: 10000});
+
+function compareExpectedWithActualBuffer(expected) {
+ var expectedBuffer = expected[0];
+
+ gainNodeTest.step(function() {
+ assert_array_approx_equals(expectedBuffer.getChannelData(0),
+ actualBuffer.getChannelData(0),
+ 1e-4,
+ "comparing expected and rendered buffers (channel 0)");
+ });
+
+ gainNodeTest.step(function() {
+ assert_array_approx_equals(expectedBuffer.getChannelData(1),
+ actualBuffer.getChannelData(1),
+ 1e-4,
+ "comparing expected and rendered buffers (channel 1)");
+ });
+
+ gainNodeTest.done();
+};
+ </script>
+ </body>
+</html>