Many WebAudio js-tests use waitUntilDone
[WebKit-https.git] / LayoutTests / webaudio / audiochannelmerger-stereo.html
1 <!DOCTYPE html>
2
3 <!--
4 Tests that that we can merge two mono streams into a stereo stream.
5 -->
6
7 <html>
8 <head>
9 <script src="../resources/js-test.js"></script>
10 <script type="text/javascript" src="resources/audio-testing.js"></script>
11 <script type="text/javascript" src="resources/buffer-loader.js"></script>
12 </head>
13
14 <body>
15
16 <div id="description"></div>
17 <div id="console"></div>
18
19 <script>
20 description("Tests audio channel merging of two mono streams into a single stereo stream.");
21
22 var sampleRate = 44100.0;
23 var lengthInSampleFrames = 512;
24
25 var context = 0;
26 var bufferLoader = 0;
27 var buffer1;
28 var buffer2;
29 var bufferSource1;
30 var bufferSource2;
31 var channelMerger;
32
33 function createBufferWithDCOffset(length, sampleRate, offset) {
34     var buffer = context.createBuffer(1, length, sampleRate);
35     var data = buffer.getChannelData(0);
36     for (var i = 0; i < buffer.length; ++i)
37         data[i] = offset;
38     
39     return buffer;
40 }
41
42 // checkResult() checks that the rendered buffer is stereo and that the left channel is all -1 and right channel all +1.
43 function checkResult(event) {
44     var buffer = event.renderedBuffer;
45
46     var success = true;
47
48     if (buffer.numberOfChannels == 2) {
49         var bufferDataL = buffer.getChannelData(0);
50         var bufferDataR = buffer.getChannelData(1);
51     
52         // Go through every sample and make sure it's all -1 for the left-channel, and all +1 for the right-channel.
53         for (var i = 0; i < buffer.length; ++i) {
54             if (bufferDataL[i] != -1 || bufferDataR[i] != 1) {
55                 success = false;
56                 break;
57             }
58         }
59     } else {
60         success = false;
61     }
62
63     if (success) {
64         testPassed("Correctly merged from two mono streams to stereo.");
65     } else {
66         testFailed("Merging error from two mono streams to stereo.");
67     }
68
69     finishJSTest();
70 }
71
72 function runTest() {
73     window.jsTestIsAsync = true;
74         
75     // Create stereo offline audio context.
76     context = new webkitOfflineAudioContext(2, lengthInSampleFrames, sampleRate);
77
78     // Create two mono buffers, one having all -1 values, the other all +1.
79     buffer1 = createBufferWithDCOffset(lengthInSampleFrames, sampleRate, -1);
80     buffer2 = createBufferWithDCOffset(lengthInSampleFrames, sampleRate, 1);
81
82     // Create a buffer source for each of these buffers.
83     bufferSource1 = context.createBufferSource();
84     bufferSource2 = context.createBufferSource();
85     bufferSource1.buffer = buffer1;
86     bufferSource2.buffer = buffer2;
87
88     // Create a channel merger and connect it so that it merges two mono streams into a single stereo stream.
89     
90     channelMerger = context.createChannelMerger();
91     bufferSource1.connect(channelMerger, 0, 0); // connect to input 0 of the channel merger
92     bufferSource2.connect(channelMerger, 0, 1); // connect to input 1 of the channel merger
93     
94     channelMerger.connect(context.destination);
95
96     // Trigger both sources to start at the beginning.
97     bufferSource1.start(0);
98     bufferSource2.start(0);
99     
100     context.oncomplete = checkResult;
101     context.startRendering();
102 }
103
104 runTest();
105
106 </script>
107 </body>
108 </html>