| Index: third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-processing.html
|
| diff --git a/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-processing.html b/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-processing.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f6eb35c7990ff44d2f8f5f921a81f9e6c861dd21
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-processing.html
|
| @@ -0,0 +1,300 @@
|
| +<!doctype html>
|
| +<html>
|
| + <head>
|
| + <title>Test Processing Of AudioParams of Disconnected AudioNodes</title>
|
| + <script src="../../resources/testharness.js"></script>
|
| + <script src="../../resources/testharnessreport.js"></script>
|
| + <script src="../resources/audio-testing.js"></script>
|
| + </head>
|
| +
|
| + <body>
|
| + <script>
|
| + // Arbitrary sample rate.
|
| + var sampleRate = 8000;
|
| +
|
| + // Arbitrary number of frames for the test, except it must be greater than
|
| + // |automationEndFrame|.
|
| + var renderFrames = 1024;
|
| +
|
| + // The linear ramp automation ends at this frame. Arbitrary, except it
|
| + // must be strictly less than the render length.
|
| + var automationEndFrame = 128;
|
| +
|
| + var audit = Audit.createTaskRunner();
|
| +
|
| + // There should be a test for every single node which has an AudioParam.
|
| + // Source nodes are not included in this because the AudioParams for the
|
| + // source nodes only process when the node has been started.
|
| +
|
| + audit.defineTask("BiquadFilterNode", function (taskDone) {
|
| + var nodeName = "BiquadFilterNode"
|
| + Promise.all([
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "Q",
|
| + initialValue: 2,
|
| + rampFinalValue: 5
|
| + }),
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "detune",
|
| + initialValue: 1,
|
| + rampFinalValue: 0.5
|
| + }),
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "frequency",
|
| + initialValue: 1000,
|
| + rampFinalValue: 100
|
| + }),
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "gain",
|
| + initialValue: -3,
|
| + rampFinalValue: 3
|
| + }),
|
| + ]).then(taskDone);
|
| + });
|
| +
|
| + audit.defineTask("DelayNode", function (taskDone) {
|
| + testParamAutomation({
|
| + nodeName: "DelayNode",
|
| + paramName: "delayTime",
|
| + initialValue: 0.25,
|
| + rampFinalValue: 0.5
|
| + }).then(taskDone);
|
| + });
|
| +
|
| + audit.defineTask("DynamicsCompressorNode", function (taskDone) {
|
| + var nodeName = "DynamicsCompressorNode";
|
| + Promise.all([
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "attack",
|
| + initialValue: 0.1,
|
| + rampFinalValue: 0.5
|
| + }),
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "knee",
|
| + initialValue: 0,
|
| + rampFinalValue: 25
|
| + }),
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "ratio",
|
| + initialValue: 1,
|
| + rampFinalValue: 15
|
| + }),
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "release",
|
| + initialValue: 0,
|
| + rampFinalValue: 0.75
|
| + }),
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "threshold",
|
| + initialValue: -50,
|
| + rampFinalValue: -10
|
| + })
|
| + ]).then(taskDone);
|
| + });
|
| +
|
| + audit.defineTask("GainNode", function (taskDone) {
|
| + testParamAutomation({
|
| + nodeName: "GainNode",
|
| + paramName: "gain",
|
| + initialValue: 1,
|
| + rampFinalValue: 0.5
|
| + }).then(taskDone);
|
| + });
|
| +
|
| + audit.defineTask("PannerNode", function (taskDone) {
|
| + var nodeName = "PannerNode";
|
| + Promise.all([
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "positionX",
|
| + initialValue: 0.1,
|
| + rampFinalValue: 0.5
|
| + }),
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "positionY",
|
| + initialValue: 2,
|
| + rampFinalValue: 30
|
| + }),
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "positionZ",
|
| + initialValue: 1,
|
| + rampFinalValue: 15
|
| + }),
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "orientationX",
|
| + initialValue: 0.1,
|
| + rampFinalValue: 0.5
|
| + }),
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "orientationY",
|
| + initialValue: 2,
|
| + rampFinalValue: 30
|
| + }),
|
| + testParamAutomation({
|
| + nodeName: nodeName,
|
| + paramName: "orientationZ",
|
| + initialValue: 1,
|
| + rampFinalValue: 15
|
| + }),
|
| + ]).then(taskDone);
|
| + });
|
| +
|
| + audit.defineTask("StereoPannerNode", function (taskDone) {
|
| + testParamAutomation({
|
| + nodeName: "StereoPannerNode",
|
| + paramName: "pan",
|
| + initialValue: 1,
|
| + rampFinalValue: 0.5
|
| + }).then(taskDone);
|
| + });
|
| +
|
| + audit.defineTask("AudioListener", function (taskDone) {
|
| + Promise.all([
|
| + testAudioListener({
|
| + paramName: "positionX",
|
| + initialValue: 1,
|
| + rampFinalValue: 100
|
| + }),
|
| + testAudioListener({
|
| + paramName: "positionY",
|
| + initialValue: 1,
|
| + rampFinalValue: 200
|
| + }),
|
| + testAudioListener({
|
| + paramName: "positionZ",
|
| + initialValue: 1,
|
| + rampFinalValue: 300
|
| + }),
|
| + testAudioListener({
|
| + paramName: "forwardX",
|
| + initialValue: 1,
|
| + rampFinalValue: -100
|
| + }),
|
| + testAudioListener({
|
| + paramName: "forwardY",
|
| + initialValue: 1,
|
| + rampFinalValue: -200
|
| + }),
|
| + testAudioListener({
|
| + paramName: "forwardZ",
|
| + initialValue: 1,
|
| + rampFinalValue: -300
|
| + }),
|
| + testAudioListener({
|
| + paramName: "upX",
|
| + initialValue: 1,
|
| + rampFinalValue: 99
|
| + }),
|
| + testAudioListener({
|
| + paramName: "upY",
|
| + initialValue: 1,
|
| + rampFinalValue: 42
|
| + }),
|
| + testAudioListener({
|
| + paramName: "upZ",
|
| + initialValue: 1,
|
| + rampFinalValue: 137
|
| + }),
|
| + ]).then(taskDone);
|
| + });
|
| +
|
| + // Run test of automation processing. |options| is a dictionary that
|
| + // describes the node to test, the AudioParams to be tested and the values
|
| + // for the AudioParam. The members of the dictionary are:
|
| + //
|
| + // nodeName - name of the node (constructor name)
|
| + // paramName - name of the AudioParam to be tested
|
| + // initialValue - starting value for linear ramp
|
| + // rampFinalValue - finale value for linear ramp
|
| + //
|
| + // The test is considered to have succeeded if the |.value| of the AudioParam
|
| + // is the final value.
|
| + //
|
| + // A simple graph is created containing the node to be tested, connected
|
| + // to the destination. A linear ramp automation is scheduled for the
|
| + // specified AudioParam, starting and ending at the values given.
|
| + //
|
| + // Processing is started and after some number of frames, the |.value| of
|
| + // the AudioParam is obtained and compared against the final value. These
|
| + // should match exactly.
|
| + function testParamAutomation(options) {
|
| + var context = new OfflineAudioContext(1, renderFrames, sampleRate);
|
| +
|
| + // Create the node to be tested
|
| + var node = new window[options.nodeName](context);
|
| + node.connect(context.destination);
|
| +
|
| + // A linear ramp starting at frame 0 to frame |automationEndFrame| is
|
| + // used for the test. This value is fairly arbitrary, but it should be
|
| + // less than the total render frames.
|
| +
|
| + node[options.paramName].setValueAtTime(options.initialValue, 0);
|
| + node[options.paramName].linearRampToValueAtTime(options.rampFinalValue,
|
| + automationEndFrame / context.sampleRate);
|
| +
|
| + return context.startRendering()
|
| + .then(function (resultBuffer) {
|
| + // Sanity check: the given ramp final value must not be the default
|
| + // value, otherwise we can't easily tell if the automation was
|
| + // actually run.
|
| + Should(options.nodeName + "." + options.paramName + " ramp final value",
|
| + options.rampFinalValue)
|
| + .notBeEqualTo(node[options.paramName].defaultValue);
|
| +
|
| + // The actual AudioParam value should be the rampe final value.
|
| + Should(options.nodeName + "." + options.paramName +
|
| + ".value",
|
| + node[options.paramName].value)
|
| + .beEqualTo(options.rampFinalValue);
|
| + });
|
| + }
|
| +
|
| + function testAudioListener(options) {
|
| + var context = new OfflineAudioContext(1, renderFrames, sampleRate);
|
| +
|
| + // Create the node to be tested
|
| + var node = new PannerNode(context);
|
| + node.connect(context.destination);
|
| +
|
| + // A linear ramp starting at frame 0 to frame |automationEndFrame| is
|
| + // used for the test. This value is fairly arbitrary, but it should be
|
| + // less than the total render frames.
|
| +
|
| + context.listener[options.paramName].setValueAtTime(options.initialValue, 0);
|
| + context.listener[options.paramName].linearRampToValueAtTime(options.rampFinalValue,
|
| + automationEndFrame / context.sampleRate);
|
| +
|
| + return context.startRendering()
|
| + .then(function (resultBuffer) {
|
| + // Sanity check: the given ramp final value must not be the default
|
| + // value, otherwise we can't easily tell if the automation was
|
| + // actually run.
|
| + Should("AudioListener." + options.paramName + " ramp final value",
|
| + options.rampFinalValue)
|
| + .notBeEqualTo(context.listener[options.paramName].defaultValue);
|
| +
|
| + // The actual AudioParam value should be the rampe final value.
|
| + Should("AudioListener." + options.paramName +
|
| + ".value",
|
| + context.listener[options.paramName].value)
|
| + .beEqualTo(options.rampFinalValue);
|
| + });
|
| + }
|
| +
|
| + audit.runTasks();
|
| + </script>
|
| + </body>
|
| +</html>
|
|
|