| OLD | NEW |
| 1 <!doctype html> | 1 <!DOCTYPE html> |
| 2 <html> | 2 <html> |
| 3 <head> | 3 <head> |
| 4 <title> |
| 5 offlineaudiocontext-suspend-resume-graph-manipulation.html |
| 6 </title> |
| 4 <script src="../../resources/testharness.js"></script> | 7 <script src="../../resources/testharness.js"></script> |
| 5 <script src="../../resources/testharnessreport.js"></script> | 8 <script src="../../resources/testharnessreport.js"></script> |
| 6 <script src="../resources/audit-util.js"></script> | 9 <script src="../resources/audit-util.js"></script> |
| 7 <script src="../resources/audit.js"></script> | 10 <script src="../resources/audit.js"></script> |
| 8 </head> | 11 </head> |
| 12 <body> |
| 13 <script id="layout-test-code"> |
| 14 let audit = Audit.createTaskRunner(); |
| 9 | 15 |
| 10 <body> | 16 let context; |
| 11 <script> | 17 let renderQuantum = 128; |
| 12 var audit = Audit.createTaskRunner(); | 18 let renderDuration = 3; |
| 13 | |
| 14 var context; | |
| 15 var renderQuantum = 128; | |
| 16 var renderDuration = 3; | |
| 17 | 19 |
| 18 // The sample rate is multiple of the rendering quantum, so suspension | 20 // The sample rate is multiple of the rendering quantum, so suspension |
| 19 // times fall in to the render quantum boundary. | 21 // times fall in to the render quantum boundary. |
| 20 var sampleRate = renderQuantum * 100; | 22 let sampleRate = renderQuantum * 100; |
| 21 | 23 |
| 22 // Suspend at 1 second and activate the source node. The audio output | 24 // Suspend at 1 second and activate the source node. The audio output |
| 23 // should be 1.0 from |suspendTime1| to the next suspension. | 25 // should be 1.0 from |suspendTime1| to the next suspension. |
| 24 var suspendTime1 = 1; | 26 let suspendTime1 = 1; |
| 25 | 27 |
| 26 // Suspend at 2 seconds and disconnect the node. The audio output should | 28 // Suspend at 2 seconds and disconnect the node. The audio output should |
| 27 // be 0.0 from |suspendTime2| to the end. | 29 // be 0.0 from |suspendTime2| to the end. |
| 28 var suspendTime2 = 2; | 30 let suspendTime2 = 2; |
| 29 | 31 |
| 30 audit.define({ | 32 audit.define( |
| 31 label: 'test', | 33 { |
| 32 description: 'Synchronous graph manipulation with suspend() and resume()
' | 34 label: 'test', |
| 33 }, (task, should) => { | 35 description: |
| 34 context = new OfflineAudioContext(1, sampleRate * renderDuration, | 36 'Synchronous graph manipulation with suspend() and resume()' |
| 35 sampleRate); | 37 }, |
| 38 (task, should) => { |
| 39 context = new OfflineAudioContext( |
| 40 1, sampleRate * renderDuration, sampleRate); |
| 36 | 41 |
| 37 // Create a constant buffer of 1.0. | 42 // Create a constant buffer of 1.0. |
| 38 var constantBuffer = createConstantBuffer(context, 1, 1.0); | 43 let constantBuffer = createConstantBuffer(context, 1, 1.0); |
| 39 var constantSource = context.createBufferSource(); | 44 let constantSource = context.createBufferSource(); |
| 40 constantSource.buffer = constantBuffer; | 45 constantSource.buffer = constantBuffer; |
| 41 constantSource.loop = true; | 46 constantSource.loop = true; |
| 42 | 47 |
| 43 // The audio output from the beginning (0.0 second) to the first suspend | 48 // The audio output from the beginning (0.0 second) to the first |
| 44 // time should be 0.0 because there is no connection to the destination. | 49 // suspend time should be 0.0 because there is no connection to the |
| 50 // destination. |
| 45 | 51 |
| 46 context.suspend(suspendTime1).then(function () { | 52 context.suspend(suspendTime1).then(function() { |
| 47 if (context.currentTime === suspendTime1) { | 53 if (context.currentTime === suspendTime1) { |
| 48 should(context.currentTime * sampleRate, | 54 should( |
| 49 'Frame at which context is suspended') | 55 context.currentTime * sampleRate, |
| 50 .beEqualTo(suspendTime1 * sampleRate) | 56 'Frame at which context is suspended') |
| 51 } | 57 .beEqualTo(suspendTime1 * sampleRate) |
| 52 should(() => { | 58 } |
| 53 constantSource.connect(context.destination); | 59 should( |
| 54 constantSource.start() | 60 () => { |
| 55 }, | 61 constantSource.connect(context.destination); |
| 56 'Connecting a constant buffer to destination and starting at ' + | 62 constantSource.start() |
| 57 suspendTime1 * sampleRate + ' frame') | 63 }, |
| 58 .notThrow();; | 64 'Connecting a constant buffer to destination and starting at '
+ |
| 59 context.resume(); | 65 suspendTime1 * sampleRate + ' frame') |
| 60 }); | 66 .notThrow(); |
| 67 ; |
| 68 context.resume(); |
| 69 }); |
| 61 | 70 |
| 62 context.suspend(suspendTime2).then(function () { | 71 context.suspend(suspendTime2).then(function() { |
| 63 if (context.currentTime === suspendTime2) { | 72 if (context.currentTime === suspendTime2) { |
| 64 should(context.currentTime * sampleRate, | 73 should(context.currentTime * sampleRate, 'Context is suspended') |
| 65 'Context is suspended') | 74 .beEqualTo(suspendTime2 * sampleRate); |
| 66 .beEqualTo(suspendTime2 * sampleRate); | 75 } |
| 67 } | 76 should( |
| 68 should(() => constantSource.disconnect(), | 77 () => constantSource.disconnect(), |
| 69 'Disconnecting a constant buffer at ' + suspendTime2 * | 78 'Disconnecting a constant buffer at ' + |
| 70 sampleRate + ' frame') | 79 suspendTime2 * sampleRate + ' frame') |
| 71 .notThrow(); | 80 .notThrow(); |
| 72 | 81 |
| 73 context.resume(); | 82 context.resume(); |
| 74 }); | 83 }); |
| 75 | 84 |
| 76 context.startRendering().then(function (buffer) { | 85 context.startRendering() |
| 77 verifyResult(should, buffer); | 86 .then(function(buffer) { |
| 78 }).then(() => task.done()); | 87 verifyResult(should, buffer); |
| 79 }); | 88 }) |
| 89 .then(() => task.done()); |
| 90 }); |
| 80 | 91 |
| 81 function verifyResult(should, buffer) { | 92 function verifyResult(should, buffer) { |
| 82 var data = buffer.getChannelData(0); | 93 let data = buffer.getChannelData(0); |
| 83 | 94 |
| 84 var suspendIndex1 = suspendTime1 * sampleRate; | 95 let suspendIndex1 = suspendTime1 * sampleRate; |
| 85 var suspendIndex2 = suspendTime2 * sampleRate; | 96 let suspendIndex2 = suspendTime2 * sampleRate; |
| 86 var endIndex = renderDuration * sampleRate; | 97 let endIndex = renderDuration * sampleRate; |
| 87 | 98 |
| 88 // Split the rendered buffer into 3 segments: | 99 // Split the rendered buffer into 3 segments: |
| 89 // [0, suspendIndex1), [suspendIndex1, suspendIndex2), [suspendIndex2, | 100 // [0, suspendIndex1), [suspendIndex1, suspendIndex2), [suspendIndex2, |
| 90 // endIndex). | 101 // endIndex). |
| 91 var subarray0 = data.subarray(0, suspendIndex1); | 102 let subarray0 = data.subarray(0, suspendIndex1); |
| 92 var subarray1 = data.subarray(suspendIndex1, suspendIndex2); | 103 let subarray1 = data.subarray(suspendIndex1, suspendIndex2); |
| 93 var subarray2 = data.subarray(suspendIndex2, endIndex); | 104 let subarray2 = data.subarray(suspendIndex2, endIndex); |
| 94 | 105 |
| 95 // Each segment should contain a constant value of 0, 1 and 0 | 106 // Each segment should contain a constant value of 0, 1 and 0 |
| 96 // respectively. | 107 // respectively. |
| 97 should(subarray0, 'Buffer frame [0, ' + suspendIndex1 + ')') | 108 should(subarray0, 'Buffer frame [0, ' + suspendIndex1 + ')') |
| 98 .beConstantValueOf(0); | 109 .beConstantValueOf(0); |
| 99 should(subarray1, 'Buffer frame [' + suspendIndex1 + ', ' + | 110 should( |
| 100 suspendIndex2 + ')') | 111 subarray1, |
| 101 .beConstantValueOf(1); | 112 'Buffer frame [' + suspendIndex1 + ', ' + suspendIndex2 + ')') |
| 102 should(subarray2, 'Buffer frame [' + suspendIndex2 + ', ' + endIndex + | 113 .beConstantValueOf(1); |
| 103 ')') | 114 should( |
| 104 .beConstantValueOf(0); | 115 subarray2, 'Buffer frame [' + suspendIndex2 + ', ' + endIndex + ')') |
| 116 .beConstantValueOf(0); |
| 105 } | 117 } |
| 106 | 118 |
| 107 audit.run(); | 119 audit.run(); |
| 108 </script> | 120 </script> |
| 109 | |
| 110 </body> | 121 </body> |
| 111 </html> | 122 </html> |
| OLD | NEW |