1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
<!DOCTYPE html>
<html>
<head>
<title>
audiobuffersource-start.html
</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/resources/audit-util.js"></script>
<script src="/webaudio/resources/audit.js"></script>
<script src="/webaudio/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,...
let 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]
},
{
description:
'start(when, 7_frames): play with explicit non-zero offset near end of buffer',
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]
},
{
description:
'start(when, 8_frames): play with explicit offset at end of buffer',
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]
},
{
description:
'start(when, 9_frames): play with explicit offset past end of buffer',
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]
},
// When the duration exceeds the buffer, just play to the end of the
// buffer. (This is different from the case when we're looping, which is
// tested in loop-comprehensive.)
{
description:
'start(when, 0, 15_frames): play with whole buffer, with long duration (clipped)',
offsetFrame: 0,
durationFrames: 15,
renderFrames: 16,
playbackRate: 1,
expected: [0, 1, 2, 3, 4, 5, 6, 7, 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] },
];
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) {
let 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.
let startTime = testNumber * testSpacingSeconds;
if (test.offsetFrame == 'none' && test.durationFrames == 'none') {
source.start(startTime);
} else if (test.durationFrames == 'none') {
let offset = test.offsetFrame / context.sampleRate;
source.start(startTime, offset);
} else {
let offset = test.offsetFrame / context.sampleRate;
let duration = test.durationFrames / context.sampleRate;
source.start(startTime, offset, duration);
}
}
audit.define(
'Tests AudioBufferSourceNode start()', function(task, should) {
// Create offline audio context.
let context =
new OfflineAudioContext(1, totalRenderLengthFrames, sampleRate);
buffer = createTestBuffer(context, bufferFrameLength);
for (let i = 0; i < tests.length; ++i)
runLoopTest(context, i, tests[i]);
context.startRendering().then(function(audioBuffer) {
checkAllTests(audioBuffer, should);
task.done();
});
});
audit.run();
</script>
</body>
</html>
|