Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / webaudio / channelmerger-channel-limit.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <html>
3   <head>
4     <script src="resources/compatibility.js"></script>
5     <script src="resources/audio-testing.js"></script>
6     <script src="../resources/js-test.js"></script>
7   </head>
8
9   <body>
10     <div id="description"></div>
11     <div id="console"></div>
12
13     <script>
14       description("Test that ChannelMergerNode can handle many input channels");
15
16       var sampleRate = 44100;
17
18       // Number of samples to render
19       var renderLengthSamples = 2048;
20
21       // This is the max number of channels that blink WebAudio currently supports.  (Would be nice
22       // to be able to query something to get this value.)
23       var maxNumberOfChannels = 32;
24
25       // Number of channels in the source.  Should be different from maxNumberOfChannels but more
26       // than half of maxNumberOfChannels so we can verify that the ChannelMergerNode is behaving
27       // correctly.
28       var numberOfSourceChannels = 25;
29
30       var context;
31       var merger;
32       var source;
33       var buffer;
34       var renderedData;
35       var timeData = Array(maxNumberOfChannels);
36
37       function generateSourceBuffer() {
38           // Create a buffer with |numberOfSourceChannels| channels, with each channel containing a
39           // constant value depending on the channel number.
40           var buffer = context.createBuffer(numberOfSourceChannels, renderLengthSamples, sampleRate);
41           for (k = 0; k < buffer.numberOfChannels; ++k) {
42               var data = buffer.getChannelData(k);
43               for (var n = 0; n < data.length; ++n) {
44                   data[n] = k + 1;
45               }
46           }
47           return buffer;
48       }
49
50       function hasCorrectData(channelNumber, buffer) {
51           var isCorrect = true;
52           var expectedValue = 1 + (channelNumber % numberOfSourceChannels);
53
54           for (var k = 0; k < buffer.length; ++k) {
55               if (buffer[k] != expectedValue) {
56                   isCorrect = false;
57                   break;
58               }
59           }
60           return isCorrect;
61       }
62
63       function checkResult(event) {
64           renderedData = event.renderedBuffer;
65           var success = true;
66
67           // If we get here, the merger node accepted many input channels.
68           testPassed("ChannelMergerNode accepted many input channels.");
69
70           // Verify that the outputs have the expected values.
71           for (var k = 0; k < renderedData.numberOfChannels; ++k) {
72              timeData[k] = renderedData.getChannelData(k);
73              if (hasCorrectData(k, timeData[k])) {
74                  testPassed("Channel " + k + " has the expected data.");
75              } else {
76                  success = false;
77                  testFailed("Channel " + k + " did not have the expected data.");
78              }
79           }
80
81           if (renderedData.numberOfChannels != maxNumberOfChannels) {
82               testFailed("Not all channels could be tested because OfflineAudioContext only supports "
83                          + renderedData.numberOfChannels + " channels.");
84           }
85
86           if (success)
87               testPassed("ChannerMergerNode handled many input channels correctly.");
88           else
89               testFailed("ChannerMergerNode failed to handle many input channels correctly.");
90
91           finishJSTest();
92       }
93
94       function runTest() {
95           if (window.testRunner) {
96               testRunner.dumpAsText();
97               testRunner.waitUntilDone();
98           }
99
100           window.jsTestIsAsync = true;
101
102           // Create offline audio context.
103           context = new OfflineAudioContext(maxNumberOfChannels, renderLengthSamples, sampleRate);
104
105           // This is a slightly simplified test case from crbug.com/345174.
106           merger = context.createChannelMerger();
107           source = context.createBufferSource();
108
109           source.buffer = generateSourceBuffer();
110
111           // Connect the source to the merger at two different inputs so that sum of the channels on
112           // the inputs exceeds the maximum number of channels.
113           source.connect(merger, 0, 3);
114           source.connect(merger);
115
116           merger.connect(context.destination);
117           source.start();
118           context.oncomplete = checkResult;
119           context.startRendering();
120       }
121
122       runTest();
123       successfullyParsed = true;
124
125     </script>
126   </body>
127 </html>