Many WebAudio js-tests use waitUntilDone
[WebKit-https.git] / LayoutTests / webaudio / audioparam-summingjunction.html
1 <!DOCTYPE html>
2
3 <!--
4 Tests that multiple audio-rate signals (AudioNode outputs) can be connected to an AudioParam
5 and that these signals are summed, along with the AudioParams intrinsic value.
6 -->
7
8 <html>
9 <head>
10 <script src="resources/audio-testing.js"></script>
11 <script src="resources/mix-testing.js"></script>
12 <script src="../resources/js-test.js"></script>
13
14 </head>
15 <body>
16
17 <script>
18
19 var sampleRate = 44100.0;
20 var lengthInSeconds = 1;
21
22 var context = 0;
23
24 // Buffers used by the two gain controlling sources.
25 var linearRampBuffer;
26 var toneBuffer;
27 var toneFrequency = 440;
28
29 // Arbitrary non-zero value.
30 var baselineGain = 5;
31
32 // Allow for a small round-off error.
33 var maxAllowedError = 1e-6;
34
35 function checkResult(event) {
36     var renderedBuffer = event.renderedBuffer;
37     var renderedData = renderedBuffer.getChannelData(0);
38
39     // Get buffer data from the two sources used to control gain.
40     var linearRampData = linearRampBuffer.getChannelData(0);
41     var toneData = toneBuffer.getChannelData(0);
42
43     var n = renderedBuffer.length;
44
45     if (n == linearRampBuffer.length) {
46         testPassed("Rendered signal is of correct length.");
47     } else {
48         testFailed("Rendered signal is not of correct length.");
49     }
50
51     // Check that the rendered result exactly matches the sum of the intrinsic gain plus the two sources used to control gain.
52     // This is because we're changing the gain of a signal having constant value 1.
53     var success = true;
54     for (var i = 0; i < n; ++i) {
55         var expectedValue = baselineGain + linearRampData[i] + toneData[i];
56         var error = Math.abs(expectedValue - renderedData[i]);
57
58         if (error > maxAllowedError) {
59             success = false;
60             break;
61         }
62     }
63
64     if (success) {
65         testPassed("Rendered signal matches sum of two audio-rate gain changing signals plus baseline gain.");
66     } else {
67         testFailed("Rendered signal differs from the sum of two audio-rate gain changing signals plus baseline gain.");
68     }
69
70     finishJSTest();
71 }
72
73 function runTest() {
74     window.jsTestIsAsync = true;
75
76     var sampleFrameLength = sampleRate * lengthInSeconds;
77
78     // Create offline audio context.
79     context = new webkitOfflineAudioContext(1, sampleFrameLength, sampleRate);
80
81     // Create buffer used by the source which will have its gain controlled.
82     var constantOneBuffer = createConstantBuffer(context, sampleFrameLength, 1);
83     var constantSource = context.createBufferSource();
84     constantSource.buffer = constantOneBuffer;
85
86     // Create 1st buffer used to control gain (a linear ramp).
87     linearRampBuffer = createLinearRampBuffer(context, sampleFrameLength);
88     var gainSource1 = context.createBufferSource();
89     gainSource1.buffer = linearRampBuffer;
90
91     // Create 2st buffer used to control gain (a simple sine wave tone).
92     toneBuffer = createToneBuffer(context, toneFrequency, lengthInSeconds, 1);
93     var gainSource2 = context.createBufferSource();
94     gainSource2.buffer = toneBuffer;
95
96     // Create a gain node controlling the gain of constantSource and make the connections.
97     var gainNode = context.createGain();
98
99     // Intrinsic baseline gain.
100     // This gain value should be summed with gainSource1 and gainSource2.
101     gainNode.gain.value = baselineGain;
102
103     constantSource.connect(gainNode);
104     gainNode.connect(context.destination);
105
106     // Connect two audio-rate signals to control the .gain AudioParam.
107     gainSource1.connect(gainNode.gain);
108     gainSource2.connect(gainNode.gain);
109
110     // Start all sources at time 0.
111     constantSource.start(0);
112     gainSource1.start(0);
113     gainSource2.start(0);
114
115     context.oncomplete = checkResult;
116     context.startRendering();
117 }
118
119 runTest();
120
121 </script>
122 </body>
123 </html>