OLD | NEW |
| (Empty) |
1 <!DOCTYPE html> | |
2 | |
3 <html> | |
4 <head> | |
5 <script src="../resources/js-test.js"></script> | |
6 <script src="resources/compatibility.js"></script> | |
7 <script src="resources/audit-util.js"></script> | |
8 <script src="resources/audio-testing.js"></script> | |
9 <script src="resources/audiobuffersource-testing.js"></script> | |
10 </head> | |
11 | |
12 <body> | |
13 | |
14 <div id="description"></div> | |
15 <div id="console"></div> | |
16 | |
17 <script> | |
18 description("Tests AudioBufferSourceNode start() with a variety of offsets and d
urations."); | |
19 | |
20 // The following test cases assume an AudioBuffer of length 8 whose PCM data is
a linear ramp, 0, 1, 2, 3,... | |
21 | |
22 var tests = [ | |
23 | |
24 { description: "start(when): implicitly play whole buffer from beginning to end"
, | |
25 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] }, | |
26 | |
27 { description: "start(when, 0): play whole buffer from beginning to end explicit
ly giving offset of 0", | |
28 offsetFrame: 0, durationFrames: "none", renderFrames: 16, playbackRate: 1, exp
ected: [0,1,2,3,4,5,6,7,0,0,0,0,0,0,0,0] }, | |
29 | |
30 { description: "start(when, 0, 8_frames): play whole buffer from beginning to en
d explicitly giving offset of 0 and duration of 8 frames", | |
31 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] }, | |
32 | |
33 { description: "start(when, 4_frames): play with explicit non-zero offset", | |
34 offsetFrame: 4, durationFrames: "none", renderFrames: 16, playbackRate: 1, exp
ected: [4,5,6,7,0,0,0,0,0,0,0,0,0,0,0,0] }, | |
35 | |
36 { description: "start(when, 4_frames, 4_frames): play with explicit non-zero off
set and duration", | |
37 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] }, | |
38 | |
39 { description: "start(when, 7_frames): play with explicit non-zero offset near e
nd of buffer", | |
40 offsetFrame: 7, durationFrames: 1, renderFrames: 16, playbackRate: 1, expected
: [7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] }, | |
41 | |
42 { description: "start(when, 8_frames): play with explicit offset at end of buffe
r", | |
43 offsetFrame: 8, durationFrames: 0, renderFrames: 16, playbackRate: 1, expected
: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] }, | |
44 | |
45 { description: "start(when, 9_frames): play with explicit offset past end of buf
fer", | |
46 offsetFrame: 8, durationFrames: 0, renderFrames: 16, playbackRate: 1, expected
: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] }, | |
47 | |
48 // When the duration exceeds the buffer, just play to the end of the buffer. | |
49 // (This is different from the case when we're looping, which is tested in loop-
comprehensive.) | |
50 { description: "start(when, 0, 15_frames): play with whole buffer, with long dur
ation (clipped)", | |
51 offsetFrame: 0, durationFrames: 15, renderFrames: 16, playbackRate: 1, expecte
d: [0,1,2,3,4,5,6,7,0,0,0,0,0,0,0,0] }, | |
52 | |
53 // Enable test when AudioBufferSourceNode hack is fixed: https://bugs.webkit.org
/show_bug.cgi?id=77224 | |
54 // { description: "start(when, 3_frames, 3_frames): play a middle section with e
xplicit offset and duration", | |
55 // offsetFrame: 3, durationFrames: 3, renderFrames: 16, playbackRate: 1, expec
ted: [4,5,6,7,0,0,0,0,0,0,0,0,0,0,0,0] }, | |
56 | |
57 ]; | |
58 | |
59 var sampleRate = 44100; | |
60 var buffer; | |
61 var bufferFrameLength = 8; | |
62 var testSpacingFrames = 32; | |
63 var testSpacingSeconds = testSpacingFrames / sampleRate; | |
64 var totalRenderLengthFrames = tests.length * testSpacingFrames; | |
65 | |
66 function runLoopTest(context, testNumber, test) { | |
67 var source = context.createBufferSource(); | |
68 | |
69 source.buffer = buffer; | |
70 source.playbackRate.value = test.playbackRate; | |
71 | |
72 source.connect(context.destination); | |
73 | |
74 // Render each test one after the other, spaced apart by testSpacingSeconds. | |
75 var startTime = testNumber * testSpacingSeconds; | |
76 | |
77 if (test.offsetFrame == "none" && test.durationFrames == "none") { | |
78 source.start(startTime); | |
79 } else if (test.durationFrames == "none") { | |
80 var offset = test.offsetFrame / context.sampleRate; | |
81 source.start(startTime, offset); | |
82 } else { | |
83 var offset = test.offsetFrame / context.sampleRate; | |
84 var duration = test.durationFrames / context.sampleRate; | |
85 source.start(startTime, offset, duration); | |
86 } | |
87 } | |
88 | |
89 function runTest() { | |
90 if (window.testRunner) { | |
91 testRunner.dumpAsText(); | |
92 testRunner.waitUntilDone(); | |
93 } | |
94 | |
95 window.jsTestIsAsync = true; | |
96 | |
97 // Create offline audio context. | |
98 var context = new OfflineAudioContext(1, totalRenderLengthFrames, sampleRate
); | |
99 buffer = createTestBuffer(context, bufferFrameLength); | |
100 | |
101 for (var i = 0; i < tests.length; ++i) | |
102 runLoopTest(context, i, tests[i]); | |
103 | |
104 context.oncomplete = checkAllTests; | |
105 context.startRendering(); | |
106 } | |
107 | |
108 runTest(); | |
109 successfullyParsed = true; | |
110 | |
111 </script> | |
112 | |
113 </body> | |
114 </html> | |
OLD | NEW |