| Index: third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-setTargetAtTime-continuous.html
|
| diff --git a/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-setTargetAtTime-continuous.html b/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-setTargetAtTime-continuous.html
|
| index 104909f1aba7993685a40faf08bc1f4d988ce762..b7cfb435ea7b3a569d16e740b82807ebb69ea85b 100644
|
| --- a/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-setTargetAtTime-continuous.html
|
| +++ b/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-setTargetAtTime-continuous.html
|
| @@ -1,37 +1,37 @@
|
| -<!doctype html>
|
| +<!DOCTYPE html>
|
| <html>
|
| <head>
|
| + <title>
|
| + SetTarget Followed by Linear or Exponential Ramp Is Continuous
|
| + </title>
|
| <script src="../../resources/testharness.js"></script>
|
| - <script src="../../resources/testharnessreport.js"></script>
|
| + <script src="../../resources/testharnessreport.js"></script>
|
| <script src="../resources/audit-util.js"></script>
|
| <script src="../resources/audit.js"></script>
|
| <script src="../resources/audioparam-testing.js"></script>
|
| - <title>SetTarget Followed by Linear or Exponential Ramp Is Continuous</title>
|
| </head>
|
| -
|
| <body>
|
| - <script>
|
| -
|
| - var sampleRate = 48000;
|
| - var renderQuantum = 128;
|
| + <script id="layout-test-code">
|
| + let sampleRate = 48000;
|
| + let renderQuantum = 128;
|
| // Test doesn't need to run for very long.
|
| - var renderDuration = 0.1;
|
| + let renderDuration = 0.1;
|
| // Where the ramp should end
|
| - var rampEndTime = renderDuration - .05;
|
| - var renderFrames = renderDuration * sampleRate;
|
| - var timeConstant = 0.01;
|
| -
|
| - var audit = Audit.createTaskRunner();
|
| -
|
| - // All of the tests start a SetTargetAtTime after one rendering quantum. The following tests
|
| - // handle various cases where a linear or exponential ramp is scheduled at or after
|
| - // SetTargetAtTime starts.
|
| -
|
| - audit.define("linear ramp replace", (task, should) => {
|
| - // Schedule a linear ramp to start at the same time as SetTargetAtTime. This effectively
|
| - // replaces the SetTargetAtTime as if it never existed.
|
| - runTest(should, "Linear ramp", {
|
| - automationFunction: function (audioparam, endValue, endTime) {
|
| + let rampEndTime = renderDuration - .05;
|
| + let renderFrames = renderDuration * sampleRate;
|
| + let timeConstant = 0.01;
|
| +
|
| + let audit = Audit.createTaskRunner();
|
| +
|
| + // All of the tests start a SetTargetAtTime after one rendering quantum.
|
| + // The following tests handle various cases where a linear or exponential
|
| + // ramp is scheduled at or after SetTargetAtTime starts.
|
| +
|
| + audit.define('linear ramp replace', (task, should) => {
|
| + // Schedule a linear ramp to start at the same time as SetTargetAtTime.
|
| + // This effectively replaces the SetTargetAtTime as if it never existed.
|
| + runTest(should, 'Linear ramp', {
|
| + automationFunction: function(audioparam, endValue, endTime) {
|
| audioparam.linearRampToValueAtTime(endValue, endTime);
|
| },
|
| referenceFunction: linearResult,
|
| @@ -41,12 +41,12 @@
|
| }).then(() => task.done());
|
| });
|
|
|
| - audit.define("delayed linear ramp", (task, should) => {
|
| - // Schedule a linear ramp to start after the SetTargetAtTime has already started rendering.
|
| - // This is the main test to verify that the linear ramp is continuous with the
|
| - // SetTargetAtTime curve.
|
| - runTest(should, "Delayed linear ramp", {
|
| - automationFunction: function (audioparam, endValue, endTime) {
|
| + audit.define('delayed linear ramp', (task, should) => {
|
| + // Schedule a linear ramp to start after the SetTargetAtTime has already
|
| + // started rendering. This is the main test to verify that the linear
|
| + // ramp is continuous with the SetTargetAtTime curve.
|
| + runTest(should, 'Delayed linear ramp', {
|
| + automationFunction: function(audioparam, endValue, endTime) {
|
| audioparam.linearRampToValueAtTime(endValue, endTime);
|
| },
|
| referenceFunction: linearResult,
|
| @@ -56,10 +56,10 @@
|
| }).then(() => task.done());
|
| });
|
|
|
| - audit.define("expo ramp replace", (task, should) => {
|
| + audit.define('expo ramp replace', (task, should) => {
|
| // Like "linear ramp replace", but with an exponential ramp instead.
|
| - runTest(should, "Exponential ramp", {
|
| - automationFunction: function (audioparam, endValue, endTime) {
|
| + runTest(should, 'Exponential ramp', {
|
| + automationFunction: function(audioparam, endValue, endTime) {
|
| audioparam.exponentialRampToValueAtTime(endValue, endTime);
|
| },
|
| referenceFunction: exponentialResult,
|
| @@ -69,10 +69,10 @@
|
| }).then(() => task.done());
|
| });
|
|
|
| - audit.define("delayed expo ramp", (task, should) => {
|
| + audit.define('delayed expo ramp', (task, should) => {
|
| // Like "delayed linear ramp", but with an exponential ramp instead.
|
| - runTest(should, "Delayed exponential ramp", {
|
| - automationFunction: function (audioparam, endValue, endTime) {
|
| + runTest(should, 'Delayed exponential ramp', {
|
| + automationFunction: function(audioparam, endValue, endTime) {
|
| audioparam.exponentialRampToValueAtTime(endValue, endTime);
|
| },
|
| referenceFunction: exponentialResult,
|
| @@ -84,26 +84,33 @@
|
|
|
| audit.run();
|
|
|
| - function computeExpectedResult(automationTime, timeConstant, endValue, endTime, rampFunction) {
|
| - // The result is a constant value of 1 for one rendering quantum, then a SetTarget event
|
| - // lasting to |automationTime|, at which point a ramp starts which ends at |endValue|
|
| - // at |endTime|. Then the rest of curve should be held constant at |endValue|.
|
| - var initialPart = new Array(renderQuantum);
|
| + function computeExpectedResult(
|
| + automationTime, timeConstant, endValue, endTime, rampFunction) {
|
| + // The result is a constant value of 1 for one rendering quantum, then a
|
| + // SetTarget event lasting to |automationTime|, at which point a ramp
|
| + // starts which ends at |endValue| at |endTime|. Then the rest of curve
|
| + // should be held constant at |endValue|.
|
| + let initialPart = new Array(renderQuantum);
|
| initialPart.fill(1);
|
|
|
| - // Generate 1 extra frame so that we know where to start the linear ramp. The last sample
|
| - // of the array is where the ramp should start from.
|
| - var setTargetPart = createExponentialApproachArray(renderQuantum / sampleRate,
|
| - automationTime + 1 / sampleRate, 1, 0, sampleRate, timeConstant);
|
| - var setTargetLength = setTargetPart.length;
|
| -
|
| - // Generate the ramp starting at |automationTime| with a value from last value of the
|
| - // SetTarget curve above.
|
| - var rampPart = rampFunction(automationTime, endTime,
|
| - setTargetPart[setTargetLength - 1], endValue, sampleRate);
|
| -
|
| - // Finally finish out the rest with a constant value of |endValue|, if needed.
|
| - var finalPart = new Array(Math.floor((renderDuration - endTime) * sampleRate));
|
| + // Generate 1 extra frame so that we know where to start the linear
|
| + // ramp. The last sample of the array is where the ramp should start
|
| + // from.
|
| + let setTargetPart = createExponentialApproachArray(
|
| + renderQuantum / sampleRate, automationTime + 1 / sampleRate, 1, 0,
|
| + sampleRate, timeConstant);
|
| + let setTargetLength = setTargetPart.length;
|
| +
|
| + // Generate the ramp starting at |automationTime| with a value from last
|
| + // value of the SetTarget curve above.
|
| + let rampPart = rampFunction(
|
| + automationTime, endTime, setTargetPart[setTargetLength - 1],
|
| + endValue, sampleRate);
|
| +
|
| + // Finally finish out the rest with a constant value of |endValue|, if
|
| + // needed.
|
| + let finalPart =
|
| + new Array(Math.floor((renderDuration - endTime) * sampleRate));
|
| finalPart.fill(endValue);
|
|
|
| // Return the four parts separately for testing.
|
| @@ -116,112 +123,128 @@
|
| }
|
|
|
| function linearResult(automationTime, timeConstant, endValue, endTime) {
|
| - return computeExpectedResult(automationTime, timeConstant, endValue, endTime, createLinearRampArray);
|
| + return computeExpectedResult(
|
| + automationTime, timeConstant, endValue, endTime,
|
| + createLinearRampArray);
|
| }
|
|
|
| - function exponentialResult(automationTime, timeConstant, endValue, endTime) {
|
| - return computeExpectedResult(automationTime, timeConstant, endValue, endTime, createExponentialRampArray);
|
| + function exponentialResult(
|
| + automationTime, timeConstant, endValue, endTime) {
|
| + return computeExpectedResult(
|
| + automationTime, timeConstant, endValue, endTime,
|
| + createExponentialRampArray);
|
| }
|
|
|
| - // Run test to verify that a SetTarget followed by a ramp produces a continuous curve.
|
| - // |prefix| is a string to use as a prefix for the messages. |options| is a dictionary
|
| - // describing how the test is run:
|
| + // Run test to verify that a SetTarget followed by a ramp produces a
|
| + // continuous curve. |prefix| is a string to use as a prefix for the
|
| + // messages. |options| is a dictionary describing how the test is run:
|
| //
|
| // |options.automationFunction|
|
| - // The function to use to start the automation, which should be a linear or exponential
|
| - // ramp automation. This function has three arguments:
|
| + // The function to use to start the automation, which should be a
|
| + // linear or exponential ramp automation. This function has three
|
| + // arguments:
|
| // audioparam - the AudioParam to be automated
|
| // endValue - the end value of the ramp
|
| // endTime - the end time fo the ramp.
|
| // |options.referenceFunction|
|
| - // The function to generated the expected result. This function has four arguments:
|
| + // The function to generated the expected result. This function has
|
| + // four arguments:
|
| // automationTime - the value of |options.automationTime|
|
| // timeConstant - time constant used for SetTargetAtTime
|
| - // rampEndValue - end value for the ramp (same value used for automationFunction)
|
| - // rampEndTime - end time for the ramp (same value used for automationFunction)
|
| + // rampEndValue - end value for the ramp (same value used for
|
| + // automationFunction) rampEndTime - end time for the ramp (same
|
| + // value used for automationFunction)
|
| // |options.automationTime|
|
| - // Time at which the |automationFunction| is called to start the automation.
|
| + // Time at which the |automationFunction| is called to start the
|
| + // automation.
|
| // |options.thresholdSetTarget|
|
| - // Threshold to use for verifying that the initial (if any) SetTargetAtTime portion had
|
| - // the correct values.
|
| + // Threshold to use for verifying that the initial (if any)
|
| + // SetTargetAtTime portion had the correct values.
|
| // |options.thresholdRamp|
|
| - // Threshold to use for verifying that the ramp portion had the correct values.
|
| + // Threshold to use for verifying that the ramp portion had the
|
| + // correct values.
|
| function runTest(should, prefix, options) {
|
| - var automationFunction = options.automationFunction;
|
| - var referenceFunction = options.referenceFunction;
|
| - var automationTime = options.automationTime;
|
| - var thresholdSetTarget = options.thresholdSetTarget || 0;
|
| - var thresholdRamp = options.thresholdRamp || 0;
|
| -
|
| - // End value for the ramp. Fairly arbitrary, but should be distinctly different from the
|
| - // target value for SetTargetAtTime and the initial value of gain.gain.
|
| - var rampEndValue = 2;
|
| - var context = new OfflineAudioContext(1, renderFrames, sampleRate);
|
| + let automationFunction = options.automationFunction;
|
| + let referenceFunction = options.referenceFunction;
|
| + let automationTime = options.automationTime;
|
| + let thresholdSetTarget = options.thresholdSetTarget || 0;
|
| + let thresholdRamp = options.thresholdRamp || 0;
|
| +
|
| + // End value for the ramp. Fairly arbitrary, but should be distinctly
|
| + // different from the target value for SetTargetAtTime and the initial
|
| + // value of gain.gain.
|
| + let rampEndValue = 2;
|
| + let context = new OfflineAudioContext(1, renderFrames, sampleRate);
|
|
|
| // A constant source of amplitude 1.
|
| - var source = context.createBufferSource();
|
| + let source = context.createBufferSource();
|
| source.buffer = createConstantBuffer(context, 1, 1);
|
| source.loop = true;
|
|
|
| - var gain = context.createGain();
|
| + let gain = context.createGain();
|
|
|
| // The SetTarget starts after one rendering quantum.
|
| - gain.gain.setTargetAtTime(0, renderQuantum / context.sampleRate, timeConstant);
|
| -
|
| - // Schedule the ramp at |automationTime|. If this time is past the first rendering quantum,
|
| - // the SetTarget event will run for a bit before running the ramp. Otherwise, the SetTarget
|
| - // should be completely replaced by the ramp.
|
| - context.suspend(automationTime)
|
| - .then(function () {
|
| - automationFunction(gain.gain, rampEndValue, rampEndTime);
|
| - context.resume();
|
| - });
|
| + gain.gain.setTargetAtTime(
|
| + 0, renderQuantum / context.sampleRate, timeConstant);
|
| +
|
| + // Schedule the ramp at |automationTime|. If this time is past the
|
| + // first rendering quantum, the SetTarget event will run for a bit
|
| + // before running the ramp. Otherwise, the SetTarget should be
|
| + // completely replaced by the ramp.
|
| + context.suspend(automationTime).then(function() {
|
| + automationFunction(gain.gain, rampEndValue, rampEndTime);
|
| + context.resume();
|
| + });
|
|
|
| source.connect(gain);
|
| gain.connect(context.destination);
|
|
|
| source.start();
|
|
|
| - return context.startRendering().then(function (resultBuffer) {
|
| - var success = true;
|
| - var result = resultBuffer.getChannelData(0);
|
| - var expected = referenceFunction(automationTime, timeConstant, rampEndValue, rampEndTime);
|
| + return context.startRendering().then(function(resultBuffer) {
|
| + let success = true;
|
| + let result = resultBuffer.getChannelData(0);
|
| + let expected = referenceFunction(
|
| + automationTime, timeConstant, rampEndValue, rampEndTime);
|
|
|
| // Verify each part of the curve separately.
|
| - var startIndex = 0;
|
| - var length = expected.initialPart.length;
|
| + let startIndex = 0;
|
| + let length = expected.initialPart.length;
|
|
|
| // Verify that the initial part of the curve is constant.
|
| - should(result.slice(0, length), prefix + ": Initial part")
|
| - .beCloseToArray(expected.initialPart);
|
| + should(result.slice(0, length), prefix + ': Initial part')
|
| + .beCloseToArray(expected.initialPart);
|
|
|
| - // Verify the SetTarget part of the curve, if the SetTarget did actually run.
|
| + // Verify the SetTarget part of the curve, if the SetTarget did
|
| + // actually run.
|
| startIndex += length;
|
| length = expected.setTargetPart.length;
|
| if (length) {
|
| - should(result.slice(startIndex, startIndex + length),
|
| - prefix + ": SetTarget part")
|
| - .beCloseToArray(expected.setTargetPart, {
|
| - absoluteThreshold: thresholdSetTarget
|
| - });
|
| + should(
|
| + result.slice(startIndex, startIndex + length),
|
| + prefix + ': SetTarget part')
|
| + .beCloseToArray(
|
| + expected.setTargetPart,
|
| + {absoluteThreshold: thresholdSetTarget});
|
| } else {
|
| - should(!length, prefix + ": SetTarget part")
|
| - .message("was correctly replaced by the ramp",
|
| - "was incorrectly replaced by the ramp");
|
| + should(!length, prefix + ': SetTarget part')
|
| + .message(
|
| + 'was correctly replaced by the ramp',
|
| + 'was incorrectly replaced by the ramp');
|
| }
|
|
|
| // Verify the ramp part of the curve
|
| startIndex += length;
|
| length = expected.rampPart.length;
|
| should(result.slice(startIndex, startIndex + length), prefix)
|
| - .beCloseToArray(expected.rampPart, {
|
| - absoluteThreshold: thresholdRamp
|
| - });
|
| + .beCloseToArray(
|
| + expected.rampPart, {absoluteThreshold: thresholdRamp});
|
|
|
| - // Verify that the end of the curve after the ramp (if any) is a constant.
|
| + // Verify that the end of the curve after the ramp (if any) is a
|
| + // constant.
|
| startIndex += length;
|
| - should(result.slice(startIndex), prefix + ": Tail part")
|
| - .beCloseToArray(expected.tailPart);
|
| + should(result.slice(startIndex), prefix + ': Tail part')
|
| + .beCloseToArray(expected.tailPart);
|
|
|
| });
|
| }
|
|
|