summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/audiochannelsplitter.html
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 17:32:43 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 17:32:43 +0000
commit6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch)
treea68f146d7fa01f0134297619fbe7e33db084e0aa /testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/audiochannelsplitter.html
parentInitial commit. (diff)
downloadthunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz
thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.zip
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/audiochannelsplitter.html')
-rw-r--r--testing/web-platform/tests/webaudio/the-audio-api/the-channelsplitternode-interface/audiochannelsplitter.html141
1 files changed, 141 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>