| OLD | NEW |
| (Empty) |
| 1 <!doctype html> | |
| 2 <html> | |
| 3 <head> | |
| 4 <title>Test Exceptions from setValueCurveAtTime</title> | |
| 5 <script src="../resources/js-test.js"></script> | |
| 6 <script src="resources/compatibility.js"></script> | |
| 7 <script src="resources/audit-util.js"></script> | |
| 8 <script src="resources/audio-testing.js"></script> | |
| 9 </head> | |
| 10 | |
| 11 <body> | |
| 12 <script> | |
| 13 description("Test Exceptions from setValueCurveAtTime"); | |
| 14 window.jsTestIsAsync = true; | |
| 15 | |
| 16 var sampleRate = 48000; | |
| 17 // Some short duration because we don't need to run the test for very long
. | |
| 18 var testDurationSec = 0.125; | |
| 19 var testDurationFrames = testDurationSec * sampleRate; | |
| 20 | |
| 21 var audit = Audit.createTaskRunner(); | |
| 22 | |
| 23 audit.defineTask("setValueCurve", function(done) { | |
| 24 var success = true; | |
| 25 var context = new OfflineAudioContext(1, testDurationFrames, sampleRate)
; | |
| 26 var g = context.createGain(); | |
| 27 var curve = new Float32Array(2); | |
| 28 | |
| 29 // Start time and duration for setValueCurveAtTime | |
| 30 var curveStartTime = 0.1 * testDurationSec; | |
| 31 var duration = 0.1 * testDurationSec; | |
| 32 | |
| 33 // Some time that is known to during the setValueCurveTime interval. | |
| 34 var automationTime = curveStartTime + duration / 2; | |
| 35 | |
| 36 success = Should("setValueCurveAtTime(curve, " + curveStartTime + ", " +
duration + ")", function() { | |
| 37 g.gain.setValueCurveAtTime(curve, curveStartTime, duration); | |
| 38 }).notThrow() && success; | |
| 39 | |
| 40 success = Should("setValueAtTime(1, " + automationTime + ")", function()
{ | |
| 41 g.gain.setValueAtTime(1, automationTime); | |
| 42 }).throw("NotSupportedError") && success; | |
| 43 | |
| 44 success = Should("linearRampToValueAtTime(1, " + automationTime + ")", f
unction() { | |
| 45 g.gain.linearRampToValueAtTime(1, automationTime); | |
| 46 }).throw("NotSupportedError") && success; | |
| 47 | |
| 48 success = Should("exponentialRampToValueAtTime(1, " + automationTime + "
)", function() { | |
| 49 g.gain.exponentialRampToValueAtTime(1, automationTime); | |
| 50 }).throw("NotSupportedError") && success; | |
| 51 | |
| 52 success = Should("setTargetAtTime(1, " + automationTime + ", 1)", functi
on() { | |
| 53 g.gain.setTargetAtTime(1, automationTime, 1); | |
| 54 }).throw("NotSupportedError") && success; | |
| 55 | |
| 56 success = Should("setValueAtTime(1, " + (curveStartTime + 1.1 * duration
) + ")", function() { | |
| 57 g.gain.setValueAtTime(1, curveStartTime + 1.1 * duration); | |
| 58 }).notThrow() && success; | |
| 59 | |
| 60 var prefix = "Automation functions overlapping an existing setValueCurve
AtTime"; | |
| 61 if (success) | |
| 62 testPassed(prefix + " correctly signaled errors.\n"); | |
| 63 else | |
| 64 testFailed(prefix + " failed to signal errors.\n"); | |
| 65 | |
| 66 done(); | |
| 67 }); | |
| 68 | |
| 69 audit.defineTask("automations", function (done) { | |
| 70 var success = true; | |
| 71 var context = new OfflineAudioContext(1, testDurationFrames, sampleRate)
; | |
| 72 var g = context.createGain(); | |
| 73 | |
| 74 var curve = new Float32Array(2); | |
| 75 // Start time and duration for setValueCurveAtTime | |
| 76 var startTime = 0; | |
| 77 var timeInterval = testDurationSec / 10; | |
| 78 | |
| 79 startTime += timeInterval; | |
| 80 success = Should("linearRampToValueAtTime(1, " + startTime + ")", functi
on () { | |
| 81 g.gain.linearRampToValueAtTime(1, startTime); | |
| 82 }).notThrow() && success; | |
| 83 | |
| 84 startTime += timeInterval; | |
| 85 success = Should("exponentialRampToValueAtTime(1, " + startTime + ")", f
unction () { | |
| 86 g.gain.exponentialRampToValueAtTime(1, startTime); | |
| 87 }).notThrow() && success; | |
| 88 | |
| 89 startTime += timeInterval; | |
| 90 success = Should("setTargetAtTime(1, " + startTime + ", 0.1)", function
() { | |
| 91 g.gain.setTargetAtTime(1, startTime, 0.1); | |
| 92 }).notThrow() && success; | |
| 93 | |
| 94 startTime += timeInterval; | |
| 95 success = Should("setValueCurveAtTime(curve, " + startTime + ", 0.1)", f
unction () { | |
| 96 g.gain.setValueCurveAtTime(curve, startTime, 0.1); | |
| 97 }).notThrow() && success; | |
| 98 | |
| 99 // Now try to setValueCurve that overlaps each of the above automations | |
| 100 startTime = timeInterval / 2; | |
| 101 | |
| 102 for (var k = 0; k < 4; ++k) { | |
| 103 var time = startTime + timeInterval * k; | |
| 104 success = Should("setValueCurveAtTime(curve, " + time + ", 0.01)", fun
ction () { | |
| 105 g.gain.setValueCurveAtTime(curve, time, 0.01); | |
| 106 }).throw("NotSupportedError") && success; | |
| 107 } | |
| 108 | |
| 109 // Elements of setValueCurve should be finite. | |
| 110 success = Should("setValueCurveAtTime([NaN, NaN], " + time + ", 0.01)",
function () { | |
| 111 g.gain.setValueCurveAtTime(Float32Array.from([NaN, NaN]), time, 0.01); | |
| 112 }).throw("TypeError") && success; | |
| 113 | |
| 114 success = Should("setValueCurveAtTime([1, Infinity], " + time + ", 0.01)
", function () { | |
| 115 g.gain.setValueCurveAtTime(Float32Array.from([1, Infinity]), time, 0.0
1); | |
| 116 }).throw("TypeError") && success; | |
| 117 | |
| 118 var d = context.createDelay(); | |
| 119 // Check that we get warnings for out-of-range values and also throw for | |
| 120 // non-finite values. | |
| 121 success = Should("delayTime.setValueCurveAtTime([1, 5], " + time + ", 0.
01)", function() { | |
| 122 d.delayTime.setValueCurveAtTime(Float32Array.from([1, 5]), time, 0.01)
; | |
| 123 }).notThrow() && success; | |
| 124 | |
| 125 success = Should("delayTime.setValueCurveAtTime([1, 5, Infinity], " + ti
me + ", 0.01)", | |
| 126 function() { | |
| 127 d.delayTime.setValueCurveAtTime(Float32Array.from([1, 5, Infinity]),
time, 0.01); | |
| 128 }).throw("TypeError") && success; | |
| 129 | |
| 130 // One last test that prints out lots of digits for the time. | |
| 131 var time = Math.PI / 100; | |
| 132 success = Should("setValueCurveAtTime(curve, " + time + ", 0.01)", funct
ion () { | |
| 133 g.gain.setValueCurveAtTime(curve, time, 0.01); | |
| 134 }).throw("NotSupportedError") && success; | |
| 135 | |
| 136 var prefix = "setValueCurve overlapping existing automation functions"; | |
| 137 if (success) | |
| 138 testPassed(prefix + " correctly signaled errors.\n"); | |
| 139 else | |
| 140 testFailed(prefix + " failed to signal errors.\n"); | |
| 141 | |
| 142 done(); | |
| 143 }); | |
| 144 | |
| 145 audit.defineTask("catch-exception", function (done) { | |
| 146 // Verify that the curve isn't inserted into the time line even if we ca
tch the exception. | |
| 147 var success = true; | |
| 148 var context = new OfflineAudioContext(1, testDurationFrames, sampleRate)
; | |
| 149 var gain = context.createGain(); | |
| 150 var source = context.createBufferSource(); | |
| 151 var buffer = context.createBuffer(1, 1, context.sampleRate); | |
| 152 buffer.getChannelData(0)[0] = 1; | |
| 153 source.buffer = buffer; | |
| 154 source.loop = true; | |
| 155 | |
| 156 source.connect(gain); | |
| 157 gain.connect(context.destination); | |
| 158 | |
| 159 gain.gain.setValueAtTime(1, 0); | |
| 160 try { | |
| 161 // The value curve has an invalid element. This automation shouldn't b
e inserted into the | |
| 162 // timeline at all. | |
| 163 gain.gain.setValueCurveAtTime(Float32Array.from([0, NaN]), 128 / conte
xt.sampleRate, .5); | |
| 164 } catch (e) { | |
| 165 }; | |
| 166 source.start(); | |
| 167 | |
| 168 context.startRendering().then(function (resultBuffer) { | |
| 169 // Since the setValueCurve wasn't inserted, the output should be exact
ly 1 for the entire | |
| 170 // duration. | |
| 171 var success = Should("Handled setValueCurve exception so output", resu
ltBuffer.getChannelData(0)) | |
| 172 .beConstantValueOf(1); | |
| 173 | |
| 174 if (success) | |
| 175 testPassed("setValueCurveAtTime correctly not inserted into timeline
.\n"); | |
| 176 else | |
| 177 testFailed("setValueCurveAtTime incorrectly still inserted into time
line.\n"); | |
| 178 }).then(done); | |
| 179 }); | |
| 180 | |
| 181 audit.defineTask("start-end", function (done) { | |
| 182 var success = true; | |
| 183 var context = new OfflineAudioContext(1, testDurationFrames, sampleRate)
; | |
| 184 var g = context.createGain(); | |
| 185 var curve = new Float32Array(2); | |
| 186 | |
| 187 // Verify that a setValueCurve can start at the end of an automation. | |
| 188 var time = 0; | |
| 189 var timeInterval = testDurationSec / 50; | |
| 190 success = Should("setValueAtTime(1, " + time + ")", function () { | |
| 191 g.gain.setValueAtTime(1, time); | |
| 192 }).notThrow(); | |
| 193 | |
| 194 time += timeInterval; | |
| 195 success = Should("linearRampToValueAtTime(0, " + time + ")", function ()
{ | |
| 196 g.gain.linearRampToValueAtTime(0, time); | |
| 197 }).notThrow() && success; | |
| 198 | |
| 199 // setValueCurve starts at the end of the linear ramp. This should be fi
ne. | |
| 200 success = Should("setValueCurveAtTime(..., " + time + ", " + timeInterva
l + ")", function () { | |
| 201 g.gain.setValueCurveAtTime(curve, time, timeInterval); | |
| 202 }).notThrow() && success; | |
| 203 | |
| 204 // exponentialRamp ending one interval past the setValueCurve should be
fine. | |
| 205 time += 2*timeInterval; | |
| 206 success = Should("exponentialRampToValueAtTime(1, " + time + ")", functi
on () { | |
| 207 g.gain.exponentialRampToValueAtTime(1, time); | |
| 208 }).notThrow() && success; | |
| 209 | |
| 210 // setValueCurve starts at the end of the exponential ramp. This should
be fine. | |
| 211 success = Should("setValueCurveAtTime(..., " + time + ", " + timeInterva
l + ")", function () { | |
| 212 g.gain.setValueCurveAtTime(curve, time, timeInterval); | |
| 213 }).notThrow() && success; | |
| 214 | |
| 215 // setValueCurve at the end of the setValueCurve should be fine. | |
| 216 time += timeInterval; | |
| 217 success = Should("setValueCurveAtTime(..., " + time + ", " + timeInterva
l + ")", function () { | |
| 218 g.gain.setValueCurveAtTime(curve, time, timeInterval); | |
| 219 }).notThrow() && success; | |
| 220 | |
| 221 // setValueAtTime at the end of setValueCurve should be fine. | |
| 222 time += timeInterval; | |
| 223 success = Should("setValueAtTime(0, " + time + ")", function () { | |
| 224 g.gain.setValueAtTime(0, time); | |
| 225 }).notThrow() && success; | |
| 226 | |
| 227 // setValueCurve at the end of setValueAtTime should be fine. | |
| 228 success = Should("setValueCurveAtTime(..., " + time + ", " + timeInterva
l + ")", function () { | |
| 229 g.gain.setValueCurveAtTime(curve, time, timeInterval); | |
| 230 }).notThrow() && success; | |
| 231 | |
| 232 // setTarget starting at the end of setValueCurve should be fine. | |
| 233 time += timeInterval; | |
| 234 success = Should("setTargetAtTime(1, " + time + ", 1)", function () { | |
| 235 g.gain.setTargetAtTime(1, time, 1); | |
| 236 }).notThrow() && success; | |
| 237 | |
| 238 var prefix = "setValueCurve with adjoining automation functions"; | |
| 239 if (success) | |
| 240 testPassed(prefix + " allowed as expected.\n"); | |
| 241 else | |
| 242 testFailed(prefix + " unexpectedly signaled errors.\n"); | |
| 243 | |
| 244 done(); | |
| 245 }); | |
| 246 | |
| 247 audit.defineTask("curve lengths", function (done) { | |
| 248 var success = true; | |
| 249 var context = new OfflineAudioContext(1, testDurationFrames, sampleRate)
; | |
| 250 var g = context.createGain(); | |
| 251 var time = 0; | |
| 252 | |
| 253 // Check for invalid curve lengths | |
| 254 success = Should("setValueCurveAtTime([], " + time + ", 0.01)", function
() { | |
| 255 g.gain.setValueCurveAtTime(Float32Array.from([]), time, 0.01); | |
| 256 }).throw("InvalidStateError") && success; | |
| 257 | |
| 258 success = Should("setValueCurveAtTime([1], " + time + ", 0.01)", functio
n () { | |
| 259 g.gain.setValueCurveAtTime(Float32Array.from([1]), time, 0.01); | |
| 260 }).throw("InvalidStateError") && success; | |
| 261 | |
| 262 success = Should("setValueCurveAtTime([1,2], " + time + ", 0.01)", funct
ion () { | |
| 263 g.gain.setValueCurveAtTime(Float32Array.from([1,2]), time, 0.01); | |
| 264 }).notThrow() && success; | |
| 265 | |
| 266 if (success) | |
| 267 testPassed("Exceptions for curve length correctly handled.\n"); | |
| 268 else | |
| 269 testFailed("Exceptions for curve length not correctly handled.\n"); | |
| 270 | |
| 271 done(); | |
| 272 }); | |
| 273 | |
| 274 audit.defineTask("finish", function (done) { | |
| 275 finishJSTest(); | |
| 276 done(); | |
| 277 }); | |
| 278 | |
| 279 audit.runTasks(); | |
| 280 successfullyParsed = true; | |
| 281 </script> | |
| 282 </body> | |
| 283 </html> | |
| 284 | |
| 285 | |
| 286 | |
| 287 | |
| 288 | |
| 289 | |
| 290 | |
| 291 | |
| 292 | |
| OLD | NEW |