blob: 510b1ff790bf361f0635cd1f4a847685b8db7f6e [file] [log] [blame]
<!DOCTYPE html>
<!--
Tests that we are able to schedule a series of notes to playback with sample-accuracy.
We use an impulse so we can tell exactly where the rendering is happening.
-->
<html>
<head>
<script src="../fast/js/resources/js-test-pre.js"></script>
<script type="text/javascript" src="resources/audio-testing.js"></script>
<script type="text/javascript" src="resources/buffer-loader.js"></script>
</head>
<body>
<div id="description"></div>
<div id="console"></div>
<script>
description("Tests sample-accurate scheduling.");
var sampleRate = 44100.0;
var lengthInSeconds = 4;
var context = 0;
var bufferLoader = 0;
var impulse;
// See if we can render at exactly these sample offsets.
var sampleOffsets = [0, 3, 512, 517, 1000, 1005, 20000, 21234, 37590];
function createImpulse() {
// An impulse has a value of 1 at time 0, and is otherwise 0.
impulse = context.createBuffer(2, 512, sampleRate);
var sampleDataL = impulse.getChannelData(0);
var sampleDataR = impulse.getChannelData(1);
sampleDataL[0] = 1.0;
sampleDataR[0] = 1.0;
}
function playNote(time) {
var bufferSource = context.createBufferSource();
bufferSource.buffer = impulse;
bufferSource.connect(context.destination);
bufferSource.noteOn(time);
}
function checkSampleAccuracy(event) {
var buffer = event.renderedBuffer;
var bufferDataL = buffer.getChannelData(0);
var bufferDataR = buffer.getChannelData(1);
var success = true;
var impulseCount = 0;
var badOffsetCount = false;
// Go through every sample and make sure it's 0, except at positions in sampleOffsets.
for (var i = 0; i < buffer.length; ++i) {
// Make sure left == right
if (bufferDataL[i] != bufferDataR[i]) {
testFailed("Rendered buffer left and right channels are not identical.");
success = false;
break;
}
if (bufferDataL[i] != 0) {
// Make sure this index is in sampleOffsets
var found = false;
for (var j = 0; j < sampleOffsets.length; ++j) {
if (sampleOffsets[j] == i) {
found = true;
break;
}
}
++impulseCount;
if (!found) {
testFailed("Non-zero sample found at sample offset " + i);
success = false;
++badOffsetCount;
}
}
}
if (impulseCount == sampleOffsets.length) {
if (badOffsetCount == 0) {
testPassed("Expected number of events found.");
} else {
testFailed("Expected number of events found, but " + badOffsetCount + " are at incorrect offsets.");
success = false;
}
} else {
testFailed("Expected " + sampleOffsets.length + " impulses but only found " + impulseCount);
success = false;
}
if (success) {
testPassed("All events rendered with sample-accuracy.");
} else {
testFailed("Events NOT rendered with sample-accuracy.");
}
finishJSTest();
}
function runTest() {
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
window.jsTestIsAsync = true;
// Create offline audio context.
context = new webkitOfflineAudioContext(2, sampleRate * lengthInSeconds, sampleRate);
createImpulse();
for (var i = 0; i < sampleOffsets.length; ++i) {
var timeInSeconds = sampleOffsets[i] / sampleRate;
playNote(timeInSeconds);
}
context.oncomplete = checkSampleAccuracy;
context.startRendering();
}
runTest();
</script>
<script src="../fast/js/resources/js-test-post.js"></script>
</body>
</html>