| Index: third_party/WebKit/LayoutTests/webaudio/audioparam-setValueCurveAtTime-interpolation.html
|
| diff --git a/third_party/WebKit/LayoutTests/webaudio/audioparam-setValueCurveAtTime-interpolation.html b/third_party/WebKit/LayoutTests/webaudio/audioparam-setValueCurveAtTime-interpolation.html
|
| deleted file mode 100644
|
| index ad3ca7073e099f0f88ab98512e4df74911f48924..0000000000000000000000000000000000000000
|
| --- a/third_party/WebKit/LayoutTests/webaudio/audioparam-setValueCurveAtTime-interpolation.html
|
| +++ /dev/null
|
| @@ -1,311 +0,0 @@
|
| -<!doctype html>
|
| -<html>
|
| - <head>
|
| - <title>Test Interpolation for AudioParam.setValueCurveAtTime</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>
|
| - <title>Test Interpolation for AudioParam.setValueCurveAtTime</title>
|
| - </head>
|
| -
|
| - <body>
|
| - <script>
|
| - description("Test Interpolation for AudioParam.setValueCurveAtTime");
|
| - window.jsTestIsAsync = true;
|
| -
|
| - // Play a constant signal through a gain node that is automated using setValueCurveAtTime with
|
| - // a 2-element curve. The output should be a linear change.
|
| -
|
| - // Choose a sample rate that is a multiple of 128, the rendering quantum size. This makes the
|
| - // math work out to be nice numbers.
|
| - var sampleRate = 25600;
|
| - var testDurationSec = 1;
|
| - var testDurationFrames = testDurationSec * sampleRate;
|
| -
|
| - // Where the curve starts and its duration. This MUST be less than the total rendering time.
|
| - var curveStartTime = 256 / sampleRate;
|
| - var curveDuration = 300 / sampleRate;;
|
| - var curveValue = 0.75;
|
| -
|
| - // At this time, the gain node goes to gain 1. This is used to make sure the value curve is
|
| - // propagated correctly until the next event.
|
| - var fullGainTime = 0.75;
|
| -
|
| - // Thresholds use to determine if the test passes; these are experimentally determined. The
|
| - // SNR between the actual and expected result should be at least |snrThreshold|. The maximum
|
| - // difference betwen them should not exceed |maxErrorThreshold|.
|
| - var snrThreshold = 10000;
|
| - var maxErrorThreshold = 0;
|
| -
|
| - var context;
|
| - var actualResult;
|
| - var expectedResult;
|
| -
|
| - var audit = Audit.createTaskRunner();
|
| -
|
| - // Array of test configs. Each config must specify curveStartTime, curveDuration,
|
| - // curveLength, fullGainTime, maxErrorThreshold, and snrThreshold.
|
| - var testConfigs = [{
|
| - // The main test
|
| - curveStartTime: 256 / sampleRate,
|
| - curveDuration: 300 / sampleRate,
|
| - curveLength: 2,
|
| - fullGainTime: 0.75,
|
| - maxErrorThreshold: 5.9605e-8,
|
| - snrThreshold: 171.206
|
| - }, {
|
| - // Increase the curve length
|
| - curveStartTime: 256 / sampleRate,
|
| - curveDuration: 300 / sampleRate,
|
| - curveLength: 3,
|
| - fullGainTime: 0.75,
|
| - maxErrorThreshold: 5.9605e-8,
|
| - snrThreshold: 171.206
|
| - }, {
|
| - // Increase the curve length
|
| - curveStartTime: 256 / sampleRate,
|
| - curveDuration: 300 / sampleRate,
|
| - curveLength: 16,
|
| - fullGainTime: 0.75,
|
| - maxErrorThreshold: 5.9605e-8,
|
| - snrThreshold: 170.892
|
| - }, {
|
| - // Increase the curve length
|
| - curveStartTime: 256 / sampleRate,
|
| - curveDuration: 300 / sampleRate,
|
| - curveLength: 100,
|
| - fullGainTime: 0.75,
|
| - maxErrorThreshold: 1.1921e-7,
|
| - snrThreshold: 168.712
|
| - }, {
|
| - // Corner case with duration less than a frame!
|
| - curveStartTime: 256 / sampleRate,
|
| - curveDuration: 0.25 / sampleRate,
|
| - curveLength: 2,
|
| - fullGainTime: 0.75,
|
| - maxErrorThreshold: 0,
|
| - snrThreshold: 10000
|
| - }, {
|
| - // Short duration test
|
| - curveStartTime: 256 / sampleRate,
|
| - curveDuration: 2 / sampleRate,
|
| - curveLength: 2,
|
| - fullGainTime: 0.75,
|
| - maxErrorThreshold: 0,
|
| - snrThreshold: 10000
|
| - }, {
|
| - // Short duration test with many points.
|
| - curveStartTime: 256 / sampleRate,
|
| - curveDuration: 2 / sampleRate,
|
| - curveLength: 8,
|
| - fullGainTime: 0.75,
|
| - maxErrorThreshold: 0,
|
| - snrThreshold: 10000
|
| - }, {
|
| - // Long duration, big curve
|
| - curveStartTime: 256 / sampleRate,
|
| - curveDuration: .5,
|
| - curveLength: 1000,
|
| - fullGainTime: 0.75,
|
| - maxErrorThreshold: 5.9605e-8,
|
| - snrThreshold: 152.784
|
| - }];
|
| -
|
| - // Creates a function based on the test config that is suitable for use by defineTask().
|
| - function createTaskFunction(config) {
|
| - return function (done) {
|
| - runTest(config).then(done);
|
| - };
|
| - }
|
| -
|
| - // Define a task for each config, in the order listed in testConfigs.
|
| - for (var k = 0; k < testConfigs.length; ++k) {
|
| - var config = testConfigs[k];
|
| - var name = k + ":curve=" + config.curveLength + ",duration=" + (config.curveDuration * sampleRate);
|
| - audit.defineTask(name, createTaskFunction(config));
|
| - }
|
| -
|
| - // Simple test from crbug.com/441471. Makes sure the end points and the middle point are
|
| - // interpolated correctly.
|
| - audit.defineTask("crbug-441471", function (done) {
|
| - // Any sample rate should work; we pick something small such that the time end points are on
|
| - // a sampling point.
|
| - var context = new OfflineAudioContext(1, 5000, 5000)
|
| -
|
| - // A constant source
|
| - var source = context.createBufferSource();
|
| - source.buffer = createConstantBuffer(context, 1, 1);
|
| - source.loop = true;
|
| -
|
| - var gain = context.createGain();
|
| -
|
| - var startTime = 0.7;
|
| - var duration = 0.2;
|
| -
|
| - // Create the curve. The interpolated result should be just a straight line from -1 to 1
|
| - // from time startTime to startTime + duration.
|
| -
|
| - var c = new Float32Array(3);
|
| - c[0] = -1;
|
| - c[1] = 0;
|
| - c[2] = 1;
|
| - gain.gain.setValueCurveAtTime(c, startTime, duration);
|
| - source.connect(gain);
|
| - gain.connect(context.destination);
|
| - source.start();
|
| -
|
| - context.startRendering().then(function (renderedBuffer) {
|
| - var data = renderedBuffer.getChannelData(0);
|
| - var endTime = startTime + duration;
|
| - var midPoint = (startTime + endTime) / 2;
|
| - var success = true;
|
| -
|
| - success = Should("Curve value at time " + startTime,
|
| - data[timeToSampleFrame(startTime, context.sampleRate)]).beEqualTo(c[0]) && success;
|
| - // Due to round-off, the value at the midpoint is not exactly zero on arm64. See
|
| - // crbug.com/558563. The current value is experimentally determined.
|
| - success = Should("Curve value at time " + midPoint,
|
| - data[timeToSampleFrame(midPoint, context.sampleRate)]).beCloseTo(0, Math.pow(2, -51)) && success;
|
| - success = Should("Curve value at time " + endTime,
|
| - data[timeToSampleFrame(endTime, context.sampleRate)]).beEqualTo(c[2]) && success;
|
| - if (success)
|
| - testPassed("Test: crbug.com/44471\n");
|
| - else
|
| - testFailed("Test: crbug.com/44471\n");
|
| - }).then(done);
|
| - });
|
| -
|
| - // Must be the last defined task.
|
| - audit.defineTask("end", function (done) {
|
| - finishJSTest();
|
| - done();
|
| - });
|
| -
|
| - function runTest(config) {
|
| - context = new OfflineAudioContext(1, testDurationFrames, sampleRate);
|
| -
|
| - // A constant audio source of value 1.
|
| - var source = context.createBufferSource();
|
| - source.buffer = createConstantBuffer(context, 1, 1);
|
| - source.loop = true;
|
| -
|
| - // The value curve for testing. Just to make things easy for testing, make the curve a
|
| - // simple ramp up to curveValue.
|
| - // TODO(rtoy): Maybe allow more complicated curves?
|
| - var curve = new Float32Array(config.curveLength);
|
| - for (var k = 0; k < config.curveLength; ++k) {
|
| - curve[k] = curveValue / (config.curveLength - 1) * k;
|
| - }
|
| -
|
| - // A gain node that is to be automated using setValueCurveAtTime.
|
| - var gain = context.createGain();
|
| - gain.gain.value = 0;
|
| - gain.gain.setValueCurveAtTime(curve, config.curveStartTime, config.curveDuration);
|
| - // This is to verify that setValueCurveAtTime ends appropriately.
|
| - gain.gain.setValueAtTime(1, config.fullGainTime);
|
| -
|
| - source.connect(gain);
|
| - gain.connect(context.destination);
|
| - source.start();
|
| -
|
| - // Some consistency checks on the test parameters
|
| - Should("Check: Curve end time", config.curveStartTime + config.curveDuration, {
|
| - brief: true
|
| - })
|
| - .beLessThanOrEqualTo(testDurationSec);
|
| - Should("Check: Full gain start time", config.fullGainTime, {
|
| - brief: true
|
| - }).beLessThanOrEqualTo(testDurationSec);
|
| - Should("Check: Full gain start time", config.fullGainTime, {
|
| - brief: true
|
| - }).beGreaterThanOrEqualTo(config.curveStartTime + config.curveDuration);
|
| -
|
| - // Rock and roll!
|
| - return context.startRendering().then(checkResult(config));
|
| - }
|
| -
|
| - // Return a function to check that the rendered result matches the expected result.
|
| - function checkResult(config) {
|
| - return function (renderedBuffer) {
|
| - var success = true;
|
| -
|
| - actualResult = renderedBuffer.getChannelData(0);
|
| - expectedResult = computeExpectedResult(config);
|
| -
|
| - // Compute the SNR and max absolute difference between the actual and expected result.
|
| - var SNR = 10*Math.log10(computeSNR(actualResult, expectedResult));
|
| - var maxDiff = -1;
|
| - var posn = -1;
|
| -
|
| - for (var k = 0; k < actualResult.length; ++k) {
|
| - var diff = Math.abs(actualResult[k] - expectedResult[k]);
|
| - if (maxDiff < diff) {
|
| - maxDiff = diff;
|
| - posn = k;
|
| - }
|
| - }
|
| -
|
| - success = success && Should("SNR", SNR, {
|
| - brief: true
|
| - }).beGreaterThanOrEqualTo(config.snrThreshold);
|
| -
|
| - if (maxDiff <= config.maxErrorThreshold) {
|
| - testPassed("Max difference is less than or equal to " + config.maxErrorThreshold + ".");
|
| - } else {
|
| - testFailed("Max difference (" + maxDiff + ") NOT less than or equal to " +
|
| - config.maxErrorThreshold + " at frame " + posn + ".");
|
| - success = false;
|
| - }
|
| -
|
| - var message = "Test: curve length = " + config.curveLength + "; duration frames = " +
|
| - config.curveDuration * sampleRate + ".\n";
|
| -
|
| - if (success)
|
| - testPassed(message);
|
| - else
|
| - testFailed(message);
|
| - }
|
| - }
|
| -
|
| - // Compute the expected result based on the config settings.
|
| - function computeExpectedResult(config) {
|
| - // The automation curve starts at |curveStartTime| and has duration |curveDuration|. So,
|
| - // the output should be zero until curveStartTime, linearly ramp up from there to
|
| - // |curveValue|, and then be constant 1 from then to the end of the buffer.
|
| -
|
| - var expected = new Float32Array(testDurationFrames);
|
| -
|
| - var curveStartFrame = config.curveStartTime * sampleRate;
|
| - var curveEndFrame = (config.curveStartTime + config.curveDuration) * sampleRate;
|
| - var fullGainFrame = config.fullGainTime * sampleRate;
|
| -
|
| - var k;
|
| -
|
| - // Zero out the start.
|
| - for (k = 0; k < curveStartFrame; ++k)
|
| - expected[k] = 0;
|
| -
|
| - // Linearly ramp now. This assumes that the actual curve used is a linear ramp, even if
|
| - // there are many curve points.
|
| - var stepSize = curveValue / (config.curveDuration * sampleRate);
|
| - for (; k < curveEndFrame; ++k)
|
| - expected[k] = stepSize * (k - curveStartFrame);
|
| -
|
| - // Hold it constant until the next event
|
| - for (; k < fullGainFrame; ++k)
|
| - expected[k] = curveValue;
|
| -
|
| - // Amplitude is one for the rest of the test.
|
| - for (; k < testDurationFrames; ++k)
|
| - expected[k] = 1;
|
| -
|
| - return expected;
|
| - }
|
| -
|
| - audit.runTasks();
|
| -
|
| - successfullyParsed = true;
|
| - </script>
|
| - </body>
|
| -</html>
|
|
|