blob: 15edb8b99246b95547c26ee9b43873f279bf99ca [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>
offlineaudiocontext-suspend-resume-sequence.html
</title>
<script src="../../imported/w3c/web-platform-tests/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 id="layout-test-code">
let audit = Audit.createTaskRunner();
let context;
// The sample rate is multiple of the rendering quantum, so suspension
// times fall in to the render quantum boundary.
let renderQuantum = 128;
let sampleRate = renderQuantum * 100;
let renderDuration = 2;
// These numbers are in an arbitrary order, but not randomly generated in
// runtime to avoid moving pieces. However, it is safe to arrange them
// in a random order in runtime.
//
// Also these numbers are multiple of 0.25, so they are supposed to fall
// in the render quantum boundary for easier and more intuitive
// verification.
let suspendTimes = [0.25, 0.75, 1.0, 0.5, 1.25, 0.0, 1.75];
// Sorted ascending suspend time is our expected result.
let expectedSuspendTimes = suspendTimes.slice(0).sort(function(a, b) {
return a - b;
});
let actualSuspendTimes = [];
audit.define(
{
label: 'test',
description: 'resume() and suspend() with timed sequence'
},
(task, should) => {
context = new OfflineAudioContext(
1, sampleRate * renderDuration, sampleRate);
for (let i = 0; i < suspendTimes.length; i++) {
// Schedule suspends in a random time order, but the actual
// suspend must happen in ascending time order.
scheduleSuspend(i, suspendTimes[i], should);
}
context.startRendering()
.then(buffer => verifyResult(should))
.then(() => task.done());
});
audit.run();
function scheduleSuspend(index, suspendTime, should) {
should(
() => context.suspend(suspendTime).then(() => {
actualSuspendTimes.push(suspendTime);
context.resume();
}),
'Scheduling suspend #' + index + ' at ' + suspendTime +
' second(s)')
.notThrow();
}
function verifyResult(should) {
for (let i = 0; i < actualSuspendTimes.length; i++) {
let scheduledOrder = suspendTimes.indexOf(actualSuspendTimes[i]);
let expectedOrder =
expectedSuspendTimes.indexOf(actualSuspendTimes[i]);
should(
i,
'The resolution order of suspend #' + scheduledOrder + ' is ' +
i + ' at ' + suspendTimes[scheduledOrder].toFixed(2) +
' second(s)')
.beEqualTo(expectedOrder);
}
}
</script>
</body>
</html>