[Release] Webkit-EFL Ver. 2.0_beta_118996_0.6.24
[framework/web/webkit-efl.git] / LayoutTests / webaudio / audiochannelsplitter.html
1 <!DOCTYPE html>
2
3 <!--
4 Tests that AudioChannelSplitter works correctly.
5 -->
6
7 <html>
8 <head>
9 <script src="../fast/js/resources/js-test-pre.js"></script>
10 <script type="text/javascript" src="resources/audio-testing.js"></script>
11 </head>
12
13 <body>
14
15 <div id="description"></div>
16 <div id="console"></div>
17
18 <script>
19 description("Tests AudioChannelSplitter.");
20
21 var sampleRate = 44100.0;
22 var lengthInSampleFrames = 512;
23
24 var context = 0;
25 var sourceBuffer;
26 var sourceNode;
27 var channelSplitter;
28 var channelMerger;
29
30 function createStereoBufferWithDCOffset(length, sampleRate, offset) {
31     var buffer = context.createBuffer(2, length, sampleRate);
32     var n = buffer.length;
33     var channelL = buffer.getChannelData(0);
34     var channelR = buffer.getChannelData(1);
35
36     for (var i = 0; i < n; ++i) {
37         channelL[i] = offset;
38         channelR[i] = -1.0 * offset;
39     }
40
41     return buffer;
42 }
43
44 // checkResult() checks that the rendered buffer is stereo and that the left channel is all -1 and right channel all +1.
45 // In other words, we've reversed the order of the two channels.
46 function checkResult(event) {
47     var buffer = event.renderedBuffer;
48
49     var success = true;
50
51     if (buffer.numberOfChannels == 2) {
52         var bufferDataL = buffer.getChannelData(0);
53         var bufferDataR = buffer.getChannelData(1);
54
55         // Go through every sample and make sure it's all -1 for the left-channel, and all +1 for the right-channel.
56         for (var i = 0; i < buffer.length; ++i) {
57             if (bufferDataL[i] != -1 || bufferDataR[i] != 1) {
58                 success = false;
59                 break;
60             }
61         }
62     } else {
63         success = false;
64     }
65
66     if (success) {
67         testPassed("Correctly exchanged left and right channels.");
68     } else {
69         testFailed("Error on exchanging left and right channels.");
70     }
71
72     finishJSTest();
73 }
74
75 function runTest() {
76     if (window.layoutTestController) {
77         layoutTestController.dumpAsText();
78         layoutTestController.waitUntilDone();
79     }
80
81     window.jsTestIsAsync = true;
82
83     // Create stereo offline audio context.
84     context = new webkitAudioContext(2, lengthInSampleFrames, sampleRate);
85
86     try {
87         var splitternode = context.createChannelSplitter(0);
88         testFailed("Exception should be thrown for numberOfOutputs <= 0.");
89     } catch(e) {
90         testPassed("Exception been thrown for numberOfOutputs <= 0.");
91     }
92
93     try {
94         var splitternode = context.createChannelSplitter(33);
95         testFailed("Exception should be thrown for numerOfOutputs >= 32.");
96     } catch(e) {
97         testPassed("Exception been thrown for numberOfOutputs >= 32.");
98     }
99
100     // Create a stereo buffer, with all +1 values in left channel, all -1 in right channel.
101     sourceBuffer = createStereoBufferWithDCOffset(lengthInSampleFrames, sampleRate, 1);
102
103     sourceNode = context.createBufferSource();
104     sourceNode.buffer = sourceBuffer;
105
106     // Create a channel splitter and connect it so that it split the stereo stream into two mono streams.
107     channelSplitter = context.createChannelSplitter(2);
108     sourceNode.connect(channelSplitter);
109
110     // Create a channel merger to merge the output of channel splitter.
111     channelMerger = context.createChannelMerger();
112     channelMerger.connect(context.destination);
113
114     // When merging, exchange channel layout: left->right, right->left
115     channelSplitter.connect(channelMerger, 0, 1);
116     channelSplitter.connect(channelMerger, 1, 0);
117
118     sourceNode.noteOn(0);
119
120     context.oncomplete = checkResult;
121     context.startRendering();
122 }
123
124 runTest();
125
126 </script>
127
128 <script src="../fast/js/resources/js-test-post.js"></script>
129 </body>
130 </html>