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