| OLD | NEW |
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 <html> | 2 <html> |
| 3 <head> |
| 4 <title> |
| 5 Test AudioBufferSourceNode premature loop stop |
| 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 // Reasonably low sample rate for the optimum test speed. |
| 15 let sampleRate = 4096; |
| 3 | 16 |
| 4 <head> | 17 let audit = Audit.createTaskRunner(); |
| 5 <title>Test AudioBufferSourceNode premature loop stop</title> | |
| 6 <script src="../../resources/testharness.js"></script> | |
| 7 <script src="../../resources/testharnessreport.js"></script> | |
| 8 <script src="../resources/audit-util.js"></script> | |
| 9 <script src="../resources/audit.js"></script> | |
| 10 </head> | |
| 11 | 18 |
| 12 <body> | 19 // Task: Create a buffer with 3 regions filled with constant value of [1, |
| 13 <script> | 20 // 2, 3]. Then set a loop range over the second region. Start the loop and |
| 21 // disable it in the middle of looping. Verify the rendered buffer has the |
| 22 // entire content including the looped region. |
| 23 audit.define('premature-loop-stop', (task, should) => { |
| 24 let regionValues = [1, 2, 3]; |
| 14 | 25 |
| 15 // Reasonably low sample rate for the optimum test speed. | 26 // The region length is 2 * render quantum size to be able to suspend |
| 16 var sampleRate = 4096; | 27 // the rendering at the half of the region. |
| 28 let regionLength = 256; |
| 17 | 29 |
| 18 var audit = Audit.createTaskRunner(); | 30 // The test will repeat the second region 3 times, thus the rendered |
| 31 // audio have the length of 5 * regionLength. |
| 32 let context = new OfflineAudioContext(1, 5 * regionLength, sampleRate); |
| 19 | 33 |
| 20 // Task: Create a buffer with 3 regions filled with constant value of [1, 2, | 34 // Create 3 constant buffers of [1, 2, 3] and concatenate them together: |
| 21 // 3]. Then set a loop range over the second region. Start the loop and | 35 // | 1 | 2 | 3 | |
| 22 // disable it in the middle of looping. Verify the rendered buffer has the | 36 let testBuffer = context.createBuffer(1, 3 * regionLength, sampleRate); |
| 23 // entire content including the looped region. | 37 let testChannel = testBuffer.getChannelData(0); |
| 24 audit.define('premature-loop-stop', (task, should) => { | 38 for (let i = 0; i < regionValues.length; i++) { |
| 25 var regionValues = [1, 2, 3]; | 39 let region = |
| 40 createConstantBuffer(context, regionLength, regionValues[i]); |
| 41 testChannel.set(region.getChannelData(0), regionLength * i); |
| 42 ; |
| 43 } |
| 26 | 44 |
| 27 // The region length is 2 * render quantum size to be able to suspend the | 45 let source = context.createBufferSource(); |
| 28 // rendering at the half of the region. | 46 source.connect(context.destination); |
| 29 var regionLength = 256; | |
| 30 | 47 |
| 31 // The test will repeat the second region 3 times, thus the rendered audio | 48 source.buffer = testBuffer; |
| 32 // have the length of 5 * regionLength. | 49 source.loop = true; |
| 33 var context = new OfflineAudioContext(1, 5 * regionLength, sampleRate); | |
| 34 | 50 |
| 35 // Create 3 constant buffers of [1, 2, 3] and concatenate them together: | 51 // Set loop points over the region 2. |
| 36 // | 1 | 2 | 3 | | 52 source.loopStart = regionLength / sampleRate; |
| 37 var testBuffer = context.createBuffer(1, 3 * regionLength, sampleRate); | 53 source.loopEnd = 2 * regionLength / sampleRate; |
| 38 var testChannel = testBuffer.getChannelData(0); | |
| 39 for (var i = 0; i < regionValues.length; i++) { | |
| 40 var region = createConstantBuffer(context, regionLength, regionValues[i]
); | |
| 41 testChannel.set(region.getChannelData(0), regionLength * i);; | |
| 42 } | |
| 43 | 54 |
| 44 var source = context.createBufferSource(); | 55 source.start(); |
| 45 source.connect(context.destination); | |
| 46 | 56 |
| 47 source.buffer = testBuffer; | 57 // Disengage the loop at |3.5 * regionLength / sampleRate| which is the |
| 48 source.loop = true; | 58 // end of 7th rendering quantum and also the half of the third iteration |
| 59 // of region #2. |
| 60 context.suspend(3.5 * regionLength / sampleRate).then(function() { |
| 61 source.loop = false; |
| 62 context.resume(); |
| 63 }); |
| 49 | 64 |
| 50 // Set loop points over the region 2. | 65 context.startRendering() |
| 51 source.loopStart = regionLength/sampleRate; | 66 .then(function(renderedBuffer) { |
| 52 source.loopEnd = 2 * regionLength/sampleRate; | 67 let channel = renderedBuffer.getChannelData(0); |
| 53 | 68 |
| 54 source.start(); | 69 // Verify if the rendered buffer has the following structure: |
| 70 // | 1 | 2 | 2 | 2 | 3 | |
| 71 let region1 = channel.subarray(0, regionLength - 1); |
| 72 let region2 = |
| 73 channel.subarray(regionLength, 4 * regionLength - 1); |
| 74 let region3 = |
| 75 channel.subarray(4 * regionLength, 5 * regionLength - 1); |
| 55 | 76 |
| 56 // Disengage the loop at |3.5 * regionLength / sampleRate| which is the | 77 should(region1, 'Region #1').beConstantValueOf(1); |
| 57 // end of 7th rendering quantum and also the half of the third iteration | 78 should(region2, 'Region #2 (looped)').beConstantValueOf(2); |
| 58 // of region #2. | 79 should(region3, 'Region #3').beConstantValueOf(3); |
| 59 context.suspend(3.5 * regionLength/sampleRate).then(function () { | 80 }) |
| 60 source.loop = false; | 81 .then(() => task.done()); |
| 61 context.resume(); | |
| 62 }); | 82 }); |
| 63 | 83 |
| 64 context.startRendering().then(function (renderedBuffer) { | 84 audit.run(); |
| 65 var channel = renderedBuffer.getChannelData(0); | 85 </script> |
| 66 | 86 </body> |
| 67 // Verify if the rendered buffer has the following structure: | |
| 68 // | 1 | 2 | 2 | 2 | 3 | | |
| 69 var region1 = channel.subarray(0, regionLength - 1); | |
| 70 var region2 = channel.subarray(regionLength, 4 * regionLength - 1); | |
| 71 var region3 = channel.subarray(4 * regionLength, 5 * regionLength - 1); | |
| 72 | |
| 73 should(region1, 'Region #1').beConstantValueOf(1); | |
| 74 should(region2, 'Region #2 (looped)').beConstantValueOf(2); | |
| 75 should(region3, 'Region #3').beConstantValueOf(3); | |
| 76 }).then(() => task.done()); | |
| 77 }); | |
| 78 | |
| 79 audit.run(); | |
| 80 </script> | |
| 81 </body> | |
| 82 | |
| 83 </html> | 87 </html> |
| OLD | NEW |