summaryrefslogtreecommitdiffstats
path: root/dom/media/test/crashtests/buffer-source-slow-resampling-1.html
blob: 5d8a50442b1aef73cf5780c327bcd62830784a5c (plain)
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
<!DOCTYPE html>
<html class="reftest-wait">
<script>
const blockSize = 128;
// The sample rate is a prime number so that the resampler is not expected to
// simplify in/out fractions.
const rate = 44101;
var context = new window.OfflineAudioContext(1, 3 * blockSize, rate);
// Non-zero buffer, so it can't be optimized away.
var buffer = context.createBuffer(1, 128, rate);
buffer.getChannelData(0)[0] = 1.0;
var source = context.createBufferSource();
source.buffer = buffer;
source.loop = true;
// Initialize the resampler with a slow input rate. 
// With the current (Mar 2017) implementation, very slow rates give the
// resampler a very large denominator.
source.playbackRate.setValueAtTime(rate / 0x7fffffff, 0.0);
// Change to a moderate input rate.
// With the current implementation, skip_frac_num increases by den_rate for
// each output sample and so one block before the change in playback rate is
// enough for high skip_frac_num at the time of the change.
const changeBlock = 1;
const changeBlockSeconds = changeBlock * blockSize / rate;
// With the current speex_resampler_set_rate_frac() implementation, the
// moderate resampler denominator is still large enough to trigger overflow of
// 32-bit unsigned integer arithmetic.
source.playbackRate.setValueAtTime(rate / (rate + 1), changeBlockSeconds);
source.start(0);
context.startRendering().
  then(function() {
    document.documentElement.removeAttribute("class");
  });
</script>