| OLD | NEW |
| (Empty) |
| 1 <!DOCTYPE html> | |
| 2 | |
| 3 <html> | |
| 4 <head> | |
| 5 <script src="resources/audio-testing.js"></script> | |
| 6 <script src="resources/audiobuffersource-testing.js"></script> | |
| 7 <script src="../resources/js-test.js"></script> | |
| 8 </head> | |
| 9 | |
| 10 <body> | |
| 11 | |
| 12 <div id="description"></div> | |
| 13 <div id="console"></div> | |
| 14 | |
| 15 <script> | |
| 16 description("Tests AudioBufferSourceNode looping with a variety of loop points."
); | |
| 17 | |
| 18 // The following test cases assume an AudioBuffer of length 8 whose PCM data is
a linear ramp, 0, 1, 2, 3,... | |
| 19 | |
| 20 var tests = [ | |
| 21 | |
| 22 { description: "loop whole buffer by default with loopStart == loopEnd == 0", | |
| 23 loopStartFrame: 0, loopEndFrame: 0, renderFrames: 16, playbackRate: 1, expecte
d: [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] }, | |
| 24 | |
| 25 { description: "loop whole buffer explicitly", | |
| 26 loopStartFrame: 0, loopEndFrame: 8, renderFrames: 16, playbackRate: 1, expecte
d: [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] }, | |
| 27 | |
| 28 { description: "loop from middle to end of buffer", | |
| 29 loopStartFrame: 4, loopEndFrame: 8, renderFrames: 16, playbackRate: 1, expecte
d: [0,1,2,3,4,5,6,7,4,5,6,7,4,5,6,7] }, | |
| 30 | |
| 31 { description: "loop from start to middle of buffer", | |
| 32 loopStartFrame: 0, loopEndFrame: 4, renderFrames: 16, playbackRate: 1, expecte
d: [0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] }, | |
| 33 | |
| 34 { description: "loop internally from 4 -> 6", | |
| 35 loopStartFrame: 4, loopEndFrame: 6, renderFrames: 16, playbackRate: 1, expecte
d: [0,1,2,3,4,5,4,5,4,5,4,5,4,5,4,5] }, | |
| 36 | |
| 37 { description: "loop internally from 3 -> 7", | |
| 38 loopStartFrame: 3, loopEndFrame: 7, renderFrames: 16, playbackRate: 1, expecte
d: [0,1,2,3,4,5,6,3,4,5,6,3,4,5,6,3] }, | |
| 39 | |
| 40 { description: "loop internally from 4 -> 6 with playbackRate of 0.5", | |
| 41 loopStartFrame: 4, loopEndFrame: 6, renderFrames: 16, playbackRate: 0.5, expec
ted: [0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 4, 4.5, 5, 5.5] }, | |
| 42 | |
| 43 { description: "loop internally from 4 -> 6 with playbackRate of 1.5", | |
| 44 loopStartFrame: 4, loopEndFrame: 6, renderFrames: 16, playbackRate: 1.5, expec
ted: [0, 1.5, 3, 4.5, 4, 5.5, 5, 4.5, 4, 5.5, 5, 4.5, 4, 5.5, 5, 4.5] }, | |
| 45 | |
| 46 { description: "illegal playbackRate of 47 greater than loop length", | |
| 47 loopStartFrame: 4, loopEndFrame: 6, renderFrames: 16, playbackRate: 47, expect
ed: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] }, | |
| 48 | |
| 49 // Try illegal loop-points - they should be ignored and we'll loop the whole buf
fer. | |
| 50 | |
| 51 { description: "illegal loop: loopStartFrame > loopEndFrame", | |
| 52 loopStartFrame: 7, loopEndFrame: 3, renderFrames: 16, playbackRate: 1, expecte
d: [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] }, | |
| 53 | |
| 54 { description: "illegal loop: loopStartFrame == loopEndFrame", | |
| 55 loopStartFrame: 3, loopEndFrame: 3, renderFrames: 16, playbackRate: 1, expecte
d: [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] }, | |
| 56 | |
| 57 { description: "illegal loop: loopStartFrame < 0", | |
| 58 loopStartFrame: -45, loopEndFrame: 3, renderFrames: 16, playbackRate: 1, expec
ted: [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] }, | |
| 59 | |
| 60 { description: "illegal loop: loopEndFrame > bufferLength", | |
| 61 loopStartFrame: 0, loopEndFrame: 30000, renderFrames: 16, playbackRate: 1, exp
ected: [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] }, | |
| 62 | |
| 63 ]; | |
| 64 | |
| 65 var sampleRate = 44100; | |
| 66 var buffer; | |
| 67 var bufferFrameLength = 8; | |
| 68 var testSpacingFrames = 32; | |
| 69 var testSpacingSeconds = testSpacingFrames / sampleRate; | |
| 70 var totalRenderLengthFrames = tests.length * testSpacingFrames; | |
| 71 | |
| 72 function runLoopTest(context, testNumber, test) { | |
| 73 var source = context.createBufferSource(); | |
| 74 | |
| 75 source.buffer = buffer; | |
| 76 source.playbackRate.value = test.playbackRate; | |
| 77 source.looping = true; | |
| 78 source.loopStart = test.loopStartFrame / context.sampleRate; | |
| 79 source.loopEnd = test.loopEndFrame / context.sampleRate; | |
| 80 | |
| 81 source.connect(context.destination); | |
| 82 | |
| 83 // Render each test one after the other, spaced apart by testSpacingSeconds. | |
| 84 var startTime = testNumber * testSpacingSeconds; | |
| 85 var duration = test.renderFrames / context.sampleRate; | |
| 86 source.start(startTime); | |
| 87 source.stop(startTime + duration); | |
| 88 } | |
| 89 | |
| 90 function runTest() { | |
| 91 if (window.testRunner) { | |
| 92 testRunner.dumpAsText(); | |
| 93 testRunner.waitUntilDone(); | |
| 94 } | |
| 95 | |
| 96 window.jsTestIsAsync = true; | |
| 97 | |
| 98 // Create offline audio context. | |
| 99 var context = new webkitOfflineAudioContext(1, totalRenderLengthFrames, samp
leRate); | |
| 100 buffer = createTestBuffer(context, bufferFrameLength); | |
| 101 | |
| 102 for (var i = 0; i < tests.length; ++i) | |
| 103 runLoopTest(context, i, tests[i]); | |
| 104 | |
| 105 context.oncomplete = checkAllTests; | |
| 106 context.startRendering(); | |
| 107 } | |
| 108 | |
| 109 runTest(); | |
| 110 successfullyParsed = true; | |
| 111 | |
| 112 </script> | |
| 113 | |
| 114 </body> | |
| 115 </html> | |
| OLD | NEW |