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