4 Tests that we are able to schedule a series of notes to playback with sample-accuracy.
5 We use an impulse so we can tell exactly where the rendering is happening.
10 <script src="../fast/js/resources/js-test-pre.js"></script>
11 <script type="text/javascript" src="resources/audio-testing.js"></script>
12 <script type="text/javascript" src="resources/buffer-loader.js"></script>
17 <div id="description"></div>
18 <div id="console"></div>
21 description("Tests sample-accurate scheduling.");
23 var sampleRate = 44100.0;
24 var lengthInSeconds = 4;
30 // See if we can render at exactly these sample offsets.
31 var sampleOffsets = [0, 3, 512, 517, 1000, 1005, 20000, 21234, 37590];
33 function createImpulse() {
34 // An impulse has a value of 1 at time 0, and is otherwise 0.
35 impulse = context.createBuffer(2, 512, sampleRate);
36 var sampleDataL = impulse.getChannelData(0);
37 var sampleDataR = impulse.getChannelData(1);
42 function playNote(time) {
43 var bufferSource = context.createBufferSource();
44 bufferSource.buffer = impulse;
45 bufferSource.connect(context.destination);
46 bufferSource.noteOn(time);
49 function checkSampleAccuracy(event) {
50 var buffer = event.renderedBuffer;
52 var bufferDataL = buffer.getChannelData(0);
53 var bufferDataR = buffer.getChannelData(1);
57 var badOffsetCount = false;
59 // Go through every sample and make sure it's 0, except at positions in sampleOffsets.
60 for (var i = 0; i < buffer.length; ++i) {
61 // Make sure left == right
62 if (bufferDataL[i] != bufferDataR[i]) {
63 testFailed("Rendered buffer left and right channels are not identical.");
68 if (bufferDataL[i] != 0) {
69 // Make sure this index is in sampleOffsets
71 for (var j = 0; j < sampleOffsets.length; ++j) {
72 if (sampleOffsets[j] == i) {
79 testFailed("Non-zero sample found at sample offset " + i);
86 if (impulseCount == sampleOffsets.length) {
87 if (badOffsetCount == 0) {
88 testPassed("Expected number of events found.");
90 testFailed("Expected number of events found, but " + badOffsetCount + " are at incorrect offsets.");
94 testFailed("Expected " + sampleOffsets.length + " impulses but only found " + impulseCount);
99 testPassed("All events rendered with sample-accuracy.");
101 testFailed("Events NOT rendered with sample-accuracy.");
108 if (window.testRunner) {
109 testRunner.dumpAsText();
110 testRunner.waitUntilDone();
113 window.jsTestIsAsync = true;
115 // Create offline audio context.
116 context = new webkitOfflineAudioContext(2, sampleRate * lengthInSeconds, sampleRate);
119 for (var i = 0; i < sampleOffsets.length; ++i) {
120 var timeInSeconds = sampleOffsets[i] / sampleRate;
121 playNote(timeInSeconds);
124 context.oncomplete = checkSampleAccuracy;
125 context.startRendering();
132 <script src="../fast/js/resources/js-test-post.js"></script>