OLD | NEW |
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <html> | 2 <html> |
| 3 <head> |
| 4 <title> |
| 5 audiochannelmerger-cycle.html |
| 6 </title> |
| 7 <script src="../../resources/testharness.js"></script> |
| 8 <script src="../../resources/testharnessreport.js"></script> |
| 9 <script src="../resources/audit-util.js"></script> |
| 10 <script src="../resources/audit.js"></script> |
| 11 </head> |
| 12 <body> |
| 13 <script id="layout-test-code"> |
| 14 // This specific sample rate is chosen to avoid the round/truncation error |
| 15 // in delay time. See: crbug.com/448801 |
| 16 let sampleRate = 32768; |
3 | 17 |
4 <head> | 18 // Web Audio API's rendering quantum. |
5 <script src="../../resources/testharness.js"></script> | 19 let renderingQuantum = 128; |
6 <script src="../../resources/testharnessreport.js"></script> | |
7 <script src="../resources/audit-util.js"></script> | |
8 <script src="../resources/audit.js"></script> | |
9 </head> | |
10 | 20 |
11 <body> | 21 // 4x of rendering quantum. This is to make the rendered result long |
12 <script> | 22 // enough so that we can observe the delayed output. |
| 23 let renderLength = renderingQuantum * 4; |
13 | 24 |
14 // This specific sample rate is chosen to avoid the round/truncation error | 25 // 1x rendering quantum of delay. |
15 // in delay time. See: crbug.com/448801 | 26 let delayTime = renderingQuantum / sampleRate; |
16 var sampleRate = 32768; | |
17 | 27 |
18 // Web Audio API's rendering quantum. | 28 // Use 2 channels as a test case. |
19 var renderingQuantum = 128; | 29 let numberOfChannels = 2; |
20 | 30 |
21 // 4x of rendering quantum. This is to make the rendered result long enough | 31 let audit = Audit.createTaskRunner(); |
22 // so that we can observe the delayed output. | |
23 var renderLength = renderingQuantum * 4; | |
24 | 32 |
25 // 1x rendering quantum of delay. | 33 audit.define('merger-cyclic-graph', (task, should) => { |
26 var delayTime = renderingQuantum / sampleRate; | |
27 | 34 |
28 // Use 2 channels as a test case. | 35 let context = |
29 var numberOfChannels = 2; | 36 new OfflineAudioContext(numberOfChannels, renderLength, sampleRate); |
| 37 let merger = context.createChannelMerger(2); |
| 38 let delay = context.createDelay(); |
| 39 let source = context.createBufferSource(); |
30 | 40 |
31 var audit = Audit.createTaskRunner(); | 41 // Create a mono source buffer filled with '1'. |
| 42 source.buffer = createConstantBuffer(context, renderLength, [1]); |
32 | 43 |
33 audit.define('merger-cyclic-graph', (task, should) => { | 44 delay.delayTime.value = delayTime; |
34 | 45 |
35 var context = new OfflineAudioContext( | 46 // Connect the source to input 0 of the merger. Connect the output of |
36 numberOfChannels, renderLength, sampleRate | 47 // the merger to a delay node whose output is then connected to input 1 |
37 ); | 48 // of the merger. See: crbug.com/442925 |
38 var merger = context.createChannelMerger(2); | 49 source.connect(merger, 0, 0); |
39 var delay = context.createDelay(); | 50 delay.connect(merger, 0, 1); |
40 var source = context.createBufferSource(); | 51 merger.connect(delay); |
| 52 merger.connect(context.destination); |
| 53 source.start(); |
41 | 54 |
42 // Create a mono source buffer filled with '1'. | 55 context.startRendering().then(function(buffer) { |
43 source.buffer = createConstantBuffer(context, renderLength, [1]); | 56 // Expected output values: the output of delay node will be a stereo |
| 57 // signal of [1, 0]. When it feeds back to the 2nd input of merger |
| 58 // node, the stereo channel will be summed to mono resulting in 0.5. |
| 59 let expected_left = []; |
| 60 let expected_right = []; |
44 | 61 |
45 delay.delayTime.value = delayTime; | 62 for (let i = 0; i < renderLength; i++) { |
| 63 // Note that the delayed channel will be zero for the first 128 |
| 64 // samples due to the cyclic audio graph, the second 128 sample will |
| 65 // be also zero because of 128 samples delay. |
| 66 expected_left[i] = 1.0; |
| 67 expected_right[i] = (i < renderingQuantum * 2) ? 0.0 : 0.5; |
| 68 } |
46 | 69 |
47 // Connect the source to input 0 of the merger. Connect the output of | 70 let actual_left = buffer.getChannelData(0); |
48 // the merger to a delay node whose output is then connected to input 1 | 71 let actual_right = buffer.getChannelData(1); |
49 // of the merger. See: crbug.com/442925 | 72 should(actual_left, 'Left channel').beEqualToArray(expected_left); |
50 source.connect(merger, 0, 0); | 73 should(actual_right, 'Right channel').beEqualToArray(expected_right); |
51 delay.connect(merger, 0, 1); | |
52 merger.connect(delay); | |
53 merger.connect(context.destination); | |
54 source.start(); | |
55 | 74 |
56 context.startRendering().then(function (buffer) { | 75 task.done(); |
57 // Expected output values: the output of delay node will be a stereo | 76 }); |
58 // signal of [1, 0]. When it feeds back to the 2nd input of merger node, | |
59 // the stereo channel will be summed to mono resulting in 0.5. | |
60 var expected_left = []; | |
61 var expected_right = []; | |
62 | 77 |
63 for (var i = 0; i < renderLength; i++) { | |
64 // Note that the delayed channel will be zero for the first 128 sample
s | |
65 // due to the cyclic audio graph, the second 128 sample will be also | |
66 // zero because of 128 samples delay. | |
67 expected_left[i] = 1.0; | |
68 expected_right[i] = (i < renderingQuantum * 2) ? 0.0 : 0.5; | |
69 } | |
70 | |
71 var actual_left = buffer.getChannelData(0); | |
72 var actual_right = buffer.getChannelData(1); | |
73 should(actual_left, "Left channel") | |
74 .beEqualToArray(expected_left); | |
75 should(actual_right, "Right channel") | |
76 .beEqualToArray(expected_right); | |
77 | |
78 task.done(); | |
79 }); | 78 }); |
80 | 79 |
81 }); | 80 audit.run(); |
82 | 81 </script> |
83 audit.run(); | 82 </body> |
84 </script> | |
85 </body> | |
86 | |
87 </html> | 83 </html> |
OLD | NEW |