Chromium Code Reviews| Index: third_party/WebKit/LayoutTests/webaudio/audioparam-clamp-time-to-current-time.html |
| diff --git a/third_party/WebKit/LayoutTests/webaudio/audioparam-clamp-time-to-current-time.html b/third_party/WebKit/LayoutTests/webaudio/audioparam-clamp-time-to-current-time.html |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ab14c6ee62a9987e656fa2cb328f4c982c03d6ba |
| --- /dev/null |
| +++ b/third_party/WebKit/LayoutTests/webaudio/audioparam-clamp-time-to-current-time.html |
| @@ -0,0 +1,229 @@ |
| +<!doctype html> |
| +<html> |
| + <head> |
| + <title>Test Clamping of AudioParam Time</title> |
| + <script src="../resources/testharness.js"></script> |
| + <script src="../resources/testharnessreport.js"></script> |
| + <script src="resources/audio-testing.js"></script> |
| + </head> |
| + |
| + <body> |
| + <script> |
| + // Fairly arbitrary sample rate and render frames. |
| + var sampleRate = 24000; |
| + var renderFrames = 1024; |
| + |
| + var audit = Audit.createTaskRunner(); |
| + |
| + audit.defineTask("setValue", function (taskDone) { |
| + var suspendFrame = 128; |
| + createGraph({ |
| + suspendFrame: suspendFrame, |
| + method: "setValueAtTime", |
| + initialGain: 0, |
| + arg0: 1, |
| + }) |
| + .then(function (resultBuffer) { |
| + // Just verify that the cosine wave actually started at |
| + // suspendFrame. |
| + var result = resultBuffer.getChannelData(0); |
| + var success = true; |
| + |
| + success = Should("Output[0-" + (suspendFrame - 1) + "]", result.slice(0, |
|
hongchan
2016/10/18 17:34:59
Wrap this line. (and below)
Raymond Toy
2016/10/18 20:33:18
Done.
|
| + suspendFrame)) |
| + .beConstantValueOf(0) && success; |
| + success = Should("Output[" + suspendFrame + "-" + (renderFrames - 1) + "]", |
| + result.slice(suspendFrame)) |
| + .beConstantValueOf(1) && success; |
| + |
| + Should("*** setValueAtTime in the past", success) |
| + .summarize( |
| + "correctly clamped to current time", |
| + "was not correctly clamped to current time"); |
| + }) |
| + .then(taskDone); |
| + }); |
| + |
| + audit.defineTask("linear", function (taskDone) { |
| + var suspendFrame = 128; |
| + createGraph({ |
| + suspendFrame: suspendFrame, |
| + method: "linearRampToValueAtTime", |
| + initialGain: 1, |
| + arg0: 0.5 |
| + }) |
| + .then(function (resultBuffer) { |
| + // Just verify that the cosine wave actually started at |
| + // suspendFrame. |
| + var result = resultBuffer.getChannelData(0); |
| + var success = true; |
| + |
| + success = Should("Output[0-" + (suspendFrame - 1) + "]", result.slice(0, |
| + suspendFrame)) |
| + .beConstantValueOf(1) && success; |
| + success = Should("Output[" + suspendFrame + "-" + (renderFrames - 1) + "]", |
| + result.slice(suspendFrame)) |
| + .beConstantValueOf(0.5) && success; |
| + |
| + Should("*** linearRampToValueAtTime in the past", success) |
| + .summarize( |
| + "correctly clamped to current time", |
| + "was not correctly clamped to current time"); |
| + }) |
| + .then(taskDone); |
| + }); |
| + |
| + audit.defineTask("exponential", function (taskDone) { |
| + var suspendFrame = 128; |
| + createGraph({ |
| + suspendFrame: suspendFrame, |
| + method: "exponentialRampToValueAtTime", |
| + initialGain: 1, |
| + arg0: 0.5 |
| + }) |
| + .then(function (resultBuffer) { |
| + // Just verify that the cosine wave actually started at |
| + // suspendFrame. |
| + var result = resultBuffer.getChannelData(0); |
| + var success = true; |
| + |
| + success = Should("Output[0-" + (suspendFrame - 1) + "]", result.slice(0, |
| + suspendFrame)) |
| + .beConstantValueOf(1) && success; |
| + success = Should("Output[" + suspendFrame + "-" + (renderFrames - 1) + "]", |
| + result.slice(suspendFrame)) |
| + .beConstantValueOf(0.5) && success; |
| + |
| + Should("*** exponentialRampToValueAtTime in the past", success) |
| + .summarize( |
| + "correctly clamped to current time", |
| + "was not correctly clamped to current time"); |
| + }) |
| + .then(taskDone); |
| + }); |
| + |
| + audit.defineTask("setTarget", function (taskDone) { |
| + var suspendFrame = 128; |
| + createGraph({ |
| + suspendFrame: suspendFrame, |
| + method: "setTargetAtTime", |
| + initialGain: 1, |
| + arg0: 0.5, |
| + moreArgs: 0.1 |
| + }) |
| + .then(function (resultBuffer) { |
| + // Just verify that the cosine wave actually started at |
| + // suspendFrame. |
| + var result = resultBuffer.getChannelData(0); |
| + var success = true; |
| + |
| + success = Should("Output[0-" + (suspendFrame - 1) + "]", result.slice(0, |
| + suspendFrame)) |
| + .beConstantValueOf(1) && success; |
| + // For the samples past the suspend time, we only care that first |
| + // value is 1 and that the rest are not zero. |
| + success = Should("Output[" + suspendFrame + "]", |
| + result[suspendFrame]).beEqualTo(1) && success; |
| + |
| + var positive = result.slice(suspendFrame + 1).every(x => x > 0); |
| + success = Should("Output[" + (suspendFrame + 1) + "-" + |
| + (renderFrames - 1) + "] contains only positive values", |
| + positive) |
| + .beEqualTo(true) && success; |
| + |
| + Should("*** setTargetAtTime in the past", success) |
| + .summarize( |
| + "correctly clamped to current time", |
| + "was not correctly clamped to current time"); |
| + }) |
| + .then(taskDone); |
| + }); |
| + |
| + audit.defineTask("setValueCurve", function (taskDone) { |
| + var suspendFrame = 128; |
| + createGraph({ |
| + suspendFrame: suspendFrame, |
| + method: "setValueCurveAtTime", |
| + initialGain: 1, |
| + arg0: Float32Array.from([2, 3]), |
| + moreArgs: 0.1 |
| + }) |
| + .then(function (resultBuffer) { |
| + // Just verify that the cosine wave actually started at |
| + // suspendFrame. |
| + var result = resultBuffer.getChannelData(0); |
| + var success = true; |
| + |
| + success = Should("Output[0-" + (suspendFrame - 1) + "]", result.slice(0, |
| + suspendFrame)) |
| + .beConstantValueOf(1) && success; |
| + |
| + // The selected curve contains values greater than or equal to 2. |
| + // Just verify that all values are greater than or equal to 2. |
| + var biggerThan2 = result.slice(suspendFrame).every(x => x >= 2); |
| + success = Should("Output[" + suspendFrame + "-" + (renderFrames - 1) + "]", |
| + biggerThan2) |
| + .beEqualTo(true) && success; |
| + |
| + Should("*** setValueCurveAtTime in the past", success) |
| + .summarize( |
| + "correctly clamped to current time", |
| + "was not correctly clamped to current time"); |
| + }) |
| + .then(taskDone); |
| + }); |
| + |
| + |
| + // Create the test graph consisting of a constant source followed by a |
| + // gain node. The gain node automations will be tested. |options| |
| + // specifies the parameters for the test including |
| + // |
| + // suspendFrame: time at which we schedule the automation call |
| + // method: the name of automation method to be tested |
| + // initialGain: the initial gain at time 0 for the gain node |
| + // arg0: the first argument to be supplied to the automation method. |
| + // moreArgs: An array of any additional arguments for the automation method. |
| + function createGraph(options) { |
| + var context = new OfflineAudioContext(1, renderFrames, sampleRate); |
| + |
| + var cosineWave = new PeriodicWave(context, { |
| + real: [0, 1] |
| + }); |
| + |
| + var src = new OscillatorNode(context, { |
| + periodicWave: cosineWave, |
| + frequency: 0 |
| + }); |
| + |
| + // The gain node whose automations we're testing. |
| + var gain = new GainNode(context, { |
| + gain: 0 |
| + }); |
| + |
| + src.connect(gain).connect(context.destination); |
| + |
| + gain.gain.setValueAtTime(options.initialGain, 0); |
| + |
| + // Suspend rendering so that we can call the automation method at the |
| + // right time. |startTime| is the time for the automation method. It |
| + // must be some time before the suspend time. |
| + var suspendFrame = options.suspendFrame; |
| + var startTime = (suspendFrame / 2) / context.sampleRate; |
| + context.suspend(suspendFrame / context.sampleRate) |
| + .then(function () { |
| + // Call the appropriate automation method with the desired |
| + // automation value, time, and any other arguments needed. |
| + gain.gain[options.method](...[options.arg0, startTime, options.moreArgs]); |
| + }) |
| + .then(context.resume.bind(context)); |
| + |
| + // Start the source and begin rendering, returning the promise from |
| + // rendering. |
| + src.start(); |
| + |
| + return context.startRendering(); |
| + } |
| + audit.runTasks(); |
| + </script> |
| + </body> |
| +</html> |