Index: third_party/WebKit/LayoutTests/webaudio/AudioBufferSource/audiobuffersource-loop-comprehensive.html |
diff --git a/third_party/WebKit/LayoutTests/webaudio/AudioBufferSource/audiobuffersource-loop-comprehensive.html b/third_party/WebKit/LayoutTests/webaudio/AudioBufferSource/audiobuffersource-loop-comprehensive.html |
index 8bd161a5942012f087d44950aa400332bff67147..ab332e751ce00f6ab21b388f9fe244cd641345fe 100644 |
--- a/third_party/WebKit/LayoutTests/webaudio/AudioBufferSource/audiobuffersource-loop-comprehensive.html |
+++ b/third_party/WebKit/LayoutTests/webaudio/AudioBufferSource/audiobuffersource-loop-comprehensive.html |
@@ -1,240 +1,305 @@ |
<!DOCTYPE html> |
- |
<html> |
-<head> |
-<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> |
-<script src="../resources/audiobuffersource-testing.js"></script> |
-</head> |
- |
-<body> |
-<script> |
-let audit = Audit.createTaskRunner(); |
- |
-// The following test cases assume an AudioBuffer of length 8 whose PCM data is a linear ramp, 0, 1, 2, 3,... |
-// |description| is optional and will be computed from the other parameters. |offsetFrame| is |
-// optional and defaults to 0. |
- |
-let tests = [ |
- |
-{ description: "loop whole buffer by default with loopStart == loopEnd == 0", |
- loopStartFrame: 0, |
- loopEndFrame: 0, |
- renderFrames: 16, |
- playbackRate: 1, |
- expected: [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] }, |
- |
-{ description: "loop whole buffer explicitly", |
- loopStartFrame: 0, |
- loopEndFrame: 8, |
- renderFrames: 16, |
- playbackRate: 1, |
- expected: [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] }, |
- |
-{ description: "loop from middle to end of buffer", |
- loopStartFrame: 4, |
- loopEndFrame: 8, |
- renderFrames: 16, |
- playbackRate: 1, |
- expected: [0,1,2,3,4,5,6,7,4,5,6,7,4,5,6,7] }, |
- |
-{ description: "loop from start to middle of buffer", |
- loopStartFrame: 0, |
- loopEndFrame: 4, |
- renderFrames: 16, |
- playbackRate: 1, |
- expected: [0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] }, |
- |
-{ loopStartFrame: 4, |
- loopEndFrame: 6, |
- renderFrames: 16, |
- playbackRate: 1, |
- expected: [0,1,2,3,4,5,4,5,4,5,4,5,4,5,4,5] }, |
- |
-{ loopStartFrame: 3, |
- loopEndFrame: 7, |
- renderFrames: 16, |
- playbackRate: 1, |
- expected: [0,1,2,3,4,5,6,3,4,5,6,3,4,5,6,3] }, |
- |
-{ loopStartFrame: 4, |
- loopEndFrame: 6, |
- renderFrames: 16, |
- playbackRate: 0.5, |
- expected: [0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 4, 4.5, 5, 5.5] }, |
- |
-{ loopStartFrame: 4, |
- loopEndFrame: 6, |
- renderFrames: 16, |
- playbackRate: 1.5, |
- expected: [0, 1.5, 3, 4.5, 4, 5.5, 5, 4.5, 4, 5.5, 5, 4.5, 4, 5.5, 5, 4.5] }, |
- |
-// Offset past loop end, so playback starts at loop start |
-{ loopStartFrame: 2, |
- loopEndFrame: 5, |
- renderFrames: 16, |
- playbackRate: 1, |
- offsetFrame: 6, |
- expected: [2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2] }, |
- |
-// Offset before loop start, so start at offset and continue |
-{ loopStartFrame: 3, |
- loopEndFrame: 6, |
- renderFrames: 16, |
- playbackRate: 1, |
- offsetFrame: 1, |
- expected: [1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4] }, |
- |
-// Offset between loop start and loop end, so start at offset and continue |
-{ loopStartFrame: 3, |
- loopEndFrame: 6, |
- renderFrames: 16, |
- playbackRate: 1, |
- offsetFrame: 4, |
- expected: [4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4] }, |
- |
-{ description: "illegal playbackRate of 47 greater than loop length", |
- loopStartFrame: 4, |
- loopEndFrame: 6, |
- renderFrames: 16, |
- playbackRate: 47, |
- expected: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] }, |
- |
-// Try illegal loop-points - they should be ignored and we'll loop the whole buffer. |
- |
-{ description: "illegal loop: loopStartFrame > loopEndFrame", |
- loopStartFrame: 7, |
- loopEndFrame: 3, |
- renderFrames: 16, |
- playbackRate: 1, |
- expected: [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] }, |
- |
-{ description: "illegal loop: loopStartFrame == loopEndFrame", |
- loopStartFrame: 3, |
- loopEndFrame: 3, |
- renderFrames: 16, |
- playbackRate: 1, |
- expected: [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] }, |
- |
-{ description: "illegal loop: loopStartFrame < 0", |
- loopStartFrame: -8, |
- loopEndFrame: 3, |
- renderFrames: 16, |
- playbackRate: 1, |
- expected: [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] }, |
- |
-{ description: "illegal loop: loopEndFrame > bufferLength", |
- loopStartFrame: 0, |
- loopEndFrame: 30000, |
- renderFrames: 16, |
- playbackRate: 1, |
- expected: [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] }, |
- |
-// Start a loop with a duration longer than the buffer. The output should be the data from frame 1 |
-// to 6, and then looping from 3 to 5 until 20 frames have been played. |
-{ description: "loop from 3 -> 6 with offset 1 for 20 frames", |
- loopStartFrame: 3, |
- loopEndFrame: 6, |
- playbackRate: 1, |
- offsetFrame: 1, |
- renderFrames: 30, |
- durationFrames: 20, |
- expected: [1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, |
- |
-// Start a loop with a duration less than the length of the looping frames. The output should be |
-// the data from frame 1 to 3, and then stopping because duration = 3 |
-{ description: "loop from 3 -> 8 with offset 1 for 3 frames", |
- loopStartFrame: 3, |
- loopEndFrame: 8, |
- playbackRate: 1, |
- offsetFrame: 1, |
- durationFrames: 3, |
- renderFrames: 30, |
- expected: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }, |
- |
-// Start a loop with a duration less than the length of the looping frames. The output should be |
-// the data from frame 1 to 3, and then stopping because duration = 3 |
-{ description: "loop from 3 -> 8 with offset 7 for 3 frames", |
- loopStartFrame: 3, |
- loopEndFrame: 8, |
- playbackRate: 1, |
- offsetFrame: 7, |
- durationFrames: 3, |
- renderFrames: 30, |
- expected: [7, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] } |
- |
-]; |
- |
-let sampleRate = 44100; |
-let buffer; |
-let bufferFrameLength = 8; |
-let testSpacingFrames = 32; |
-let testSpacingSeconds = testSpacingFrames / sampleRate; |
-let totalRenderLengthFrames = tests.length * testSpacingFrames; |
- |
-function runLoopTest(context, testNumber, test, should) { |
- let source = context.createBufferSource(); |
- |
- source.buffer = buffer; |
- source.playbackRate.value = test.playbackRate; |
- source.loop = true; |
- source.loopStart = test.loopStartFrame / context.sampleRate; |
- source.loopEnd = test.loopEndFrame / context.sampleRate; |
- |
- let offset = test.offsetFrame ? test.offsetFrame / context.sampleRate : 0; |
- |
- source.connect(context.destination); |
- |
- // Render each test one after the other, spaced apart by testSpacingSeconds. |
- let startTime = testNumber * testSpacingSeconds; |
- |
- // If durationFrames is given, run the test for the specified duration. |
- if (test.durationFrames) { |
- if (!test.renderFrames) { |
- throw("renderFrames is required for test " + testNumber + ": " + test.description); |
- } else { |
- if (test.durationFrames > testSpacingFrames || test.durationFrames < 0) { |
- throw("Test " + testNumber |
- + ": durationFrames (" + test.durationFrames + ") outside the range [0, " |
- + testSpacingFrames + "]"); |
- } |
- source.start(startTime, offset, test.durationFrames / context.sampleRate); |
+ <head> |
+ <title> |
+ audiobuffersource-loop-comprehensive.html |
+ </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> |
+ <script src="../resources/audiobuffersource-testing.js"></script> |
+ </head> |
+ <body> |
+ <script id="layout-test-code"> |
+ let audit = Audit.createTaskRunner(); |
+ |
+ // The following test cases assume an AudioBuffer of length 8 whose PCM |
+ // data is a linear ramp, 0, 1, 2, 3,... |description| is optional and |
+ // will be computed from the other parameters. |offsetFrame| is optional |
+ // and defaults to 0. |
+ |
+ let tests = [ |
+ |
+ { |
+ description: |
+ 'loop whole buffer by default with loopStart == loopEnd == 0', |
+ loopStartFrame: 0, |
+ loopEndFrame: 0, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ expected: [0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7] |
+ }, |
+ |
+ { |
+ description: 'loop whole buffer explicitly', |
+ loopStartFrame: 0, |
+ loopEndFrame: 8, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ expected: [0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7] |
+ }, |
+ |
+ { |
+ description: 'loop from middle to end of buffer', |
+ loopStartFrame: 4, |
+ loopEndFrame: 8, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ expected: [0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7] |
+ }, |
+ |
+ { |
+ description: 'loop from start to middle of buffer', |
+ loopStartFrame: 0, |
+ loopEndFrame: 4, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ expected: [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3] |
+ }, |
+ |
+ { |
+ loopStartFrame: 4, |
+ loopEndFrame: 6, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ expected: [0, 1, 2, 3, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5] |
+ }, |
+ |
+ { |
+ loopStartFrame: 3, |
+ loopEndFrame: 7, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ expected: [0, 1, 2, 3, 4, 5, 6, 3, 4, 5, 6, 3, 4, 5, 6, 3] |
+ }, |
+ |
+ { |
+ loopStartFrame: 4, |
+ loopEndFrame: 6, |
+ renderFrames: 16, |
+ playbackRate: 0.5, |
+ expected: |
+ [0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 4, 4.5, 5, 5.5] |
+ }, |
+ |
+ { |
+ loopStartFrame: 4, |
+ loopEndFrame: 6, |
+ renderFrames: 16, |
+ playbackRate: 1.5, |
+ expected: |
+ [0, 1.5, 3, 4.5, 4, 5.5, 5, 4.5, 4, 5.5, 5, 4.5, 4, 5.5, 5, 4.5] |
+ }, |
+ |
+ // Offset past loop end, so playback starts at loop start |
+ { |
+ loopStartFrame: 2, |
+ loopEndFrame: 5, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ offsetFrame: 6, |
+ expected: [2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2] |
+ }, |
+ |
+ // Offset before loop start, so start at offset and continue |
+ { |
+ loopStartFrame: 3, |
+ loopEndFrame: 6, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ offsetFrame: 1, |
+ expected: [1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4] |
+ }, |
+ |
+ // Offset between loop start and loop end, so start at offset and |
+ // continue |
+ { |
+ loopStartFrame: 3, |
+ loopEndFrame: 6, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ offsetFrame: 4, |
+ expected: [4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4] |
+ }, |
+ |
+ { |
+ description: 'illegal playbackRate of 47 greater than loop length', |
+ loopStartFrame: 4, |
+ loopEndFrame: 6, |
+ renderFrames: 16, |
+ playbackRate: 47, |
+ expected: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] |
+ }, |
+ |
+ // Try illegal loop-points - they should be ignored and we'll loop the |
+ // whole buffer. |
+ |
+ { |
+ description: 'illegal loop: loopStartFrame > loopEndFrame', |
+ loopStartFrame: 7, |
+ loopEndFrame: 3, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ expected: [0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7] |
+ }, |
+ |
+ { |
+ description: 'illegal loop: loopStartFrame == loopEndFrame', |
+ loopStartFrame: 3, |
+ loopEndFrame: 3, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ expected: [0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7] |
+ }, |
+ |
+ { |
+ description: 'illegal loop: loopStartFrame < 0', |
+ loopStartFrame: -8, |
+ loopEndFrame: 3, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ expected: [0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7] |
+ }, |
+ |
+ { |
+ description: 'illegal loop: loopEndFrame > bufferLength', |
+ loopStartFrame: 0, |
+ loopEndFrame: 30000, |
+ renderFrames: 16, |
+ playbackRate: 1, |
+ expected: [0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7] |
+ }, |
+ |
+ // Start a loop with a duration longer than the buffer. The output |
+ // should be the data from frame 1 to 6, and then looping from 3 to 5 |
+ // until 20 frames have been played. |
+ { |
+ description: 'loop from 3 -> 6 with offset 1 for 20 frames', |
+ loopStartFrame: 3, |
+ loopEndFrame: 6, |
+ playbackRate: 1, |
+ offsetFrame: 1, |
+ renderFrames: 30, |
+ durationFrames: 20, |
+ expected: [ |
+ 1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, |
+ 4, 5, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
+ ] |
+ }, |
+ |
+ // Start a loop with a duration less than the length of the looping |
+ // frames. The output should be the data from frame 1 to 3, and then |
+ // stopping because duration = 3 |
+ { |
+ description: 'loop from 3 -> 8 with offset 1 for 3 frames', |
+ loopStartFrame: 3, |
+ loopEndFrame: 8, |
+ playbackRate: 1, |
+ offsetFrame: 1, |
+ durationFrames: 3, |
+ renderFrames: 30, |
+ expected: [ |
+ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
+ ] |
+ }, |
+ |
+ // Start a loop with a duration less than the length of the looping |
+ // frames. The output should be the data from frame 1 to 3, and then |
+ // stopping because duration = 3 |
+ { |
+ description: 'loop from 3 -> 8 with offset 7 for 3 frames', |
+ loopStartFrame: 3, |
+ loopEndFrame: 8, |
+ playbackRate: 1, |
+ offsetFrame: 7, |
+ durationFrames: 3, |
+ renderFrames: 30, |
+ expected: [ |
+ 7, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
+ ] |
} |
- } else if (test.renderFrames) { |
- let duration = test.renderFrames / context.sampleRate; |
- if (test.renderFrames > testSpacingFrames || test.renderFrames < 0) { |
- throw("Test " + testNumber |
- + ": renderFrames (" + test.renderFrames + ") outside the range [0, " |
- + testSpacingFrames + "]"); |
+ |
+ ]; |
+ |
+ let sampleRate = 44100; |
+ let buffer; |
+ let bufferFrameLength = 8; |
+ let testSpacingFrames = 32; |
+ let testSpacingSeconds = testSpacingFrames / sampleRate; |
+ let totalRenderLengthFrames = tests.length * testSpacingFrames; |
+ |
+ function runLoopTest(context, testNumber, test, should) { |
+ let source = context.createBufferSource(); |
+ |
+ source.buffer = buffer; |
+ source.playbackRate.value = test.playbackRate; |
+ source.loop = true; |
+ source.loopStart = test.loopStartFrame / context.sampleRate; |
+ source.loopEnd = test.loopEndFrame / context.sampleRate; |
+ |
+ let offset = |
+ test.offsetFrame ? test.offsetFrame / context.sampleRate : 0; |
+ |
+ source.connect(context.destination); |
+ |
+ // Render each test one after the other, spaced apart by |
+ // testSpacingSeconds. |
+ let startTime = testNumber * testSpacingSeconds; |
+ |
+ // If durationFrames is given, run the test for the specified duration. |
+ if (test.durationFrames) { |
+ if (!test.renderFrames) { |
+ throw( |
+ 'renderFrames is required for test ' + testNumber + ': ' + |
+ test.description); |
+ } else { |
+ if (test.durationFrames > testSpacingFrames || |
+ test.durationFrames < 0) { |
+ throw( |
+ 'Test ' + testNumber + ': durationFrames (' + |
+ test.durationFrames + ') outside the range [0, ' + |
+ testSpacingFrames + ']'); |
+ } |
+ source.start( |
+ startTime, offset, test.durationFrames / context.sampleRate); |
+ } |
+ } else if (test.renderFrames) { |
+ let duration = test.renderFrames / context.sampleRate; |
+ if (test.renderFrames > testSpacingFrames || test.renderFrames < 0) { |
+ throw( |
+ 'Test ' + testNumber + ': renderFrames (' + test.renderFrames + |
+ ') outside the range [0, ' + testSpacingFrames + ']'); |
+ } |
+ source.start(startTime, offset); |
+ source.stop(startTime + duration); |
+ } else { |
+ throw( |
+ 'Test ' + testNumber + |
+ ' must specify renderFrames and possibly durationFrames'); |
} |
- source.start(startTime, offset); |
- source.stop(startTime + duration); |
- } else { |
- throw("Test " + testNumber + " must specify renderFrames and possibly durationFrames"); |
- } |
-} |
- |
-audit.define("AudioBufferSource looping test", function (task, should) { |
- // Create offline audio context. |
- let context = new OfflineAudioContext(1, totalRenderLengthFrames, sampleRate); |
- buffer = createTestBuffer(context, bufferFrameLength); |
- |
- should(function () { |
- for (let i = 0; i < tests.length; ++i) |
- runLoopTest(context, i, tests[i], should); |
- }, "Generate " + tests.length + " test cases").notThrow(); |
- |
- context.startRendering() |
- .then(function (audioBuffer) { |
- checkAllTests(audioBuffer, should); |
- task.done(); |
- }); |
-}); |
+ } |
+ |
+ audit.define('AudioBufferSource looping test', function(task, should) { |
+ // Create offline audio context. |
+ let context = |
+ new OfflineAudioContext(1, totalRenderLengthFrames, sampleRate); |
+ buffer = createTestBuffer(context, bufferFrameLength); |
-audit.run(); |
-</script> |
+ should(function() { |
+ for (let i = 0; i < tests.length; ++i) |
+ runLoopTest(context, i, tests[i], should); |
+ }, 'Generate ' + tests.length + ' test cases').notThrow(); |
+ |
+ context.startRendering().then(function(audioBuffer) { |
+ checkAllTests(audioBuffer, should); |
+ task.done(); |
+ }); |
+ }); |
-</body> |
+ audit.run(); |
+ </script> |
+ </body> |
</html> |