diff options
Diffstat (limited to '')
-rw-r--r-- | dom/media/webaudio/test/test_convolverNodeDelay.html | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/dom/media/webaudio/test/test_convolverNodeDelay.html b/dom/media/webaudio/test/test_convolverNodeDelay.html new file mode 100644 index 0000000000..2e8caf8027 --- /dev/null +++ b/dom/media/webaudio/test/test_convolverNodeDelay.html @@ -0,0 +1,72 @@ +<!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> |