1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4 <script src="resources/compatibility.js"></script>
5 <script src="resources/audio-testing.js"></script>
6 <script src="../resources/js-test.js"></script>
10 <div id="description"></div>
11 <div id="console"></div>
14 description("Test that ChannelMergerNode can handle many input channels");
16 var sampleRate = 44100;
18 // Number of samples to render
19 var renderLengthSamples = 2048;
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;
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
28 var numberOfSourceChannels = 25;
35 var timeData = Array(maxNumberOfChannels);
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) {
50 function hasCorrectData(channelNumber, buffer) {
52 var expectedValue = 1 + (channelNumber % numberOfSourceChannels);
54 for (var k = 0; k < buffer.length; ++k) {
55 if (buffer[k] != expectedValue) {
63 function checkResult(event) {
64 renderedData = event.renderedBuffer;
67 // If we get here, the merger node accepted many input channels.
68 testPassed("ChannelMergerNode accepted many input channels.");
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.");
77 testFailed("Channel " + k + " did not have the expected data.");
81 if (renderedData.numberOfChannels != maxNumberOfChannels) {
82 testFailed("Not all channels could be tested because OfflineAudioContext only supports "
83 + renderedData.numberOfChannels + " channels.");
87 testPassed("ChannerMergerNode handled many input channels correctly.");
89 testFailed("ChannerMergerNode failed to handle many input channels correctly.");
95 if (window.testRunner) {
96 testRunner.dumpAsText();
97 testRunner.waitUntilDone();
100 window.jsTestIsAsync = true;
102 // Create offline audio context.
103 context = new OfflineAudioContext(maxNumberOfChannels, renderLengthSamples, sampleRate);
105 // This is a slightly simplified test case from crbug.com/345174.
106 merger = context.createChannelMerger();
107 source = context.createBufferSource();
109 source.buffer = generateSourceBuffer();
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);
116 merger.connect(context.destination);
118 context.oncomplete = checkResult;
119 context.startRendering();
123 successfullyParsed = true;