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 // Go through every sample and make sure it's 0, except at positions in sampleOffsets.
58 for (var i = 0; i < buffer.length; ++i) {
59 // Make sure left == right
60 if (bufferDataL[i] != bufferDataR[i]) {
61 testFailed("Rendered buffer left and right channels are not identical.");
66 if (bufferDataL[i] != 0) {
67 // Make sure this index is in sampleOffsets
69 for (var j = 0; j < sampleOffsets.length; ++j) {
70 if (sampleOffsets[j] == i) {
77 testFailed("Non-zero sample found at wrong sample offset.");
85 testPassed("All events rendered with sample-accuracy.");
87 testFailed("Events NOT rendered with sample-accuracy.");
94 if (window.layoutTestController) {
95 layoutTestController.dumpAsText();
96 layoutTestController.waitUntilDone();
99 window.jsTestIsAsync = true;
101 // Create offline audio context.
102 context = new webkitAudioContext(2, sampleRate * lengthInSeconds, sampleRate);
105 for (var i = 0; i < sampleOffsets.length; ++i) {
106 var timeInSeconds = sampleOffsets[i] * sampleRate;
107 playNote(timeInSeconds);
110 context.oncomplete = checkSampleAccuracy;
111 context.startRendering();
118 <script src="../fast/js/resources/js-test-post.js"></script>