diff options
Diffstat (limited to 'testing/web-platform/tests/webaudio/the-audio-api/the-delaynode-interface/maxdelay-rounding.html')
-rw-r--r-- | testing/web-platform/tests/webaudio/the-audio-api/the-delaynode-interface/maxdelay-rounding.html | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webaudio/the-audio-api/the-delaynode-interface/maxdelay-rounding.html b/testing/web-platform/tests/webaudio/the-audio-api/the-delaynode-interface/maxdelay-rounding.html new file mode 100644 index 0000000000..84d9f18138 --- /dev/null +++ b/testing/web-platform/tests/webaudio/the-audio-api/the-delaynode-interface/maxdelay-rounding.html @@ -0,0 +1,78 @@ +<!DOCTYPE html> +<html> + <head> + <title> + Test DelayNode when maxDelayTime requires rounding + </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 sampleRate = 44100; + let inputLengthSeconds = 1; + let renderLengthSeconds = 2; + + // Delay for one second plus 0.4 of a sample frame, to test that + // DelayNode is properly rounding up when calculating its buffer + // size (crbug.com/1065110). + let delayTimeSeconds = 1 + 0.4 / sampleRate; + + let audit = Audit.createTaskRunner(); + + audit.define( + { + label: 'maxdelay-rounding', + description: 'Test DelayNode when maxDelayTime requires rounding', + }, + (task, should) => { + let context = new OfflineAudioContext({ + numberOfChannels: 1, + length: sampleRate * renderLengthSeconds, + sampleRate: sampleRate, + }); + + // Create a constant source to use as input. + let src = new ConstantSourceNode(context); + + // Create a DelayNode to delay for delayTimeSeconds. + let delay = new DelayNode(context, { + maxDelayTime: delayTimeSeconds, + delayTime: delayTimeSeconds, + }); + + src.connect(delay).connect(context.destination); + + src.start(); + context.startRendering() + .then(renderedBuffer => { + let renderedData = renderedBuffer.getChannelData(0); + + // The first delayTimeSeconds of output should be silent. + let expectedSilentFrames = Math.floor( + delayTimeSeconds * sampleRate); + + should( + renderedData.slice(0, expectedSilentFrames), + `output[0:${expectedSilentFrames - 1}]`) + .beConstantValueOf(0); + + // The rest should be non-silent: that is, there should + // be at least one non-zero sample. (Any reasonable + // interpolation algorithm will make all these samples + // non-zero, but I don't think that's guaranteed by the + // spec, so we use a conservative test for now.) + should( + renderedData.slice(expectedSilentFrames), + `output[${expectedSilentFrames}:]`) + .notBeConstantValueOf(0); + }) + .then(() => task.done()); + }); + + audit.run(); + </script> + </body> +</html> |