summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface')
-rw-r--r--testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/audiochannelsplitter.html141
-rw-r--r--testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/ctor-channelsplitter.html115
2 files changed, 256 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/audiochannelsplitter.html b/testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/audiochannelsplitter.html
new file mode 100644
index 0000000000..954c71a96b
--- /dev/null
+++ b/testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/audiochannelsplitter.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<!--
+Tests that AudioChannelSplitter works correctly.
+-->
+<html>
+ <head>
+ <title>
+ audiochannelsplitter.html
+ </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/webaudio/resources/audit-util.js"></script>
+ <script src="/webaudio/resources/audit.js"></script>
+ </head>
+ <body>
+ <script id="layout-test-code">
+ let audit = Audit.createTaskRunner();
+
+ let sampleRate = 44100.0;
+ let lengthInSampleFrames = 512;
+
+ let context = 0;
+ let sourceBuffer;
+ let sourceNode;
+ let channelSplitter;
+ let channelMerger;
+
+ function createStereoBufferWithDCOffset(length, sampleRate, offset) {
+ let buffer = context.createBuffer(2, length, sampleRate);
+ let n = buffer.length;
+ let channelL = buffer.getChannelData(0);
+ let channelR = buffer.getChannelData(1);
+
+ for (let i = 0; i < n; ++i) {
+ channelL[i] = offset;
+ channelR[i] = -1.0 * offset;
+ }
+
+ return buffer;
+ }
+
+ // checkResult() checks that the rendered buffer is stereo and that the
+ // left channel is all -1 and right channel all +1. In other words, we've
+ // reversed the order of the two channels.
+ function checkResult(buffer, should) {
+ let success = true;
+
+ if (buffer.numberOfChannels == 2) {
+ let bufferDataL = buffer.getChannelData(0);
+ let bufferDataR = buffer.getChannelData(1);
+
+ success = should(bufferDataL, 'Left channel').beConstantValueOf(-1) &&
+ success;
+ success = should(bufferDataR, 'Right channel').beConstantValueOf(1) &&
+ success;
+ } else {
+ success = false;
+ }
+
+ should(success, 'Left and right channels were exchanged')
+ .message('correctly', 'incorrectly');
+ }
+
+ audit.define(
+ {
+ label: 'construction',
+ description: 'Construction of ChannelSplitterNode'
+ },
+ function(task, should) {
+
+ // Create stereo offline audio context.
+ context =
+ new OfflineAudioContext(2, lengthInSampleFrames, sampleRate);
+
+ let splitternode;
+ should(() => {
+ let splitternode = context.createChannelSplitter(0);
+ }, 'createChannelSplitter(0)').throw(DOMException, 'IndexSizeError');
+
+ should(() => {
+ splitternode = context.createChannelSplitter(33);
+ }, 'createChannelSplitter(33)').throw(DOMException, 'IndexSizeError');
+
+ should(() => {
+ splitternode = context.createChannelSplitter(32);
+ }, 'splitternode = context.createChannelSplitter(32)').notThrow();
+
+ should(splitternode.numberOfOutputs, 'splitternode.numberOfOutputs')
+ .beEqualTo(32);
+ should(splitternode.numberOfInputs, 'splitternode.numberOfInputs')
+ .beEqualTo(1)
+
+ should(() => {
+ splitternode = context.createChannelSplitter();
+ }, 'splitternode = context.createChannelSplitter()').notThrow();
+
+ should(splitternode.numberOfOutputs, 'splitternode.numberOfOutputs')
+ .beEqualTo(6);
+
+ task.done();
+ });
+
+ audit.define(
+ {
+ label: 'functionality',
+ description: 'Functionality of ChannelSplitterNode'
+ },
+ function(task, should) {
+
+ // Create a stereo buffer, with all +1 values in left channel, all
+ // -1 in right channel.
+ sourceBuffer = createStereoBufferWithDCOffset(
+ lengthInSampleFrames, sampleRate, 1);
+
+ sourceNode = context.createBufferSource();
+ sourceNode.buffer = sourceBuffer;
+
+ // Create a channel splitter and connect it so that it split the
+ // stereo stream into two mono streams.
+ channelSplitter = context.createChannelSplitter(2);
+ sourceNode.connect(channelSplitter);
+
+ // Create a channel merger to merge the output of channel splitter.
+ channelMerger = context.createChannelMerger();
+ channelMerger.connect(context.destination);
+
+ // When merging, exchange channel layout: left->right, right->left
+ channelSplitter.connect(channelMerger, 0, 1);
+ channelSplitter.connect(channelMerger, 1, 0);
+
+ sourceNode.start(0);
+
+ context.startRendering()
+ .then(buffer => checkResult(buffer, should))
+ .then(task.done.bind(task));
+ });
+
+ audit.run();
+ </script>
+ </body>
+</html>
diff --git a/testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/ctor-channelsplitter.html b/testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/ctor-channelsplitter.html
new file mode 100644
index 0000000000..b7165bac33
--- /dev/null
+++ b/testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/ctor-channelsplitter.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>
+ Test Constructor: ChannelSplitter
+ </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/webaudio/resources/audit-util.js"></script>
+ <script src="/webaudio/resources/audit.js"></script>
+ <script src="/webaudio/resources/audionodeoptions.js"></script>
+ </head>
+ <body>
+ <script id="layout-test-code">
+ let context;
+
+ let audit = Audit.createTaskRunner();
+
+ audit.define('initialize', (task, should) => {
+ context = initializeContext(should);
+ task.done();
+ });
+
+ audit.define('invalid constructor', (task, should) => {
+ testInvalidConstructor(should, 'ChannelSplitterNode', context);
+ task.done();
+ });
+
+ audit.define('default constructor', (task, should) => {
+ testDefaultConstructor(should, 'ChannelSplitterNode', context, {
+ prefix: 'node0',
+ numberOfInputs: 1,
+ numberOfOutputs: 6,
+ channelCount: 6,
+ channelCountMode: 'explicit',
+ channelInterpretation: 'discrete'
+ });
+
+ task.done();
+ });
+
+ audit.define('test AudioNodeOptions', (task, should) => {
+ testAudioNodeOptions(should, context, 'ChannelSplitterNode', {
+ channelCount: {
+ value: 6,
+ isFixed: true,
+ exceptionType: 'InvalidStateError'
+ },
+ channelCountMode: {
+ value: 'explicit',
+ isFixed: true,
+ exceptionType: 'InvalidStateError'
+ },
+ channelInterpretation: {
+ value: 'discrete',
+ isFixed: true,
+ exceptionType: 'InvalidStateError'
+ },
+ });
+ task.done();
+ });
+
+ audit.define('constructor options', (task, should) => {
+ let node;
+ let options = {
+ numberOfInputs: 3,
+ numberOfOutputs: 9,
+ channelInterpretation: 'discrete'
+ };
+
+ should(
+ () => {
+ node = new ChannelSplitterNode(context, options);
+ },
+ 'node1 = new ChannelSplitterNode(context, ' +
+ JSON.stringify(options) + ')')
+ .notThrow();
+
+ should(node.numberOfInputs, 'node1.numberOfInputs').beEqualTo(1);
+ should(node.numberOfOutputs, 'node1.numberOfOutputs')
+ .beEqualTo(options.numberOfOutputs);
+ should(node.channelInterpretation, 'node1.channelInterpretation')
+ .beEqualTo(options.channelInterpretation);
+
+ options = {numberOfOutputs: 99};
+ should(
+ () => {
+ node = new ChannelSplitterNode(context, options);
+ },
+ 'new ChannelSplitterNode(c, ' + JSON.stringify(options) + ')')
+ .throw(DOMException, 'IndexSizeError');
+
+ options = {channelCount: 3};
+ should(
+ () => {
+ node = new ChannelSplitterNode(context, options);
+ },
+ 'new ChannelSplitterNode(c, ' + JSON.stringify(options) + ')')
+ .throw(DOMException, 'InvalidStateError');
+
+ options = {channelCountMode: 'max'};
+ should(
+ () => {
+ node = new ChannelSplitterNode(context, options);
+ },
+ 'new ChannelSplitterNode(c, ' + JSON.stringify(options) + ')')
+ .throw(DOMException, 'InvalidStateError');
+
+ task.done();
+ });
+
+ audit.run();
+ </script>
+ </body>
+</html>