WebProcessCache should keep track of processes being added
[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="../resources/js-test.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     window.jsTestIsAsync = true;
77
78     // Create stereo offline audio context.
79     context = new webkitOfflineAudioContext(2, lengthInSampleFrames, sampleRate);
80
81     try {
82         var splitternode = context.createChannelSplitter(0);
83         testFailed("IndexSizeError should be thrown for numberOfOutputs <= 0.");
84     } catch(e) {
85         if (e.code === DOMException.INDEX_SIZE_ERR)
86             testPassed("IndexSizeError been thrown for numberOfOutputs <= 0.");
87         else
88             testFailed("IndexSizeError should be thrown for numberOfOutputs <= 0.");
89     }
90
91     try {
92         var splitternode = context.createChannelSplitter(33);
93         testFailed("IndexSizeError should be thrown for numerOfOutputs > 32.");
94     } catch(e) {
95         if (e.code === DOMException.INDEX_SIZE_ERR)
96             testPassed("IndexSizeError been thrown for numberOfOutputs > 32.");
97         else
98             testFailed("IndexSizeError should be thrown for numerOfOutputs > 32.");
99     }
100
101     try {
102         var splitternode = context.createChannelSplitter(32);
103         testPassed("AudioChannelSplitter created successfully with numberOfOutputs = 32.");
104         if (splitternode.numberOfOutputs === 32)
105             testPassed("AudioChannelSplitter has 32 outputs when it is created with numberOfOutputs = 32.");
106         else
107             testFailed("AudioChannelSplitter should have 32 outputs when it is created with numberOfOutputs = 32.");
108
109         if (splitternode.numberOfInputs === 1)
110             testPassed("AudioChannelSplitter has one input.");
111         else
112             testFailed("AudioChannelSplitter should have one input.");
113     } catch(e) {
114         testFailed("Failed to create AudioChannelSplitter with numberOfInputs = 32.");
115     }
116
117     try {
118         var splitternode = context.createChannelSplitter();
119         testPassed("AudioChannelSplitter created successfully with empty parameter.");
120         if (splitternode.numberOfOutputs === 6)
121             testPassed("AudioChannelSplitter has 6 outputs when it is created with empty parameter.");
122         else
123             testFailed("AudioChannelSplitter should have 6 outputs when it is created with empty parameter.");
124
125         if (splitternode.toString().indexOf("ChannelSplitterNode") > -1)
126             testPassed("ChannelSplitterNode Object is available.");
127         else
128             testFailed("ChannelSplitterNode Object is not available.");
129     } catch(e) {
130         testFailed("Failed to create AudioChannelSplitter with empty parameter.");
131     }
132
133     // Create a stereo buffer, with all +1 values in left channel, all -1 in right channel.
134     sourceBuffer = createStereoBufferWithDCOffset(lengthInSampleFrames, sampleRate, 1);
135
136     sourceNode = context.createBufferSource();
137     sourceNode.buffer = sourceBuffer;
138
139     // Create a channel splitter and connect it so that it split the stereo stream into two mono streams.
140     channelSplitter = context.createChannelSplitter(2);
141     sourceNode.connect(channelSplitter);
142
143     // Create a channel merger to merge the output of channel splitter.
144     channelMerger = context.createChannelMerger();
145     channelMerger.connect(context.destination);
146
147     // When merging, exchange channel layout: left->right, right->left
148     channelSplitter.connect(channelMerger, 0, 1);
149     channelSplitter.connect(channelMerger, 1, 0);
150
151     sourceNode.start(0);
152
153     context.oncomplete = checkResult;
154     context.startRendering();
155 }
156
157 runTest();
158
159 </script>
160 </body>
161 </html>