| <!DOCTYPE html> |
| |
| <html> |
| <head> |
| <script src="resources/audio-testing.js"></script> |
| <script src="resources/audiobuffersource-testing.js"></script> |
| <script src="../resources/js-test.js"></script> |
| </head> |
| |
| <body> |
| |
| <div id="description"></div> |
| <div id="console"></div> |
| |
| <script> |
| description("Tests AudioBufferSourceNode start() with a variety of offsets and durations."); |
| |
| // The following test cases assume an AudioBuffer of length 8 whose PCM data is a linear ramp, 0, 1, 2, 3,... |
| |
| var tests = [ |
| |
| { description: "start(when): implicitly play whole buffer from beginning to end", |
| offsetFrame: "none", durationFrames: "none", renderFrames: 16, playbackRate: 1, expected: [0,1,2,3,4,5,6,7,0,0,0,0,0,0,0,0] }, |
| |
| { description: "start(when, 0): play whole buffer from beginning to end explicitly giving offset of 0", |
| offsetFrame: 0, durationFrames: "none", renderFrames: 16, playbackRate: 1, expected: [0,1,2,3,4,5,6,7,0,0,0,0,0,0,0,0] }, |
| |
| { description: "start(when, 0, 8_frames): play whole buffer from beginning to end explicitly giving offset of 0 and duration of 8 frames", |
| offsetFrame: 0, durationFrames: 8, renderFrames: 16, playbackRate: 1, expected: [0,1,2,3,4,5,6,7,0,0,0,0,0,0,0,0] }, |
| |
| { description: "start(when, 4_frames): play with explicit non-zero offset", |
| offsetFrame: 4, durationFrames: "none", renderFrames: 16, playbackRate: 1, expected: [4,5,6,7,0,0,0,0,0,0,0,0,0,0,0,0] }, |
| |
| { description: "start(when, 4_frames, 4_frames): play with explicit non-zero offset and duration", |
| offsetFrame: 4, durationFrames: 4, renderFrames: 16, playbackRate: 1, expected: [4,5,6,7,0,0,0,0,0,0,0,0,0,0,0,0] }, |
| |
| // Enable test when AudioBufferSourceNode hack is fixed: https://bugs.webkit.org/show_bug.cgi?id=77224 |
| // { description: "start(when, 3_frames, 3_frames): play a middle section with explicit offset and duration", |
| // offsetFrame: 3, durationFrames: 3, renderFrames: 16, playbackRate: 1, expected: [4,5,6,7,0,0,0,0,0,0,0,0,0,0,0,0] }, |
| |
| ]; |
| |
| var sampleRate = 44100; |
| var buffer; |
| var bufferFrameLength = 8; |
| var testSpacingFrames = 32; |
| var testSpacingSeconds = testSpacingFrames / sampleRate; |
| var totalRenderLengthFrames = tests.length * testSpacingFrames; |
| |
| function runLoopTest(context, testNumber, test) { |
| var source = context.createBufferSource(); |
| |
| source.buffer = buffer; |
| source.playbackRate.value = test.playbackRate; |
| |
| source.connect(context.destination); |
| |
| // Render each test one after the other, spaced apart by testSpacingSeconds. |
| var startTime = testNumber * testSpacingSeconds; |
| |
| if (test.offsetFrame == "none" && test.durationFrames == "none") { |
| source.start(startTime); |
| } else if (test.durationFrames == "none") { |
| var offset = test.offsetFrame / context.sampleRate; |
| source.start(startTime, offset); |
| } else { |
| var offset = test.offsetFrame / context.sampleRate; |
| var duration = test.durationFrames / context.sampleRate; |
| source.start(startTime, offset, duration); |
| } |
| } |
| |
| function runTest() { |
| window.jsTestIsAsync = true; |
| |
| // Create offline audio context. |
| var context = new webkitOfflineAudioContext(1, totalRenderLengthFrames, sampleRate); |
| buffer = createTestBuffer(context, bufferFrameLength); |
| |
| for (var i = 0; i < tests.length; ++i) |
| runLoopTest(context, i, tests[i]); |
| |
| context.oncomplete = checkAllTests; |
| context.startRendering(); |
| } |
| |
| runTest(); |
| |
| </script> |
| </body> |
| </html> |