| Index: third_party/WebKit/LayoutTests/webaudio/audioparam-setValueCurve-end.html
|
| diff --git a/third_party/WebKit/LayoutTests/webaudio/audioparam-setValueCurve-end.html b/third_party/WebKit/LayoutTests/webaudio/audioparam-setValueCurve-end.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..680aedda11e9319c6c5708af1f7b9cdef63a1146
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/webaudio/audioparam-setValueCurve-end.html
|
| @@ -0,0 +1,159 @@
|
| +<!doctype html>
|
| +<html>
|
| + <head>
|
| + <title>Test Automation Following setValueCurveAtTime Automations</title>
|
| + <script src="../resources/js-test.js"></script>
|
| + <script src="resources/compatibility.js"></script>
|
| + <script src="resources/audio-testing.js"></script>
|
| + <script src="resources/audio-param.js"></script>
|
| + </head>
|
| +
|
| + <body>
|
| + <script>
|
| + description("Test Automation Following setValueCurveAtTime Automations");
|
| + window.jsTestIsAsync = true;
|
| +
|
| + var sampleRate = 12800;
|
| + // Some short duration because we don't need to run the test for very long.
|
| + var testDurationFrames = 256;
|
| + var testDurationSec = testDurationFrames / sampleRate;
|
| + var curveDuration = testDurationSec / 2;
|
| +
|
| + var audit = Audit.createTaskRunner();
|
| +
|
| + // Configuration for each test.
|
| + //
|
| + // Required options:
|
| + // automation - Name of automation method to test
|
| + // time - Time for the automation method.
|
| + // Optional options:
|
| + // extraDuration - extra time for the duration of the setValueCurve
|
| + // duration. Default is 0. This should not be on a
|
| + // sample frame boundary. This is for testing that
|
| + // curves that don't end on a frame boundary are handled
|
| + // correctly.
|
| + // threshold - Error threshold for the test; default is 0.
|
| + var testConfigs = [{
|
| + automation: "linearRampToValueAtTime",
|
| + time: testDurationSec,
|
| + threshold: 3.9737e-8
|
| + }, {
|
| + automation: "linearRampToValueAtTime",
|
| + time: testDurationSec,
|
| + extraDuration: 0.5 / sampleRate,
|
| + threshold: 1.8141e-8
|
| + }, {
|
| + automation: "exponentialRampToValueAtTime",
|
| + time: testDurationSec,
|
| + threshold: 3.9737e-8
|
| + }, {
|
| + automation: "exponentialRampToValueAtTime",
|
| + time: testDurationSec,
|
| + extraDuration: 0.5 / sampleRate,
|
| + threshold: 2.0312e-8
|
| + }, {
|
| + automation: "setTargetAtTime",
|
| + time: curveDuration,
|
| + threshold: 1.5895e-7
|
| + }, {
|
| + automation: "setTargetAtTime",
|
| + time: curveDuration + 0.5 / sampleRate,
|
| + extraDuration: 0.5 / sampleRate,
|
| + threshold: 1.3278e-7
|
| + }];
|
| +
|
| + // Define tests from the configs
|
| + for (k in testConfigs) {
|
| + audit.defineTask(k + ": " + testConfigs[k].automation, (function (config) {
|
| + return function (done) {
|
| + runTest(config).then(done);
|
| + };
|
| + })(testConfigs[k]));
|
| + }
|
| +
|
| + audit.defineTask("finish", function (done) {
|
| + finishJSTest();
|
| + done();
|
| + });
|
| +
|
| + audit.runTasks();
|
| +
|
| + function runTest(options) {
|
| + // For the test, use a gain node with a constant input to test the
|
| + // automations.
|
| + var context = new OfflineAudioContext(1, testDurationFrames, sampleRate);
|
| + var source = context.createBufferSource();
|
| + source.buffer = createConstantBuffer(context, 1, 1);
|
| + source.loop = true;
|
| +
|
| + var gain = context.createGain();
|
| +
|
| + // Any valid curve is ok. We only use the last value for testing.
|
| + var curve = [0, 2, 0.3];
|
| + var actualDuration = curveDuration + (options.extraDuration || 0);
|
| + gain.gain.setValueCurveAtTime(Float32Array.from(curve), 0, actualDuration);
|
| +
|
| + // Run the desired test automation. The extra parameter (0.01) is only
|
| + // used for setTargetAtTime tests; it's ignored for other tests.
|
| + var automationValue = 2;
|
| + gain.gain[options.automation](automationValue, options.time, 0.01);
|
| +
|
| + source.connect(gain);
|
| + gain.connect(context.destination);
|
| +
|
| + source.start();
|
| +
|
| + return context.startRendering().then(function (resultBuffer) {
|
| + var result = resultBuffer.getChannelData(0);
|
| +
|
| + // Only need to verify that the ramp started at the right
|
| + // value. Figure the nearest sample frame to the end curve.
|
| + var curveEndFrame = Math.ceil(actualDuration * sampleRate);
|
| +
|
| + var expectedResult = curve[curve.length - 1];
|
| +
|
| + // Determine the expected value after the end of the setValueCurve event.
|
| + if (options.automation == "linearRampToValueAtTime") {
|
| + expectedResult = audioParamLinearRamp(
|
| + curveEndFrame / sampleRate,
|
| + curve[curve.length - 1], actualDuration,
|
| + automationValue, testDurationSec);
|
| + } else if (options.automation == "exponentialRampToValueAtTime") {
|
| + expectedResult = audioParamExponentialRamp(
|
| + curveEndFrame / sampleRate,
|
| + curve[curve.length - 1], actualDuration,
|
| + automationValue, testDurationSec);
|
| + } else if (options.automation == "setTargetAtTime") {
|
| + expectedResult = audioParamSetTarget(
|
| + curveEndFrame / sampleRate,
|
| + curve[curve.length - 1], actualDuration,
|
| + automationValue, 0.01);
|
| + }
|
| +
|
| + var message = "setValueCurve(..., " + 0 + ", " + actualDuration +
|
| + ")." + options.automation +
|
| + "(2, " + testDurationSec;
|
| +
|
| + if (options.automation == "setTargetAtTime")
|
| + message += ", 0.01";
|
| + message += ")";
|
| +
|
| + Should(message + ": value at time " + curveEndFrame / sampleRate, result[curveEndFrame])
|
| + .beCloseTo(expectedResult, options.threshold || 0);
|
| + });
|
| + }
|
| +
|
| + function linearRampValue(t, t0, v0, t1, v1) {
|
| + return v0 + (v1 - v0) * (t - t0) / (t1 - t0);
|
| + }
|
| +
|
| + function exponentialRampValue(t, t0, v0, t1, v1) {
|
| + return v0 * Math.pow(v1 / v0, (t - t0) / (t1 - t0));
|
| + }
|
| +
|
| + function setTargetValue(t, t0, v0, v1, timeConstant) {
|
| + return v1 + (v0 - v1) * Math.exp(-(t - t0) / timeConstant)
|
| + }
|
| + </script>
|
| + </body>
|
| +</html>
|
|
|