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