| OLD | NEW |
| 1 <!doctype html> | 1 <!DOCTYPE html> |
| 2 <html> | 2 <html> |
| 3 <head> | 3 <head> |
| 4 <title>Test Automation Following setValueCurveAtTime Automations</title> | 4 <title> |
| 5 Test Automation Following setValueCurveAtTime Automations |
| 6 </title> |
| 5 <script src="../../resources/testharness.js"></script> | 7 <script src="../../resources/testharness.js"></script> |
| 6 <script src="../../resources/testharnessreport.js"></script> | 8 <script src="../../resources/testharnessreport.js"></script> |
| 7 <script src="../resources/audit-util.js"></script> | 9 <script src="../resources/audit-util.js"></script> |
| 8 <script src="../resources/audit.js"></script> | 10 <script src="../resources/audit.js"></script> |
| 9 <script src="../resources/audio-param.js"></script> | 11 <script src="../resources/audio-param.js"></script> |
| 10 </head> | 12 </head> |
| 13 <body> |
| 14 <script id="layout-test-code"> |
| 15 let sampleRate = 12800; |
| 16 // Some short duration because we don't need to run the test for very |
| 17 // long. |
| 18 let testDurationFrames = 256; |
| 19 let testDurationSec = testDurationFrames / sampleRate; |
| 20 let curveDuration = testDurationSec / 2; |
| 11 | 21 |
| 12 <body> | 22 let audit = Audit.createTaskRunner(); |
| 13 <script> | |
| 14 | |
| 15 var sampleRate = 12800; | |
| 16 // Some short duration because we don't need to run the test for very long
. | |
| 17 var testDurationFrames = 256; | |
| 18 var testDurationSec = testDurationFrames / sampleRate; | |
| 19 var curveDuration = testDurationSec / 2; | |
| 20 | |
| 21 var audit = Audit.createTaskRunner(); | |
| 22 | 23 |
| 23 // Configuration for each test. | 24 // Configuration for each test. |
| 24 // | 25 // |
| 25 // Required options: | 26 // Required options: |
| 26 // automation - Name of automation method to test | 27 // automation - Name of automation method to test |
| 27 // time - Time for the automation method. | 28 // time - Time for the automation method. |
| 28 // Optional options: | 29 // Optional options: |
| 29 // extraDuration - extra time for the duration of the setValueCurve | 30 // extraDuration - extra time for the duration of the setValueCurve |
| 30 // duration. Default is 0. This should not be on a | 31 // duration. Default is 0. This should not be on a |
| 31 // sample frame boundary. This is for testing that | 32 // sample frame boundary. This is for testing that |
| 32 // curves that don't end on a frame boundary are handled | 33 // curves that don't end on a frame boundary are handled |
| 33 // correctly. | 34 // correctly. |
| 34 // threshold - Error threshold for the test; default is 0. | 35 // threshold - Error threshold for the test; default is 0. |
| 35 var testConfigs = [{ | 36 let testConfigs = [ |
| 36 automation: "linearRampToValueAtTime", | 37 { |
| 37 time: testDurationSec, | 38 automation: 'linearRampToValueAtTime', |
| 38 threshold: 3.9737e-8 | 39 time: testDurationSec, |
| 39 }, { | 40 threshold: 3.9737e-8 |
| 40 automation: "linearRampToValueAtTime", | 41 }, |
| 41 time: testDurationSec, | 42 { |
| 42 extraDuration: 0.5 / sampleRate, | 43 automation: 'linearRampToValueAtTime', |
| 43 threshold: 1.8141e-8 | 44 time: testDurationSec, |
| 44 }, { | 45 extraDuration: 0.5 / sampleRate, |
| 45 automation: "exponentialRampToValueAtTime", | 46 threshold: 1.8141e-8 |
| 46 time: testDurationSec, | 47 }, |
| 47 threshold: 3.9737e-8 | 48 { |
| 48 }, { | 49 automation: 'exponentialRampToValueAtTime', |
| 49 automation: "exponentialRampToValueAtTime", | 50 time: testDurationSec, |
| 50 time: testDurationSec, | 51 threshold: 3.9737e-8 |
| 51 extraDuration: 0.5 / sampleRate, | 52 }, |
| 52 threshold: 2.0312e-8 | 53 { |
| 53 }, { | 54 automation: 'exponentialRampToValueAtTime', |
| 54 automation: "setTargetAtTime", | 55 time: testDurationSec, |
| 55 time: curveDuration, | 56 extraDuration: 0.5 / sampleRate, |
| 56 threshold: 1.5895e-7 | 57 threshold: 2.0312e-8 |
| 57 }, { | 58 }, |
| 58 automation: "setTargetAtTime", | 59 { |
| 59 time: curveDuration + 0.5 / sampleRate, | 60 automation: 'setTargetAtTime', |
| 60 extraDuration: 0.5 / sampleRate, | 61 time: curveDuration, |
| 61 threshold: 1.3278e-7 | 62 threshold: 1.5895e-7 |
| 62 }]; | 63 }, |
| 64 { |
| 65 automation: 'setTargetAtTime', |
| 66 time: curveDuration + 0.5 / sampleRate, |
| 67 extraDuration: 0.5 / sampleRate, |
| 68 threshold: 1.3278e-7 |
| 69 } |
| 70 ]; |
| 63 | 71 |
| 64 // Define tests from the configs | 72 // Define tests from the configs |
| 65 for (k in testConfigs) { | 73 for (k in testConfigs) { |
| 66 audit.define(k + ": " + testConfigs[k].automation, (function (config) { | 74 audit.define(k + ': ' + testConfigs[k].automation, (function(config) { |
| 67 return (task, should) => { | 75 return (task, should) => { |
| 68 runTest(should, config).then(() => task.done()); | 76 runTest(should, config).then(() => task.done()); |
| 69 }; | 77 }; |
| 70 })(testConfigs[k])); | 78 })(testConfigs[k])); |
| 71 } | 79 } |
| 72 | 80 |
| 73 audit.run(); | 81 audit.run(); |
| 74 | 82 |
| 75 function runTest(should, options) { | 83 function runTest(should, options) { |
| 76 // For the test, use a gain node with a constant input to test the | 84 // For the test, use a gain node with a constant input to test the |
| 77 // automations. | 85 // automations. |
| 78 var context = new OfflineAudioContext(1, testDurationFrames, sampleRate)
; | 86 let context = |
| 79 var source = context.createBufferSource(); | 87 new OfflineAudioContext(1, testDurationFrames, sampleRate); |
| 88 let source = context.createBufferSource(); |
| 80 source.buffer = createConstantBuffer(context, 1, 1); | 89 source.buffer = createConstantBuffer(context, 1, 1); |
| 81 source.loop = true; | 90 source.loop = true; |
| 82 | 91 |
| 83 var gain = context.createGain(); | 92 let gain = context.createGain(); |
| 84 | 93 |
| 85 // Any valid curve is ok. We only use the last value for testing. | 94 // Any valid curve is ok. We only use the last value for testing. |
| 86 var curve = [0, 2, 0.3]; | 95 let curve = [0, 2, 0.3]; |
| 87 var actualDuration = curveDuration + (options.extraDuration || 0); | 96 let actualDuration = curveDuration + (options.extraDuration || 0); |
| 88 gain.gain.setValueCurveAtTime(Float32Array.from(curve), 0, actualDuratio
n); | 97 gain.gain.setValueCurveAtTime( |
| 98 Float32Array.from(curve), 0, actualDuration); |
| 89 | 99 |
| 90 // Run the desired test automation. The extra parameter (0.01) is only | 100 // Run the desired test automation. The extra parameter (0.01) is only |
| 91 // used for setTargetAtTime tests; it's ignored for other tests. | 101 // used for setTargetAtTime tests; it's ignored for other tests. |
| 92 var automationValue = 2; | 102 let automationValue = 2; |
| 93 gain.gain[options.automation](automationValue, options.time, 0.01); | 103 gain.gain[options.automation](automationValue, options.time, 0.01); |
| 94 | 104 |
| 95 source.connect(gain); | 105 source.connect(gain); |
| 96 gain.connect(context.destination); | 106 gain.connect(context.destination); |
| 97 | 107 |
| 98 source.start(); | 108 source.start(); |
| 99 | 109 |
| 100 return context.startRendering().then(function (resultBuffer) { | 110 return context.startRendering().then(function(resultBuffer) { |
| 101 var result = resultBuffer.getChannelData(0); | 111 let result = resultBuffer.getChannelData(0); |
| 102 | 112 |
| 103 // Only need to verify that the ramp started at the right | 113 // Only need to verify that the ramp started at the right |
| 104 // value. Figure the nearest sample frame to the end curve. | 114 // value. Figure the nearest sample frame to the end curve. |
| 105 var curveEndFrame = Math.ceil(actualDuration * sampleRate); | 115 let curveEndFrame = Math.ceil(actualDuration * sampleRate); |
| 106 | 116 |
| 107 var expectedResult = curve[curve.length - 1]; | 117 let expectedResult = curve[curve.length - 1]; |
| 108 | 118 |
| 109 // Determine the expected value after the end of the setValueCurve eve
nt. | 119 // Determine the expected value after the end of the setValueCurve |
| 110 if (options.automation == "linearRampToValueAtTime") { | 120 // event. |
| 121 if (options.automation == 'linearRampToValueAtTime') { |
| 111 expectedResult = audioParamLinearRamp( | 122 expectedResult = audioParamLinearRamp( |
| 112 curveEndFrame / sampleRate, | 123 curveEndFrame / sampleRate, curve[curve.length - 1], |
| 113 curve[curve.length - 1], actualDuration, | 124 actualDuration, automationValue, testDurationSec); |
| 114 automationValue, testDurationSec); | 125 } else if (options.automation == 'exponentialRampToValueAtTime') { |
| 115 } else if (options.automation == "exponentialRampToValueAtTime") { | |
| 116 expectedResult = audioParamExponentialRamp( | 126 expectedResult = audioParamExponentialRamp( |
| 117 curveEndFrame / sampleRate, | 127 curveEndFrame / sampleRate, curve[curve.length - 1], |
| 118 curve[curve.length - 1], actualDuration, | 128 actualDuration, automationValue, testDurationSec); |
| 119 automationValue, testDurationSec); | 129 } else if (options.automation == 'setTargetAtTime') { |
| 120 } else if (options.automation == "setTargetAtTime") { | |
| 121 expectedResult = audioParamSetTarget( | 130 expectedResult = audioParamSetTarget( |
| 122 curveEndFrame / sampleRate, | 131 curveEndFrame / sampleRate, curve[curve.length - 1], |
| 123 curve[curve.length - 1], actualDuration, | 132 actualDuration, automationValue, 0.01); |
| 124 automationValue, 0.01); | |
| 125 } | 133 } |
| 126 | 134 |
| 127 var message = "setValueCurve(..., " + 0 + ", " + actualDuration + | 135 let message = 'setValueCurve(..., ' + 0 + ', ' + actualDuration + |
| 128 ")." + options.automation + | 136 ').' + options.automation + '(2, ' + testDurationSec; |
| 129 "(2, " + testDurationSec; | |
| 130 | 137 |
| 131 if (options.automation == "setTargetAtTime") | 138 if (options.automation == 'setTargetAtTime') |
| 132 message += ", 0.01"; | 139 message += ', 0.01'; |
| 133 message += ")"; | 140 message += ')'; |
| 134 | 141 |
| 135 should(result[curveEndFrame], | 142 should( |
| 136 message + ": value at time " + curveEndFrame / sampleRate) | 143 result[curveEndFrame], |
| 137 .beCloseTo(expectedResult, { | 144 message + ': value at time ' + curveEndFrame / sampleRate) |
| 138 threshold: options.threshold || 0 | 145 .beCloseTo(expectedResult, {threshold: options.threshold || 0}); |
| 139 }); | |
| 140 }); | 146 }); |
| 141 } | 147 } |
| 142 | 148 |
| 143 function linearRampValue(t, t0, v0, t1, v1) { | 149 function linearRampValue(t, t0, v0, t1, v1) { |
| 144 return v0 + (v1 - v0) * (t - t0) / (t1 - t0); | 150 return v0 + (v1 - v0) * (t - t0) / (t1 - t0); |
| 145 } | 151 } |
| 146 | 152 |
| 147 function exponentialRampValue(t, t0, v0, t1, v1) { | 153 function exponentialRampValue(t, t0, v0, t1, v1) { |
| 148 return v0 * Math.pow(v1 / v0, (t - t0) / (t1 - t0)); | 154 return v0 * Math.pow(v1 / v0, (t - t0) / (t1 - t0)); |
| 149 } | 155 } |
| 150 | 156 |
| 151 function setTargetValue(t, t0, v0, v1, timeConstant) { | 157 function setTargetValue(t, t0, v0, v1, timeConstant) { |
| 152 return v1 + (v0 - v1) * Math.exp(-(t - t0) / timeConstant) | 158 return v1 + (v0 - v1) * Math.exp(-(t - t0) / timeConstant) |
| 153 } | 159 } |
| 154 </script> | 160 </script> |
| 155 </body> | 161 </body> |
| 156 </html> | 162 </html> |
| OLD | NEW |