mirror of
https://github.com/servo/servo.git
synced 2025-08-26 23:58:20 +01:00
Update web-platform-tests to revision 9659a35d816ff1b32835a2eccf3e0117dea4e5ce
This commit is contained in:
parent
6df0dc5b27
commit
4f0af2af66
54 changed files with 1873 additions and 137 deletions
|
@ -0,0 +1,49 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>
|
||||
delaynode-max-default-delay.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>
|
||||
<script src="/webaudio/resources/delay-testing.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script id="layout-test-code">
|
||||
let audit = Audit.createTaskRunner();
|
||||
|
||||
audit.define(
|
||||
{
|
||||
label: 'test',
|
||||
description: 'DelayNode with delay set to default maximum delay'
|
||||
},
|
||||
function(task, should) {
|
||||
|
||||
// Create offline audio context.
|
||||
let context = new OfflineAudioContext(
|
||||
1, sampleRate * renderLengthSeconds, sampleRate);
|
||||
let toneBuffer = createToneBuffer(
|
||||
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
|
||||
|
||||
let bufferSource = context.createBufferSource();
|
||||
bufferSource.buffer = toneBuffer;
|
||||
|
||||
let delay = context.createDelay();
|
||||
delayTimeSeconds = 1;
|
||||
delay.delayTime.value = delayTimeSeconds;
|
||||
|
||||
bufferSource.connect(delay);
|
||||
delay.connect(context.destination);
|
||||
bufferSource.start(0);
|
||||
|
||||
context.startRendering()
|
||||
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
|
||||
.then(() => task.done());
|
||||
});
|
||||
|
||||
audit.run();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,51 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>
|
||||
delaynode-max-nondefault-delay.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>
|
||||
<script src="/webaudio/resources/delay-testing.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script id="layout-test-code">
|
||||
let audit = Audit.createTaskRunner();
|
||||
|
||||
audit.define(
|
||||
{
|
||||
label: 'test',
|
||||
description: 'DelayNode with delay set to non-default maximum delay'
|
||||
},
|
||||
function(task, should) {
|
||||
|
||||
// Create offline audio context.
|
||||
let context = new OfflineAudioContext(
|
||||
1, sampleRate * renderLengthSeconds, sampleRate);
|
||||
let toneBuffer = createToneBuffer(
|
||||
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
|
||||
|
||||
let bufferSource = context.createBufferSource();
|
||||
bufferSource.buffer = toneBuffer;
|
||||
|
||||
let maxDelay = 1.5;
|
||||
let delay = context.createDelay(maxDelay);
|
||||
delayTimeSeconds = maxDelay;
|
||||
delay.delayTime.value = delayTimeSeconds;
|
||||
|
||||
bufferSource.connect(delay);
|
||||
delay.connect(context.destination);
|
||||
bufferSource.start(0);
|
||||
|
||||
context.startRendering()
|
||||
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
|
||||
.then(() => task.done());
|
||||
;
|
||||
});
|
||||
|
||||
audit.run();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,54 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>
|
||||
delaynode-maxdelay.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>
|
||||
<script src="/webaudio/resources/delay-testing.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script id="layout-test-code">
|
||||
let audit = Audit.createTaskRunner();
|
||||
|
||||
audit.define(
|
||||
{
|
||||
label: 'test',
|
||||
description:
|
||||
'Basic functionality of DelayNode with a non-default max delay time'
|
||||
},
|
||||
function(task, should) {
|
||||
|
||||
// Create offline audio context.
|
||||
let context = new OfflineAudioContext(
|
||||
1, sampleRate * renderLengthSeconds, sampleRate);
|
||||
let toneBuffer = createToneBuffer(
|
||||
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
|
||||
|
||||
let bufferSource = context.createBufferSource();
|
||||
bufferSource.buffer = toneBuffer;
|
||||
|
||||
// Create a delay node with an explicit max delay time (greater than
|
||||
// the default of 1 second).
|
||||
let delay = context.createDelay(2);
|
||||
// Set the delay time to a value greater than the default max delay
|
||||
// so we can verify the delay is working for this case.
|
||||
delayTimeSeconds = 1.5;
|
||||
delay.delayTime.value = delayTimeSeconds;
|
||||
|
||||
bufferSource.connect(delay);
|
||||
delay.connect(context.destination);
|
||||
bufferSource.start(0);
|
||||
|
||||
context.startRendering()
|
||||
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
|
||||
.then(() => task.done());
|
||||
});
|
||||
|
||||
audit.run();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,60 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>
|
||||
delaynode-maxdelaylimit.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>
|
||||
<script src="/webaudio/resources/delay-testing.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script id="layout-test-code">
|
||||
let audit = Audit.createTaskRunner();
|
||||
|
||||
audit.define(
|
||||
{
|
||||
label: 'test',
|
||||
description:
|
||||
'Tests attribute and maximum allowed delay of DelayNode'
|
||||
},
|
||||
function(task, should) {
|
||||
|
||||
// Create offline audio context.
|
||||
let context = new OfflineAudioContext(
|
||||
1, sampleRate * renderLengthSeconds, sampleRate);
|
||||
let toneBuffer = createToneBuffer(
|
||||
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
|
||||
|
||||
let bufferSource = context.createBufferSource();
|
||||
bufferSource.buffer = toneBuffer;
|
||||
|
||||
window.context = context;
|
||||
should(() => context.createDelay(180)).throw();
|
||||
should(() => context.createDelay(0)).throw();
|
||||
should(() => context.createDelay(-1)).throw();
|
||||
should(() => context.createDelay(NaN)).throw();
|
||||
;
|
||||
let delay = context.createDelay(179);
|
||||
delay.delayTime.value = delayTimeSeconds;
|
||||
window.delay = delay;
|
||||
should(
|
||||
delay.delayTime.value,
|
||||
'delay.delayTime.value = ' + delayTimeSeconds)
|
||||
.beEqualTo(delayTimeSeconds);
|
||||
|
||||
bufferSource.connect(delay);
|
||||
delay.connect(context.destination);
|
||||
bufferSource.start(0);
|
||||
|
||||
context.startRendering()
|
||||
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
|
||||
.then(() => task.done());
|
||||
});
|
||||
|
||||
audit.run();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,51 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>
|
||||
delaynode-scheduling.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>
|
||||
<script src="/webaudio/resources/delay-testing.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script id="layout-test-code">
|
||||
let audit = Audit.createTaskRunner();
|
||||
|
||||
audit.define(
|
||||
{
|
||||
label: 'test',
|
||||
description:
|
||||
'DelayNode delayTime parameter can be scheduled at a given time'
|
||||
},
|
||||
function(task, should) {
|
||||
|
||||
// Create offline audio context.
|
||||
let context = new OfflineAudioContext(
|
||||
1, sampleRate * renderLengthSeconds, sampleRate);
|
||||
let toneBuffer = createToneBuffer(
|
||||
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
|
||||
|
||||
let bufferSource = context.createBufferSource();
|
||||
bufferSource.buffer = toneBuffer;
|
||||
|
||||
let delay = context.createDelay();
|
||||
|
||||
// Schedule delay time at time zero.
|
||||
delay.delayTime.setValueAtTime(delayTimeSeconds, 0);
|
||||
|
||||
bufferSource.connect(delay);
|
||||
delay.connect(context.destination);
|
||||
bufferSource.start(0);
|
||||
|
||||
context.startRendering()
|
||||
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
|
||||
.then(() => task.done());
|
||||
});
|
||||
|
||||
audit.run();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,61 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>
|
||||
delaynode.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>
|
||||
<script src="/webaudio/resources/delay-testing.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script id="layout-test-code">
|
||||
let audit = Audit.createTaskRunner();
|
||||
|
||||
audit.define(
|
||||
{
|
||||
label: 'test',
|
||||
description: 'Tests attribute and basic functionality of DelayNode'
|
||||
},
|
||||
function(task, should) {
|
||||
|
||||
// Create offline audio context.
|
||||
let context = new OfflineAudioContext(
|
||||
1, sampleRate * renderLengthSeconds, sampleRate);
|
||||
let toneBuffer = createToneBuffer(
|
||||
context, 20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
|
||||
|
||||
let bufferSource = context.createBufferSource();
|
||||
bufferSource.buffer = toneBuffer;
|
||||
|
||||
let delay = context.createDelay();
|
||||
|
||||
window.delay = delay;
|
||||
should(delay.numberOfInputs, 'delay.numberOfInputs').beEqualTo(1);
|
||||
should(delay.numberOfOutputs, 'delay.numberOfOutputs').beEqualTo(1);
|
||||
should(delay.delayTime.defaultValue, 'delay.delayTime.defaultValue')
|
||||
.beEqualTo(0.0);
|
||||
should(delay.delayTime.value, 'delay.delayTime.value')
|
||||
.beEqualTo(0.0);
|
||||
|
||||
delay.delayTime.value = delayTimeSeconds;
|
||||
should(
|
||||
delay.delayTime.value,
|
||||
'delay.delayTime.value = ' + delayTimeSeconds)
|
||||
.beEqualTo(delayTimeSeconds);
|
||||
|
||||
bufferSource.connect(delay);
|
||||
delay.connect(context.destination);
|
||||
bufferSource.start(0);
|
||||
|
||||
context.startRendering()
|
||||
.then(buffer => checkDelayedResult(buffer, toneBuffer, should))
|
||||
.then(task.done.bind(task));
|
||||
});
|
||||
|
||||
audit.run();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,183 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>
|
||||
Test DelayNode Has No Dezippering
|
||||
</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">
|
||||
// The sample rate must be a power of two to avoid any round-off errors in
|
||||
// computing when to suspend a context on a rendering quantum boundary.
|
||||
// Otherwise this is pretty arbitrary.
|
||||
let sampleRate = 16384;
|
||||
|
||||
let audit = Audit.createTaskRunner();
|
||||
|
||||
audit.define(
|
||||
{label: 'test0', description: 'Test DelayNode has no dezippering'},
|
||||
(task, should) => {
|
||||
let context = new OfflineAudioContext(1, sampleRate, sampleRate);
|
||||
|
||||
// Simple integer ramp for testing delay node
|
||||
let buffer = new AudioBuffer(
|
||||
{length: context.length, sampleRate: context.sampleRate});
|
||||
let rampData = buffer.getChannelData(0);
|
||||
for (let k = 0; k < rampData.length; ++k) {
|
||||
rampData[k] = k + 1;
|
||||
}
|
||||
|
||||
// |delay0Frame| is the initial delay in frames. |delay1Frame| is
|
||||
// the new delay in frames. These must be integers.
|
||||
let delay0Frame = 64;
|
||||
let delay1Frame = 16;
|
||||
|
||||
let src = new AudioBufferSourceNode(context, {buffer: buffer});
|
||||
let delay = new DelayNode(
|
||||
context, {delayTime: delay0Frame / context.sampleRate});
|
||||
|
||||
src.connect(delay).connect(context.destination);
|
||||
|
||||
// After a render quantum, change the delay to |delay1Frame|.
|
||||
context.suspend(RENDER_QUANTUM_FRAMES / context.sampleRate)
|
||||
.then(() => {
|
||||
delay.delayTime.value = delay1Frame / context.sampleRate;
|
||||
})
|
||||
.then(() => context.resume());
|
||||
|
||||
src.start();
|
||||
context.startRendering()
|
||||
.then(renderedBuffer => {
|
||||
let renderedData = renderedBuffer.getChannelData(0);
|
||||
|
||||
// The first |delay0Frame| frames should be zero.
|
||||
should(
|
||||
renderedData.slice(0, delay0Frame),
|
||||
'output[0:' + (delay0Frame - 1) + ']')
|
||||
.beConstantValueOf(0);
|
||||
|
||||
// Now we have the ramp should show up from the delay.
|
||||
let ramp0 =
|
||||
new Float32Array(RENDER_QUANTUM_FRAMES - delay0Frame);
|
||||
for (let k = 0; k < ramp0.length; ++k) {
|
||||
ramp0[k] = rampData[k];
|
||||
}
|
||||
|
||||
should(
|
||||
renderedData.slice(delay0Frame, RENDER_QUANTUM_FRAMES),
|
||||
'output[' + delay0Frame + ':' +
|
||||
(RENDER_QUANTUM_FRAMES - 1) + ']')
|
||||
.beEqualToArray(ramp0);
|
||||
|
||||
// After one rendering quantum, the delay is changed to
|
||||
// |delay1Frame|.
|
||||
let ramp1 =
|
||||
new Float32Array(context.length - RENDER_QUANTUM_FRAMES);
|
||||
for (let k = 0; k < ramp1.length; ++k) {
|
||||
// ramp1[k] = 1 + k + RENDER_QUANTUM_FRAMES - delay1Frame;
|
||||
ramp1[k] =
|
||||
rampData[k + RENDER_QUANTUM_FRAMES - delay1Frame];
|
||||
}
|
||||
should(
|
||||
renderedData.slice(RENDER_QUANTUM_FRAMES),
|
||||
'output[' + RENDER_QUANTUM_FRAMES + ':]')
|
||||
.beEqualToArray(ramp1);
|
||||
})
|
||||
.then(() => task.done());
|
||||
});
|
||||
|
||||
audit.define(
|
||||
{label: 'test1', description: 'Test value setter and setValueAtTime'},
|
||||
(task, should) => {
|
||||
testWithAutomation(should, {prefix: ''}).then(() => task.done());
|
||||
});
|
||||
|
||||
audit.define(
|
||||
{label: 'test2', description: 'Test value setter and modulation'},
|
||||
(task, should) => {
|
||||
testWithAutomation(should, {
|
||||
prefix: 'With modulation: ',
|
||||
modulator: true
|
||||
}).then(() => task.done());
|
||||
});
|
||||
|
||||
// Compare .value setter with setValueAtTime, Optionally allow modulation
|
||||
// of |delayTime|.
|
||||
function testWithAutomation(should, options) {
|
||||
let prefix = options.prefix;
|
||||
// Channel 0 is the output of delay node using the setter and channel 1
|
||||
// is the output using setValueAtTime.
|
||||
let context = new OfflineAudioContext(2, sampleRate, sampleRate);
|
||||
|
||||
let merger = new ChannelMergerNode(
|
||||
context, {numberOfInputs: context.destination.channelCount});
|
||||
merger.connect(context.destination);
|
||||
|
||||
let src = new OscillatorNode(context);
|
||||
|
||||
// |delay0Frame| is the initial delay value in frames. |delay1Frame| is
|
||||
// the new delay in frames. The values here are constrained only by the
|
||||
// constraints for a DelayNode. These are pretty arbitrary except we
|
||||
// wanted them to be fractional so as not be on a frame boundary to
|
||||
// test interpolation compared with |setValueAtTime()|..
|
||||
let delay0Frame = 3.1;
|
||||
let delay1Frame = 47.2;
|
||||
|
||||
let delayTest = new DelayNode(
|
||||
context, {delayTime: delay0Frame / context.sampleRate});
|
||||
let delayRef = new DelayNode(
|
||||
context, {delayTime: delay0Frame / context.sampleRate});
|
||||
|
||||
src.connect(delayTest).connect(merger, 0, 0);
|
||||
src.connect(delayRef).connect(merger, 0, 1);
|
||||
|
||||
if (options.modulator) {
|
||||
// Fairly arbitrary modulation of the delay time, with a peak
|
||||
// variation of 10 ms.
|
||||
let mod = new OscillatorNode(context, {frequency: 1000});
|
||||
let modGain = new GainNode(context, {gain: .01});
|
||||
mod.connect(modGain);
|
||||
modGain.connect(delayTest.delayTime);
|
||||
modGain.connect(delayRef.delayTime);
|
||||
mod.start();
|
||||
}
|
||||
|
||||
// The time at which the delay time of |delayTest| node will be
|
||||
// changed. This MUST be on a render quantum boundary, but is
|
||||
// otherwise arbitrary.
|
||||
let changeTime = 3 * RENDER_QUANTUM_FRAMES / context.sampleRate;
|
||||
|
||||
// Schedule the delay change on |delayRef| and also apply the value
|
||||
// setter for |delayTest| at |changeTime|.
|
||||
delayRef.delayTime.setValueAtTime(
|
||||
delay1Frame / context.sampleRate, changeTime);
|
||||
context.suspend(changeTime)
|
||||
.then(() => {
|
||||
delayTest.delayTime.value = delay1Frame / context.sampleRate;
|
||||
})
|
||||
.then(() => context.resume());
|
||||
|
||||
src.start();
|
||||
|
||||
return context.startRendering().then(renderedBuffer => {
|
||||
let actual = renderedBuffer.getChannelData(0);
|
||||
let expected = renderedBuffer.getChannelData(1);
|
||||
|
||||
let match = should(actual, prefix + '.value setter output')
|
||||
.beEqualToArray(expected);
|
||||
should(
|
||||
match,
|
||||
prefix + '.value setter output matches setValueAtTime output')
|
||||
.beTrue();
|
||||
});
|
||||
}
|
||||
|
||||
audit.run();
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Loading…
Add table
Add a link
Reference in a new issue