ab62c0beb0fcfe781f05c306a916da0355df4350
[WebKit-https.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.testRunner) {
77         testRunner.dumpAsText();
78         testRunner.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     try {
101         var splitternode = context.createChannelSplitter(32);
102         testPassed("AudioChannelSplitter created successfully with numberOfOutputs = 32.");
103         if (splitternode.numberOfOutputs === 32)
104             testPassed("AudioChannelSplitter has 32 outputs when it is created with numberOfOutputs = 32.");
105         else
106             testFailed("AudioChannelSplitter should have 32 outputs when it is created with numberOfOutputs = 32.");
107
108         if (splitternode.numberOfInputs === 1)
109             testPassed("AudioChannelSplitter has one input.");
110         else
111             testFailed("AudioChannelSplitter should have one input.");
112     } catch(e) {
113         testFailed("Failed to create AudioChannelSplitter with numberOfInputs = 32.");
114     }
115
116     try {
117         var splitternode = context.createChannelSplitter();
118         testPassed("AudioChannelSplitter created successfully with empty parameter.");
119         if (splitternode.numberOfOutputs === 6)
120             testPassed("AudioChannelSplitter has 6 outputs when it is created with empty parameter.");
121         else
122             testFailed("AudioChannelSplitter should have 6 outputs when it is created with empty parameter.");
123     } catch(e) {
124         testFailed("Failed to create AudioChannelSplitter with empty parameter.");
125     }
126
127     // Create a stereo buffer, with all +1 values in left channel, all -1 in right channel.
128     sourceBuffer = createStereoBufferWithDCOffset(lengthInSampleFrames, sampleRate, 1);
129
130     sourceNode = context.createBufferSource();
131     sourceNode.buffer = sourceBuffer;
132
133     // Create a channel splitter and connect it so that it split the stereo stream into two mono streams.
134     channelSplitter = context.createChannelSplitter(2);
135     sourceNode.connect(channelSplitter);
136
137     // Create a channel merger to merge the output of channel splitter.
138     channelMerger = context.createChannelMerger();
139     channelMerger.connect(context.destination);
140
141     // When merging, exchange channel layout: left->right, right->left
142     channelSplitter.connect(channelMerger, 0, 1);
143     channelSplitter.connect(channelMerger, 1, 0);
144
145     sourceNode.noteOn(0);
146
147     context.oncomplete = checkResult;
148     context.startRendering();
149 }
150
151 runTest();
152
153 </script>
154
155 <script src="../fast/js/resources/js-test-post.js"></script>
156 </body>
157 </html>