| Index: third_party/WebKit/LayoutTests/webaudio/audioparam-setTargetAtTime-limit.html
|
| diff --git a/third_party/WebKit/LayoutTests/webaudio/audioparam-setTargetAtTime-limit.html b/third_party/WebKit/LayoutTests/webaudio/audioparam-setTargetAtTime-limit.html
|
| deleted file mode 100644
|
| index 2034945f20e48d89b23b4433f473d84c687057d0..0000000000000000000000000000000000000000
|
| --- a/third_party/WebKit/LayoutTests/webaudio/audioparam-setTargetAtTime-limit.html
|
| +++ /dev/null
|
| @@ -1,160 +0,0 @@
|
| -<!doctype html>
|
| -<html>
|
| - <head>
|
| - <title>Test setTargetAtTime Approach to Limit</title>
|
| - <script src="../resources/js-test.js"></script>
|
| - <script src="resources/compatibility.js"></script>
|
| - <script src="resources/audit-util.js"></script>
|
| - <script src="resources/audio-testing.js"></script>
|
| - <script src="resources/audioparam-testing.js"></script>
|
| - </head>
|
| -
|
| - <body>
|
| - <script>
|
| - description("Test setTargetAtTime Approach to Limit");
|
| - window.jsTestIsAsync = true;
|
| -
|
| - var audit = Audit.createTaskRunner();
|
| -
|
| - audit.defineTask("approach 1", function(done) {
|
| - var sampleRate = 48000;
|
| -
|
| - // A really short time constant so that setTargetAtTime approaches the limiting value well
|
| - // before the end of the test.
|
| - var timeConstant = 0.001;
|
| -
|
| - // Find the time where setTargetAtTime is close enough to the limit. Since we're
|
| - // approaching 1, use a value of eps smaller than kSetTargetThreshold (5e-7) in
|
| - // AudioParamTimeline.cpp. This is to account for round-off in the actual implementation
|
| - // (which uses a filter and not the formula.)
|
| - var limitThreshold = 1e-7;
|
| -
|
| - runTest({
|
| - sampleRate: sampleRate,
|
| - v0: 0,
|
| - v1: 1,
|
| - timeConstant: timeConstant,
|
| - eps: limitThreshold,
|
| - // Experimentally determined
|
| - threshold: 2.4e-5
|
| - }).then(done);
|
| - })
|
| -
|
| - audit.defineTask("approach 0", function(done) {
|
| - // Use the equation for setTargetAtTime to figure out when we are close to 0:
|
| - //
|
| - // v(t) = exp(-t/tau)
|
| - //
|
| - // So find t such that exp(-t/tau) <= eps. Thus t >= - tau * log(eps).
|
| - //
|
| - // For eps, use 1e-20 (kSetTargetZeroThreshold in AudioParamTimeline.cpp).
|
| -
|
| - var sampleRate = 48000;
|
| -
|
| - // A really short time constant so that setTargetAtTime approaches the limiting value well
|
| - // before the end of the test.
|
| - var timeConstant = 0.001;
|
| -
|
| - // Find the time where setTargetAtTime is close enough to the limit. Since we're
|
| - // approaching 0, use a value of eps smaller than kSetTargetZeroThreshold (1e-20) in
|
| - // AudioParamTimeline.cpp. This is to account for round-off in the actual implementation
|
| - // (which uses a filter and not the formula.)
|
| - var limitThreshold = 1e-21;
|
| -
|
| - runTest({
|
| - sampleRate: sampleRate,
|
| - v0: 1,
|
| - v1: 0,
|
| - timeConstant: timeConstant,
|
| - eps: limitThreshold,
|
| - // Experimentally determined
|
| - threshold: 1.3e-7
|
| - }).then(done);
|
| - });
|
| -
|
| - function findLimitTime(v0, v1, timeConstant, eps) {
|
| - // Find the time at which the setTargetAtTime is close enough to the target value |v1| where
|
| - // we can consider the curve to have reached its limiting value.
|
| - //
|
| - // If v1 = 0, |eps| is the absolute error between the actual value and
|
| - // |v1|. Otherwise, |eps| is the relative error between the actual value and |v1|.
|
| - //
|
| - // The curve is
|
| - //
|
| - // v(t) = v1 - (v1 - v0) * exp(-t/timeConstant)
|
| - //
|
| - // If v1 = 0,
|
| - //
|
| - // v(t) = v0 * exp(-t/timeConstant)
|
| - //
|
| - // Solve this for when |v(t)| <= eps:
|
| - //
|
| - // t >= timeConstant * log(v0/eps)
|
| - //
|
| - // For v1 not zero, we want |v(t) - v1|/|v1| <= eps:
|
| - //
|
| - // t >= timeConstant * log(abs(v1-v0)/eps/v1)
|
| -
|
| - if (v1)
|
| - return timeConstant * Math.log(Math.abs(v1-v0)/eps/v1);
|
| - else
|
| - return timeConstant * Math.log(v0/eps);
|
| - }
|
| -
|
| - function runTest(options) {
|
| - var renderLength = 1;
|
| -
|
| - var context = new OfflineAudioContext(1, renderLength * sampleRate, options.sampleRate);
|
| -
|
| - // A constant source
|
| - var source = context.createBufferSource();
|
| - source.buffer = createConstantBuffer(context, 1, 1);
|
| - source.loop = true;
|
| -
|
| - var gain = context.createGain();
|
| - gain.gain.setValueAtTime(options.v0, 0);
|
| - gain.gain.setTargetAtTime(options.v1, 0, options.timeConstant);
|
| -
|
| - source.connect(gain);
|
| - gain.connect(context.destination);
|
| -
|
| - source.start();
|
| -
|
| - return context.startRendering().then(function (resultBuffer) {
|
| - var actual = resultBuffer.getChannelData(0);
|
| - var expected = createExponentialApproachArray(0, renderLength,
|
| - options.v0, options.v1,
|
| - options.sampleRate, options.timeConstant);
|
| -
|
| - var message = "setTargetAtTime(" + options.v1 + ", 0, " + options.timeConstant + ")";
|
| -
|
| - // Determine where the tail of the curve begins. (Where the curve has basically reached
|
| - // the limit value.)
|
| - var tailTime = findLimitTime(options.v0, options.v1, options.timeConstant, options.eps);
|
| - var tailFrame = Math.ceil(tailTime * options.sampleRate);
|
| -
|
| - var success = true;
|
| - success = Should("Initial output of " + tailFrame + " samples for " + message,
|
| - actual.slice(0, tailFrame), { numberOfArrayLog: 8 })
|
| - .beCloseToArray(expected.slice(0, tailFrame), options.threshold) && success;
|
| -
|
| - success = Should("Tail output for " + message,
|
| - actual.slice(tailFrame))
|
| - .containValues([options.v1]) && success;
|
| -
|
| - if (success)
|
| - testPassed(message + " had the expected values.\n");
|
| - else
|
| - testFailed(message + " did not have the expected values.\n");
|
| - });
|
| - }
|
| -
|
| - audit.defineTask("finish", function (done) {
|
| - finishJSTest();
|
| - done();
|
| - });
|
| -
|
| - audit.runTasks();
|
| - </script>
|
| - </body>
|
| -</html>
|
|
|