Refactoring: Pull all fullscreen code out of Document and into its own helper class
[WebKit-https.git] / LayoutTests / webaudio / sample-accurate-scheduling.html
1 <!DOCTYPE html>
2
3 <!--
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.
6 -->
7
8 <html>
9 <head>
10 <script src="../resources/js-test.js"></script>
11 <script type="text/javascript" src="resources/audio-testing.js"></script>
12 <script type="text/javascript" src="resources/buffer-loader.js"></script>
13 </head>
14
15 <body>
16
17 <div id="description"></div>
18 <div id="console"></div>
19
20 <script>
21 description("Tests sample-accurate scheduling.");
22
23 var sampleRate = 44100.0;
24 var lengthInSeconds = 4;
25
26 var context = 0;
27 var bufferLoader = 0;
28 var impulse;
29
30 // See if we can render at exactly these sample offsets.
31 var sampleOffsets = [0, 3, 512, 517, 1000, 1005, 20000, 21234, 37590];
32
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);
38     sampleDataL[0] = 1.0;
39     sampleDataR[0] = 1.0;
40 }
41
42 function playNote(time) {
43     var bufferSource = context.createBufferSource();
44     bufferSource.buffer = impulse;
45     bufferSource.connect(context.destination);
46     bufferSource.start(time);
47 }
48
49 function checkSampleAccuracy(event) {
50     var buffer = event.renderedBuffer;
51
52     var bufferDataL = buffer.getChannelData(0);
53     var bufferDataR = buffer.getChannelData(1);
54
55     var success = true;
56     var impulseCount = 0;
57     var badOffsetCount = false;
58     
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.");
64             success = false;
65             break;
66         }
67         
68         if (bufferDataL[i] != 0) {
69             // Make sure this index is  in sampleOffsets
70             var found = false;
71             for (var j = 0; j < sampleOffsets.length; ++j) {
72                 if (sampleOffsets[j] == i) {
73                     found = true;
74                     break;
75                 }
76             }
77             ++impulseCount;
78             if (!found) {
79                 testFailed("Non-zero sample found at sample offset " + i);
80                 success = false;
81                 ++badOffsetCount;
82             }
83         }
84     }
85
86     if (impulseCount == sampleOffsets.length) {
87         if (badOffsetCount == 0) {
88             testPassed("Expected number of events found.");
89         } else {
90             testFailed("Expected number of events found, but " + badOffsetCount + " are at incorrect offsets.");
91             success = false;
92         }
93     } else {
94         testFailed("Expected " + sampleOffsets.length + " impulses but only found " + impulseCount);
95         success = false;
96     }
97
98     if (success) {
99         testPassed("All events rendered with sample-accuracy.");
100     } else {
101         testFailed("Events NOT rendered with sample-accuracy.");
102     }
103
104     finishJSTest();
105 }
106
107 function runTest() {
108     window.jsTestIsAsync = true;
109         
110     // Create offline audio context.
111     context = new webkitOfflineAudioContext(2, sampleRate * lengthInSeconds, sampleRate);
112     createImpulse();    
113
114     for (var i = 0; i < sampleOffsets.length; ++i) {
115         var timeInSeconds = sampleOffsets[i] / sampleRate;
116         playNote(timeInSeconds);
117     }
118     
119     context.oncomplete = checkSampleAccuracy;
120     context.startRendering();
121 }
122
123 runTest();
124
125 </script>
126 </body>
127 </html>