tizen beta release
[profile/ivi/webkit-efl.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="../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>
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.noteOn(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     
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.");
62             success = false;
63             break;
64         }
65         
66         if (bufferDataL[i] != 0) {
67             // Make sure this index is  in sampleOffsets
68             var found = false;
69             for (var j = 0; j < sampleOffsets.length; ++j) {
70                 if (sampleOffsets[j] == i) {
71                     found = true;
72                     break;
73                 }
74             }
75             
76             if (!found) {
77                 testFailed("Non-zero sample found at wrong sample offset.");
78                 success = false;
79                 break;
80             }
81         }
82     }
83
84     if (success) {
85         testPassed("All events rendered with sample-accuracy.");
86     } else {
87         testFailed("Events NOT rendered with sample-accuracy.");
88     }
89
90     finishJSTest();
91 }
92
93 function runTest() {
94     if (window.layoutTestController) {
95         layoutTestController.dumpAsText();
96         layoutTestController.waitUntilDone();
97     }
98     
99     window.jsTestIsAsync = true;
100         
101     // Create offline audio context.
102     context = new webkitAudioContext(2, sampleRate * lengthInSeconds, sampleRate);
103     createImpulse();    
104
105     for (var i = 0; i < sampleOffsets.length; ++i) {
106         var timeInSeconds = sampleOffsets[i] * sampleRate;
107         playNote(timeInSeconds);
108     }
109     
110     context.oncomplete = checkSampleAccuracy;
111     context.startRendering();
112 }
113
114 runTest();
115
116 </script>
117
118 <script src="../fast/js/resources/js-test-post.js"></script>
119 </body>
120 </html>