summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html')
-rw-r--r--testing/web-platform/tests/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html121
1 files changed, 121 insertions, 0 deletions
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>