mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-27 12:15:33 +00:00
0aa21f1517
This is in the mochitest suite so that Android and B2G tests can run it, but designed so that it can be moved to web-platform-tests when they run on all platforms. --HG-- extra : rebase_source : 775f1d9e4122d52cd58c0d6893681d31268cb715
73 lines
2.2 KiB
HTML
73 lines
2.2 KiB
HTML
<!DOCTYPE html>
|
|
<title>Test convolution to delay a triangle pulse</title>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script>
|
|
const sampleRate = 48000;
|
|
const LENGTH = 12800;
|
|
// tolerate 16-bit math.
|
|
const EPSILON = 1.0 / Math.pow(2, 15);
|
|
|
|
// Triangle pulse
|
|
var sourceBuffer = new OfflineAudioContext(1, 1, sampleRate).
|
|
createBuffer(1, 2 * 128, sampleRate);
|
|
var channelData = sourceBuffer.getChannelData(0);
|
|
for (var i = 0; i < 128; ++i) {
|
|
channelData[i] = i/128;
|
|
channelData[128 + i] = 1.0 - i/128;
|
|
}
|
|
|
|
function test_delay_index(delayIndex) {
|
|
|
|
var context = new OfflineAudioContext(2, LENGTH, sampleRate);
|
|
|
|
var merger = context.createChannelMerger(2);
|
|
merger.connect(context.destination);
|
|
|
|
var impulse = context.createBuffer(1, delayIndex + 1, sampleRate);
|
|
impulse.getChannelData(0)[delayIndex] = 1.0;
|
|
var convolver = context.createConvolver();
|
|
convolver.normalize = false;
|
|
convolver.buffer = impulse;
|
|
convolver.connect(merger, 0, 0);
|
|
|
|
var delayTime = delayIndex/sampleRate;
|
|
var delay = context.createDelay(delayTime || 1/sampleRate);
|
|
delay.delayTime.value = delayTime;
|
|
delay.connect(merger, 0, 1);
|
|
|
|
var source = context.createBufferSource();
|
|
source.buffer = sourceBuffer;
|
|
source.connect(convolver);
|
|
source.connect(delay);
|
|
source.start(0);
|
|
|
|
return context.startRendering().
|
|
then((buffer) => {
|
|
var convolverOutput = buffer.getChannelData(0);
|
|
var delayOutput = buffer.getChannelData(1);
|
|
var maxDiff = 0.0;
|
|
var maxIndex = 0;
|
|
for (var i = 0; i < buffer.length; ++i) {
|
|
var diff = Math.abs(convolverOutput[i] - delayOutput[i]);
|
|
if (diff > maxDiff) {
|
|
maxDiff = diff;
|
|
maxIndex = i;
|
|
}
|
|
}
|
|
// The convolver should produce similar output to the delay.
|
|
assert_approx_equals(convolverOutput[maxIndex], delayOutput[maxIndex],
|
|
EPSILON, "output at " + maxIndex);
|
|
});
|
|
}
|
|
|
|
// The 5/4 ratio provides sampling across a range of delays and offsets within
|
|
// blocks.
|
|
for (var delayIndex = 0;
|
|
delayIndex < LENGTH;
|
|
delayIndex = Math.floor((5 * (delayIndex + 1)) / 4)) {
|
|
promise_test(test_delay_index.bind(null, delayIndex),
|
|
"Delay " + delayIndex);
|
|
}
|
|
</script>
|