blob: e0ece4c4436a7f7da1cccec4ac9d9b7401800fef [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>
audiobuffersource-late-start.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 renderQuantum = 128;
let sampleRate = 44100;
let renderDuration = 0.25;
let startTime = 0.5 * renderDuration;
let audit = Audit.createTaskRunner();
// Calculate the index for actual start time.
function getStartIndex(time) {
let startIndex = time * sampleRate;
startIndex = renderQuantum *
Math.floor((startIndex + renderQuantum - 1) / renderQuantum);
return startIndex;
}
// Get the index of value change.
function getValueChangeIndex(array, targetValue) {
return array.findIndex(function(element, index) {
if (element === targetValue)
return true;
});
}
audit.define('test-late-start', (task, should) => {
let context =
new OfflineAudioContext(1, renderDuration * sampleRate, sampleRate);
let dcOffsetbuffer = createConstantBuffer(context, 1, 1.0);
let source = context.createBufferSource();
source.buffer = dcOffsetbuffer;
source.loop = true;
source.connect(context.destination);
// Schedule source.start(0) at 0.01 second. The specified timing of
// start() call is already passed in terms of the context time. So the
// argument |0| will be clamped to the current context time.
//
// With the sample rate of 44100, 0.01 second is 441 samples. Rounding
// it down to the render quantum gives 384 samples. This is clearly
// larger than a single render quantum.
//
// See issue: crbug.com/462167
context.suspend(startTime).then(function() {
source.start(0);
context.resume();
});
// Start rendering and verify result: this verifies if 1) the rendered
// buffer contains at least one non-zero value and 2) the non-zero value
// is found later than the first output sample.
context.startRendering()
.then(function(buffer) {
let channelData = buffer.getChannelData(0);
let startIndex = getStartIndex(startTime);
let nonZeroValueIndex = getValueChangeIndex(channelData, 1.0);
should(channelData, 'The output').containValues([0, 1]);
should(nonZeroValueIndex, 'The index of value change')
.beEqualTo(startIndex);
should(
nonZeroValueIndex, 'The index of the first non-zero sample')
.notBeEqualTo(0)
})
.then(() => task.done());
});
audit.run();
</script>
</body>
</html>