summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webaudio/the-audio-api/the-audioworklet-interface/simple-input-output.https.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webaudio/the-audio-api/the-audioworklet-interface/simple-input-output.https.html')
-rw-r--r--testing/web-platform/tests/webaudio/the-audio-api/the-audioworklet-interface/simple-input-output.https.html90
1 files changed, 90 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webaudio/the-audio-api/the-audioworklet-interface/simple-input-output.https.html b/testing/web-platform/tests/webaudio/the-audio-api/the-audioworklet-interface/simple-input-output.https.html
new file mode 100644
index 0000000000..7b9e7f0ac3
--- /dev/null
+++ b/testing/web-platform/tests/webaudio/the-audio-api/the-audioworklet-interface/simple-input-output.https.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Test Simple AudioWorklet I/O</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/webaudio/resources/audit.js"></script>
+ <script src="/webaudio/resources/audit-util.js"></script>
+ </head>
+
+ <body>
+ <script>
+ // Arbitrary sample rate
+ const sampleRate = 48000;
+
+ // The offset to be applied by the worklet to its inputs.
+ const offset = 1;
+
+ // Location of the worklet's code
+ const filePath = 'processors/add-offset.js';
+
+ let audit = Audit.createTaskRunner();
+
+ // Context to be used for the tests.
+ let context;
+
+ audit.define('Initialize worklet', (task, should) => {
+ // Two channels for testing. Channel 0 is the output of the
+ // AudioWorklet. Channel 1 is the oscillator so we can compare
+ // the outputs.
+ context = new OfflineAudioContext(
+ {numberOfChannels: 2, length: sampleRate, sampleRate: sampleRate});
+
+ // Load up the code for the worklet.
+ should(
+ context.audioWorklet.addModule(filePath),
+ 'Creation of AudioWorklet')
+ .beResolved()
+ .then(() => task.done());
+ });
+
+ audit.define(
+ {label: 'test', description: 'Simple AudioWorklet I/O'},
+ (task, should) => {
+ let merger = new ChannelMergerNode(
+ context, {numberOfChannels: context.destination.channelCount});
+ merger.connect(context.destination);
+
+ let src = new OscillatorNode(context);
+
+ let worklet = new AudioWorkletNode(
+ context, 'add-offset-processor',
+ {processorOptions: {offset: offset}});
+
+ src.connect(worklet).connect(merger, 0, 0);
+ src.connect(merger, 0, 1);
+
+ // Start and stop the source. The stop time is fairly arbitrary,
+ // but use a render quantum boundary for simplicity.
+ const stopFrame = RENDER_QUANTUM_FRAMES;
+ src.start(0);
+ src.stop(stopFrame / context.sampleRate);
+
+ context.startRendering()
+ .then(buffer => {
+ let ch0 = buffer.getChannelData(0);
+ let ch1 = buffer.getChannelData(1);
+
+ let shifted = ch1.slice(0, stopFrame).map(x => x + offset);
+
+ // The initial part of the output should be the oscillator
+ // shifted by |offset|.
+ should(
+ ch0.slice(0, stopFrame),
+ `AudioWorklet output[0:${stopFrame - 1}]`)
+ .beCloseToArray(shifted, {absoluteThreshold: 0});
+
+ // Output should be constant after the source has stopped.
+ should(
+ ch0.slice(stopFrame),
+ `AudioWorklet output[${stopFrame}:]`)
+ .beConstantValueOf(offset);
+ })
+ .then(() => task.done());
+ });
+
+ audit.run();
+ </script>
+ </body>
+</html>