#### Source code

#### Revision control

#### Copy as Markdown

#### Other Tools

#### Test Info:

```
<!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>
```