blob: 38c64af37233cfb680c3495ca47553b305212826 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>
AudioParam Value Setter Error Tests
</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>
<script src="../resources/audioparam-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
let sampleRate = 16384;
// Number of frames in a rendering quantum.
// Test doesn't need to run for very long.
let renderDuration = 0.2;
let renderFrames = renderDuration * sampleRate;
let automationEndTime = 0.1;
let audit = Audit.createTaskRunner();
audit.define(
'Test value setter with setValueCurveAtTime', (task, should) => {
let context = new OfflineAudioContext(
{length: renderFrames, sampleRate: sampleRate});
let src = new ConstantSourceNode(context);
let gain = new GainNode(context);
src.connect(gain).connect(context.destination);
let render_quantum_duration =
RENDER_QUANTUM_FRAMES / context.sampleRate;
// Start and duration of the curve automation. These are fairly
// arbitrary, but the start should be at least 2 render quanta from
// the beginning to allow time for testing the value setter before
// the curve starts. The duration should be at least 2 render
// quanta to allow us to apply the value setter in the middle
// (somewhere) of the curve.
let curveStartTime = 3 * render_quantum_duration;
let curveDuration = 4 * render_quantum_duration;
should(
() => {
gain.gain.setValueCurveAtTime(
[-2, 1], curveStartTime, curveDuration);
},
`setValueCurveAtTime([...], ${curveStartTime}, ${
curveDuration
})`)
.notThrow();
// Applying the value setter outside the curve automation should not
// throw. The gain value is arbitrary.
context.suspend(curveStartTime - render_quantum_duration)
.then(() => {
should(
() => gain.gain.value = Math.PI,
'Using value setter at time ' + context.currentTime +
' before curve starts')
.notThrow();
})
.then(() => context.resume());
// Applying the value setter inside the curve automation should not
// throw. The gain value is arbitrary.
context.suspend(curveStartTime + curveDuration / 2)
.then(() => {
should(
() => gain.gain.value = 0,
'Using value setter at time ' + context.currentTime +
' in the middle of the curve')
.throw(DOMException, 'NotSupportedError');
})
.then(() => context.resume());
src.start();
// Don't care about the actual output.
context.startRendering().then(() => task.done());
});
audit.run();
</script>
</body>
</html>