| Index: third_party/WebKit/LayoutTests/webaudio/AudioBufferSource/audiobuffersource-playbackrate.html
|
| diff --git a/third_party/WebKit/LayoutTests/webaudio/AudioBufferSource/audiobuffersource-playbackrate.html b/third_party/WebKit/LayoutTests/webaudio/AudioBufferSource/audiobuffersource-playbackrate.html
|
| index d1b1aabdd737571ea067736e12c648a744fb4d53..a0084ae310b98631a0cfaea7a0774ecdec50c149 100644
|
| --- a/third_party/WebKit/LayoutTests/webaudio/AudioBufferSource/audiobuffersource-playbackrate.html
|
| +++ b/third_party/WebKit/LayoutTests/webaudio/AudioBufferSource/audiobuffersource-playbackrate.html
|
| @@ -1,136 +1,128 @@
|
| <!DOCTYPE html>
|
| <html>
|
| -<head>
|
| - <title>AudioBufferSourceNode - playbackRate test</title>
|
| - <script src="../../resources/testharness.js"></script>
|
| - <script src="../../resources/testharnessreport.js"></script>
|
| - <script src="../resources/audit-util.js"></script>
|
| - <script src="../resources/audit.js"></script>
|
| -</head>
|
| -<body>
|
| - <script>
|
| - let audit = Audit.createTaskRunner();
|
| -
|
| - // Any sample rate mutiple of 128 is valid for this test, but here it uses
|
| - // 48000Hz because it is a commonly used number that happens to be multiple
|
| - // of 128.
|
| - let sampleRate = 48000;
|
| -
|
| - // The test iterates over 60 pitches starting from 36. (MIDI pitch of C2)
|
| - let fundamentalPitch = 36;
|
| - let numberOfPitches = 60;
|
| -
|
| - let noteDuration = 0.025;
|
| - let totalDuration = noteDuration * numberOfPitches;
|
| -
|
| - // Test constraints for each octave.
|
| - let testConstraints = [{
|
| - thresholdSNR: 103.8508,
|
| - thresholdDiffULP: 0.3028
|
| - }, {
|
| - thresholdSNR: 103.8657,
|
| - thresholdDiffULP: 0.3029
|
| - }, {
|
| - thresholdSNR: 103.8141,
|
| - thresholdDiffULP: 0.3047
|
| - }, {
|
| - thresholdSNR: 103.6818,
|
| - thresholdDiffULP: 0.3262
|
| - }, {
|
| - thresholdSNR: 103.1514,
|
| - thresholdDiffULP: 0.3946
|
| - }];
|
| -
|
| - function pitchToFrequency(midiPitch) {
|
| - return 440 * Math.pow(2, (Math.floor(midiPitch) - 69) / 12);
|
| - }
|
| -
|
| - function pitchDiffToPlaybackRate(midiPitchDiff) {
|
| - return Math.pow(2, midiPitchDiff / 12);
|
| - }
|
| -
|
| - function createSineWaveBuffer(context, frequency, duration) {
|
| - let buffer = context.createBuffer(1, duration * sampleRate, sampleRate);
|
| - let data = buffer.getChannelData(0);
|
| - let omega = 2 * Math.PI * frequency / sampleRate;
|
| - for (let i = 0; i < data.length; i++)
|
| - data[i] = Math.sin(omega * i);
|
| -
|
| - return buffer;
|
| - }
|
| -
|
| - // This is the fundamental buffer for playbackRate modulation. The duration
|
| - // of this buffer is arbitrary but long enough to produce the sound without
|
| - // running short.
|
| - let fundamentalBuffer;
|
| -
|
| - // A unit test consists of 2 sources: the 'actual' source runs a buffer with
|
| - // the playback rate modulated and the 'expected' source runs a
|
| - // mathmatically generated sound buffer.
|
| - function runUnitTest(context, noteStart, notePitch) {
|
| - let actualSrc = context.createBufferSource();
|
| - let expectedSrc = context.createBufferSource();
|
| - let merger = context.createChannelMerger(2);
|
| -
|
| - actualSrc.buffer = fundamentalBuffer;
|
| - expectedSrc.buffer = createSineWaveBuffer(context,
|
| - pitchToFrequency(notePitch), noteDuration);
|
| - actualSrc.playbackRate.value =
|
| - pitchDiffToPlaybackRate(notePitch - fundamentalPitch);
|
| -
|
| - actualSrc.connect(merger, 0, 0);
|
| - expectedSrc.connect(merger, 0, 1);
|
| - merger.connect(context.destination);
|
| -
|
| - actualSrc.start(noteStart);
|
| - actualSrc.stop(noteStart + noteDuration);
|
| - expectedSrc.start(noteStart);
|
| - expectedSrc.stop(noteStart + noteDuration);
|
| - }
|
| -
|
| -
|
| - // Test if AudioBufferSourceNode.playbackRate can playback at different rates
|
| - // properly.
|
| - audit.define("playbackrate-test", (task, should) => {
|
| - let context = new OfflineAudioContext(2, totalDuration *
|
| - sampleRate,
|
| - sampleRate);
|
| - fundamentalBuffer = createSineWaveBuffer(context,
|
| - pitchToFrequency(fundamentalPitch), totalDuration);
|
| -
|
| - // Schedule tests up to 60 pitches above from the fundamental pitch.
|
| - for (let iteration = 0; iteration < numberOfPitches; iteration++)
|
| - runUnitTest(context, noteDuration * iteration, fundamentalPitch +
|
| - iteration);
|
| -
|
| - // Once the rendering is complete, split the buffer into 5 octaves. Then
|
| - // perform the SNR and the maximum difference ULP check for each octave
|
| - // with different constraints.
|
| - context.startRendering()
|
| - .then(function (renderedBuffer) {
|
| - let actual = renderedBuffer.getChannelData(0);
|
| - let expected = renderedBuffer.getChannelData(1);
|
| - let octaveLength = Math.floor(noteDuration * 12 * sampleRate);
|
| -
|
| - for (let i = 0; i < numberOfPitches / 12; i++) {
|
| - let start = i * octaveLength;
|
| - let end = (i + 1) * octaveLength;
|
| - let octaveActual = actual.subarray(start, end);
|
| - let octaveExpected = expected.subarray(start, end);
|
| -
|
| - compareBuffersWithConstraints(should, octaveActual, octaveExpected,
|
| - {
|
| - prefix: i,
|
| - thresholdSNR: testConstraints[i].thresholdSNR,
|
| - thresholdDiffULP: testConstraints[i].thresholdDiffULP
|
| - });
|
| - }
|
| -
|
| - })
|
| - .then(() => task.done());
|
| - });
|
| -
|
| - audit.run();
|
| - </script>
|
| -</body>
|
| + <head>
|
| + <title>
|
| + AudioBufferSourceNode - playbackRate test
|
| + </title>
|
| + <script src="../../resources/testharness.js"></script>
|
| + <script src="../../resources/testharnessreport.js"></script>
|
| + <script src="../resources/audit-util.js"></script>
|
| + <script src="../resources/audit.js"></script>
|
| + </head>
|
| + <body>
|
| + <script id="layout-test-code">
|
| + let audit = Audit.createTaskRunner();
|
| +
|
| + // Any sample rate mutiple of 128 is valid for this test, but here it uses
|
| + // 48000Hz because it is a commonly used number that happens to be
|
| + // multiple of 128.
|
| + let sampleRate = 48000;
|
| +
|
| + // The test iterates over 60 pitches starting from 36. (MIDI pitch of C2)
|
| + let fundamentalPitch = 36;
|
| + let numberOfPitches = 60;
|
| +
|
| + let noteDuration = 0.025;
|
| + let totalDuration = noteDuration * numberOfPitches;
|
| +
|
| + // Test constraints for each octave.
|
| + let testConstraints = [
|
| + {thresholdSNR: 103.8508, thresholdDiffULP: 0.3028},
|
| + {thresholdSNR: 103.8657, thresholdDiffULP: 0.3029},
|
| + {thresholdSNR: 103.8141, thresholdDiffULP: 0.3047},
|
| + {thresholdSNR: 103.6818, thresholdDiffULP: 0.3262},
|
| + {thresholdSNR: 103.1514, thresholdDiffULP: 0.3946}
|
| + ];
|
| +
|
| + function pitchToFrequency(midiPitch) {
|
| + return 440 * Math.pow(2, (Math.floor(midiPitch) - 69) / 12);
|
| + }
|
| +
|
| + function pitchDiffToPlaybackRate(midiPitchDiff) {
|
| + return Math.pow(2, midiPitchDiff / 12);
|
| + }
|
| +
|
| + function createSineWaveBuffer(context, frequency, duration) {
|
| + let buffer = context.createBuffer(1, duration * sampleRate, sampleRate);
|
| + let data = buffer.getChannelData(0);
|
| + let omega = 2 * Math.PI * frequency / sampleRate;
|
| + for (let i = 0; i < data.length; i++)
|
| + data[i] = Math.sin(omega * i);
|
| +
|
| + return buffer;
|
| + }
|
| +
|
| + // This is the fundamental buffer for playbackRate modulation. The
|
| + // duration of this buffer is arbitrary but long enough to produce the
|
| + // sound without running short.
|
| + let fundamentalBuffer;
|
| +
|
| + // A unit test consists of 2 sources: the 'actual' source runs a buffer
|
| + // with the playback rate modulated and the 'expected' source runs a
|
| + // mathmatically generated sound buffer.
|
| + function runUnitTest(context, noteStart, notePitch) {
|
| + let actualSrc = context.createBufferSource();
|
| + let expectedSrc = context.createBufferSource();
|
| + let merger = context.createChannelMerger(2);
|
| +
|
| + actualSrc.buffer = fundamentalBuffer;
|
| + expectedSrc.buffer = createSineWaveBuffer(
|
| + context, pitchToFrequency(notePitch), noteDuration);
|
| + actualSrc.playbackRate.value =
|
| + pitchDiffToPlaybackRate(notePitch - fundamentalPitch);
|
| +
|
| + actualSrc.connect(merger, 0, 0);
|
| + expectedSrc.connect(merger, 0, 1);
|
| + merger.connect(context.destination);
|
| +
|
| + actualSrc.start(noteStart);
|
| + actualSrc.stop(noteStart + noteDuration);
|
| + expectedSrc.start(noteStart);
|
| + expectedSrc.stop(noteStart + noteDuration);
|
| + }
|
| +
|
| +
|
| + // Test if AudioBufferSourceNode.playbackRate can playback at different
|
| + // rates properly.
|
| + audit.define('playbackrate-test', (task, should) => {
|
| + let context =
|
| + new OfflineAudioContext(2, totalDuration * sampleRate, sampleRate);
|
| + fundamentalBuffer = createSineWaveBuffer(
|
| + context, pitchToFrequency(fundamentalPitch), totalDuration);
|
| +
|
| + // Schedule tests up to 60 pitches above from the fundamental pitch.
|
| + for (let iteration = 0; iteration < numberOfPitches; iteration++)
|
| + runUnitTest(
|
| + context, noteDuration * iteration, fundamentalPitch + iteration);
|
| +
|
| + // Once the rendering is complete, split the buffer into 5 octaves. Then
|
| + // perform the SNR and the maximum difference ULP check for each octave
|
| + // with different constraints.
|
| + context.startRendering()
|
| + .then(function(renderedBuffer) {
|
| + let actual = renderedBuffer.getChannelData(0);
|
| + let expected = renderedBuffer.getChannelData(1);
|
| + let octaveLength = Math.floor(noteDuration * 12 * sampleRate);
|
| +
|
| + for (let i = 0; i < numberOfPitches / 12; i++) {
|
| + let start = i * octaveLength;
|
| + let end = (i + 1) * octaveLength;
|
| + let octaveActual = actual.subarray(start, end);
|
| + let octaveExpected = expected.subarray(start, end);
|
| +
|
| + compareBuffersWithConstraints(
|
| + should, octaveActual, octaveExpected, {
|
| + prefix: i,
|
| + thresholdSNR: testConstraints[i].thresholdSNR,
|
| + thresholdDiffULP: testConstraints[i].thresholdDiffULP
|
| + });
|
| + }
|
| +
|
| + })
|
| + .then(() => task.done());
|
| + });
|
| +
|
| + audit.run();
|
| + </script>
|
| + </body>
|
| </html>
|
|
|