| Index: third_party/WebKit/LayoutTests/webaudio/resources/biquad-testing.js
|
| diff --git a/third_party/WebKit/LayoutTests/webaudio/resources/biquad-testing.js b/third_party/WebKit/LayoutTests/webaudio/resources/biquad-testing.js
|
| index 747d844e6e5b3a8b2605b44a5b0bd0e20a701858..5539903783acff51a8a1dda41310b068069067ee 100644
|
| --- a/third_party/WebKit/LayoutTests/webaudio/resources/biquad-testing.js
|
| +++ b/third_party/WebKit/LayoutTests/webaudio/resources/biquad-testing.js
|
| @@ -8,7 +8,7 @@ var renderedData;
|
| var sampleRate = 44100.0;
|
| var pulseLengthFrames = .1 * sampleRate;
|
|
|
| -// Maximum allowed error for the test to succeed. Experimentally determined.
|
| +// Maximum allowed error for the test to succeed. Experimentally determined.
|
| var maxAllowedError = 5.9e-8;
|
|
|
| // This must be large enough so that the filtered result is
|
| @@ -21,7 +21,7 @@ var maxFilters = 5;
|
|
|
| // How long to render. Must be long enough for all of the filters we
|
| // want to test.
|
| -var renderLengthSeconds = timeStep * (maxFilters + 1) ;
|
| +var renderLengthSeconds = timeStep * (maxFilters + 1);
|
|
|
| var renderLengthSamples = Math.round(renderLengthSeconds * sampleRate);
|
|
|
| @@ -29,140 +29,143 @@ var renderLengthSamples = Math.round(renderLengthSeconds * sampleRate);
|
| var nFilters;
|
|
|
| function createImpulseBuffer(context, length) {
|
| - var impulse = context.createBuffer(1, length, context.sampleRate);
|
| - var data = impulse.getChannelData(0);
|
| - for (var k = 1; k < data.length; ++k) {
|
| - data[k] = 0;
|
| - }
|
| - data[0] = 1;
|
| -
|
| - return impulse;
|
| + let impulse = context.createBuffer(1, length, context.sampleRate);
|
| + let data = impulse.getChannelData(0);
|
| + for (let k = 1; k < data.length; ++k) {
|
| + data[k] = 0;
|
| + }
|
| + data[0] = 1;
|
| +
|
| + return impulse;
|
| }
|
|
|
|
|
| function createTestAndRun(context, filterType, testParameters) {
|
| - // To test the filters, we apply a signal (an impulse) to each of
|
| - // the specified filters, with each signal starting at a different
|
| - // time. The output of the filters is summed together at the
|
| - // output. Thus for filter k, the signal input to the filter
|
| - // starts at time k * timeStep. For this to work well, timeStep
|
| - // must be large enough for the output of each filter to have
|
| - // decayed to zero with timeStep seconds. That way the filter
|
| - // outputs don't interfere with each other.
|
| -
|
| - var filterParameters = testParameters.filterParameters;
|
| - nFilters = Math.min(filterParameters.length, maxFilters);
|
| -
|
| - signal = new Array(nFilters);
|
| - filter = new Array(nFilters);
|
| -
|
| - impulse = createImpulseBuffer(context, pulseLengthFrames);
|
| -
|
| - // Create all of the signal sources and filters that we need.
|
| - for (var k = 0; k < nFilters; ++k) {
|
| - signal[k] = context.createBufferSource();
|
| - signal[k].buffer = impulse;
|
| -
|
| - filter[k] = context.createBiquadFilter();
|
| - filter[k].type = filterType;
|
| - filter[k].frequency.value = context.sampleRate / 2 * filterParameters[k].cutoff;
|
| - filter[k].detune.value = (filterParameters[k].detune === undefined) ? 0 : filterParameters[k].detune;
|
| - filter[k].Q.value = filterParameters[k].q;
|
| - filter[k].gain.value = filterParameters[k].gain;
|
| -
|
| - signal[k].connect(filter[k]);
|
| - filter[k].connect(context.destination);
|
| -
|
| - signal[k].start(timeStep * k);
|
| - }
|
| -
|
| - return context.startRendering()
|
| - .then(buffer => {
|
| - checkFilterResponse(buffer, filterType, testParameters);
|
| - });
|
| + // To test the filters, we apply a signal (an impulse) to each of
|
| + // the specified filters, with each signal starting at a different
|
| + // time. The output of the filters is summed together at the
|
| + // output. Thus for filter k, the signal input to the filter
|
| + // starts at time k * timeStep. For this to work well, timeStep
|
| + // must be large enough for the output of each filter to have
|
| + // decayed to zero with timeStep seconds. That way the filter
|
| + // outputs don't interfere with each other.
|
| +
|
| + let filterParameters = testParameters.filterParameters;
|
| + nFilters = Math.min(filterParameters.length, maxFilters);
|
| +
|
| + signal = new Array(nFilters);
|
| + filter = new Array(nFilters);
|
| +
|
| + impulse = createImpulseBuffer(context, pulseLengthFrames);
|
| +
|
| + // Create all of the signal sources and filters that we need.
|
| + for (let k = 0; k < nFilters; ++k) {
|
| + signal[k] = context.createBufferSource();
|
| + signal[k].buffer = impulse;
|
| +
|
| + filter[k] = context.createBiquadFilter();
|
| + filter[k].type = filterType;
|
| + filter[k].frequency.value =
|
| + context.sampleRate / 2 * filterParameters[k].cutoff;
|
| + filter[k].detune.value = (filterParameters[k].detune === undefined) ?
|
| + 0 :
|
| + filterParameters[k].detune;
|
| + filter[k].Q.value = filterParameters[k].q;
|
| + filter[k].gain.value = filterParameters[k].gain;
|
| +
|
| + signal[k].connect(filter[k]);
|
| + filter[k].connect(context.destination);
|
| +
|
| + signal[k].start(timeStep * k);
|
| + }
|
| +
|
| + return context.startRendering().then(buffer => {
|
| + checkFilterResponse(buffer, filterType, testParameters);
|
| + });
|
| }
|
|
|
| function addSignal(dest, src, destOffset) {
|
| - // Add src to dest at the given dest offset.
|
| - for (var k = destOffset, j = 0; k < dest.length, j < src.length; ++k, ++j) {
|
| - dest[k] += src[j];
|
| - }
|
| + // Add src to dest at the given dest offset.
|
| + for (let k = destOffset, j = 0; k < dest.length, j < src.length; ++k, ++j) {
|
| + dest[k] += src[j];
|
| + }
|
| }
|
|
|
| function generateReference(filterType, filterParameters) {
|
| - var result = new Array(renderLengthSamples);
|
| - var data = new Array(renderLengthSamples);
|
| - // Initialize the result array and data.
|
| - for (var k = 0; k < result.length; ++k) {
|
| - result[k] = 0;
|
| - data[k] = 0;
|
| - }
|
| - // Make data an impulse.
|
| - data[0] = 1;
|
| -
|
| - for (var k = 0; k < nFilters; ++k) {
|
| - // Filter an impulse
|
| - var detune = (filterParameters[k].detune === undefined) ? 0 : filterParameters[k].detune;
|
| - var frequency = filterParameters[k].cutoff * Math.pow(2, detune / 1200); // Apply detune, converting from Cents.
|
| -
|
| - var filterCoef = createFilter(filterType,
|
| - frequency,
|
| - filterParameters[k].q,
|
| - filterParameters[k].gain);
|
| - var y = filterData(filterCoef, data, renderLengthSamples);
|
| -
|
| - // Accumulate this filtered data into the final output at the desired offset.
|
| - addSignal(result, y, timeToSampleFrame(timeStep * k, sampleRate));
|
| - }
|
| -
|
| - return result;
|
| + let result = new Array(renderLengthSamples);
|
| + let data = new Array(renderLengthSamples);
|
| + // Initialize the result array and data.
|
| + for (let k = 0; k < result.length; ++k) {
|
| + result[k] = 0;
|
| + data[k] = 0;
|
| + }
|
| + // Make data an impulse.
|
| + data[0] = 1;
|
| +
|
| + for (let k = 0; k < nFilters; ++k) {
|
| + // Filter an impulse
|
| + let detune = (filterParameters[k].detune === undefined) ?
|
| + 0 :
|
| + filterParameters[k].detune;
|
| + let frequency = filterParameters[k].cutoff *
|
| + Math.pow(2, detune / 1200); // Apply detune, converting from Cents.
|
| +
|
| + let filterCoef = createFilter(
|
| + filterType, frequency, filterParameters[k].q, filterParameters[k].gain);
|
| + let y = filterData(filterCoef, data, renderLengthSamples);
|
| +
|
| + // Accumulate this filtered data into the final output at the desired
|
| + // offset.
|
| + addSignal(result, y, timeToSampleFrame(timeStep * k, sampleRate));
|
| + }
|
| +
|
| + return result;
|
| }
|
|
|
| function checkFilterResponse(renderedBuffer, filterType, testParameters) {
|
| - var filterParameters = testParameters.filterParameters;
|
| - var maxAllowedError = testParameters.threshold;
|
| - var should = testParameters.should;
|
| + let filterParameters = testParameters.filterParameters;
|
| + let maxAllowedError = testParameters.threshold;
|
| + let should = testParameters.should;
|
|
|
| - renderedData = renderedBuffer.getChannelData(0);
|
| + renderedData = renderedBuffer.getChannelData(0);
|
|
|
| - reference = generateReference(filterType, filterParameters);
|
| + reference = generateReference(filterType, filterParameters);
|
|
|
| - var len = Math.min(renderedData.length, reference.length);
|
| + let len = Math.min(renderedData.length, reference.length);
|
|
|
| - var success = true;
|
| + let success = true;
|
|
|
| - // Maximum error between rendered data and expected data
|
| - var maxError = 0;
|
| + // Maximum error between rendered data and expected data
|
| + let maxError = 0;
|
|
|
| - // Sample offset where the maximum error occurred.
|
| - var maxPosition = 0;
|
| + // Sample offset where the maximum error occurred.
|
| + let maxPosition = 0;
|
|
|
| - // Number of infinities or NaNs that occurred in the rendered data.
|
| - var invalidNumberCount = 0;
|
| + // Number of infinities or NaNs that occurred in the rendered data.
|
| + let invalidNumberCount = 0;
|
|
|
| - should(nFilters, "Number of filters tested")
|
| - .beEqualTo(filterParameters.length);
|
| + should(nFilters, 'Number of filters tested')
|
| + .beEqualTo(filterParameters.length);
|
|
|
| - // Compare the rendered signal with our reference, keeping
|
| - // track of the maximum difference (and the offset of the max
|
| - // difference.) Check for bad numbers in the rendered output
|
| - // too. There shouldn't be any.
|
| - for (var k = 0; k < len; ++k) {
|
| - var err = Math.abs(renderedData[k] - reference[k]);
|
| - if (err > maxError) {
|
| - maxError = err;
|
| - maxPosition = k;
|
| - }
|
| - if (!isValidNumber(renderedData[k])) {
|
| - ++invalidNumberCount;
|
| - }
|
| + // Compare the rendered signal with our reference, keeping
|
| + // track of the maximum difference (and the offset of the max
|
| + // difference.) Check for bad numbers in the rendered output
|
| + // too. There shouldn't be any.
|
| + for (let k = 0; k < len; ++k) {
|
| + let err = Math.abs(renderedData[k] - reference[k]);
|
| + if (err > maxError) {
|
| + maxError = err;
|
| + maxPosition = k;
|
| + }
|
| + if (!isValidNumber(renderedData[k])) {
|
| + ++invalidNumberCount;
|
| }
|
| + }
|
|
|
| - should(invalidNumberCount,
|
| - "Number of non-finite values in the rendered output")
|
| - .beEqualTo(0);
|
| + should(
|
| + invalidNumberCount, 'Number of non-finite values in the rendered output')
|
| + .beEqualTo(0);
|
|
|
| - should(maxError,
|
| - "Max error in " + filterTypeName[filterType] + " response")
|
| - .beLessThanOrEqualTo(maxAllowedError);
|
| + should(maxError, 'Max error in ' + filterTypeName[filterType] + ' response')
|
| + .beLessThanOrEqualTo(maxAllowedError);
|
| }
|
|
|