diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/webaudio/the-audio-api/the-pannernode-interface/automation-changes.html | |
parent | Initial commit. (diff) | |
download | firefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/webaudio/the-audio-api/the-pannernode-interface/automation-changes.html')
-rw-r--r-- | testing/web-platform/tests/webaudio/the-audio-api/the-pannernode-interface/automation-changes.html | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webaudio/the-audio-api/the-pannernode-interface/automation-changes.html b/testing/web-platform/tests/webaudio/the-audio-api/the-pannernode-interface/automation-changes.html new file mode 100644 index 0000000000..8aa73552aa --- /dev/null +++ b/testing/web-platform/tests/webaudio/the-audio-api/the-pannernode-interface/automation-changes.html @@ -0,0 +1,140 @@ +<!doctype html> +<html> + <head> + <title>Panner Node Automation</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="../../resources/audit-util.js"></script> + <script src="../../resources/audit.js"></script> + </head> + + <body> + <script> + // Use a power-of-two to eliminate some round-off; otherwise, this isn't + // really important. + const sampleRate = 16384; + + // Render enough for the test; we don't need a lot. + const renderFrames = 2048; + + // Initial panner positionX and final positionX for listener. + const positionX = 2000; + + const audit = Audit.createTaskRunner(); + + // Test that listener.positionX.value setter does the right thing. + audit.define('Set Listener.positionX.value', (task, should) => { + const context = new OfflineAudioContext(2, renderFrames, sampleRate); + + createGraph(context); + + // Frame at which the listener instantaneously moves to a new location. + const moveFrame = 512; + + context.suspend(moveFrame / context.sampleRate) + .then(() => { + context.listener.positionX.value = positionX; + }) + .then(() => context.resume()); + + verifyOutput(context, moveFrame, should, 'listenr.positionX.value') + .then(() => task.done()); + }); + + // Test that listener.positionX.setValueAtTime() does the right thing. + audit.define('Listener.positionX.setValue', (task, should) => { + const context = new OfflineAudioContext(2, renderFrames, sampleRate); + + createGraph(context); + + // Frame at which the listener instantaneously moves to a new location. + const moveFrame = 512; + + context.listener.positionX.setValueAtTime( + positionX, moveFrame / context.sampleRate); + + verifyOutput( + context, moveFrame, should, 'listener.positionX.setValueATTime') + .then(() => task.done()); + }); + + // Test that listener.setPosition() does the right thing. + audit.define('Listener.setPosition', (task, should) => { + const context = new OfflineAudioContext(2, renderFrames, sampleRate); + + createGraph(context); + + // Frame at which the listener instantaneously moves to a new location. + const moveFrame = 512; + + context.suspend(moveFrame / context.sampleRate) + .then(() => { + context.listener.setPosition(positionX, 0, 0); + }) + .then(() => context.resume()); + + verifyOutput(context, moveFrame, should, 'listener.setPostion') + .then(() => task.done()); + }); + + audit.run(); + + + // Create the basic graph for testing which consists of an oscillator node + // connected to a panner node. + function createGraph(context) { + const listener = context.listener; + + listener.positionX.value = 0; + listener.positionY.value = 0; + listener.positionZ.value = 0; + + const src = new OscillatorNode(context); + + const panner = new PannerNode(context, { + distanceModel: 'linear', + refDistance: 1, + maxDistance: 3000, + positionX: positionX, + positionY: 0, + positionZ: 0 + }); + src.connect(panner).connect(context.destination); + + src.start(); + } + + + // Verify the output from the panner is correct. + function verifyOutput(context, moveFrame, should, prefix) { + return context.startRendering().then(resultBuffer => { + // Get the outputs (left and right) + const c0 = resultBuffer.getChannelData(0); + const c1 = resultBuffer.getChannelData(1); + + // The src/listener set up is such that audio should only come + // from the right for until |moveFrame|. Hence the left channel + // should be 0 (or very nearly 0). + const zero = new Float32Array(moveFrame); + + should( + c0.slice(0, moveFrame), `${prefix}: output0[0:${moveFrame - 1}]`) + .beCloseToArray(zero, {absoluteThreshold: 1e-16}); + should( + c1.slice(0, moveFrame), `${prefix}: output1[0:${moveFrame - 1}]`) + .notBeConstantValueOf(0); + + // At |moveFrame| and beyond, the listener and source are at the + // same position, so the outputs from the left and right should be + // identical, and the left channel should not be 0 anymore. + + should(c0.slice(moveFrame), `${prefix}: output0[${moveFrame}:]`) + .notBeConstantValueOf(0); + should(c1.slice(moveFrame), `${prefix}: output1[${moveFrame}:]`) + .beCloseToArray(c0.slice(moveFrame)); + }); + } + </script> + </body> +</html> + |