blob: 6a66c7d6585fe4a81d149c0e21735fb8af0873aa [file] [log] [blame] [edit]
<!doctype html>
<html>
<head>
<title>Test Biquad Tail Output</title>
<script src="../resources/js-test.js"></script>
<script src="resources/compatibility.js"></script>
<script src="resources/audio-testing.js"></script>
</head>
<body>
<script>
description("Test Biquad Tail Output");
window.jsTestIsAsync = true;
// A high sample rate shows the issue more clearly.
var sampleRate = 192000;
// Some short duration because we don't need to run the test for very long.
var testDurationSec = 0.5;
var testDurationFrames = testDurationSec * sampleRate;
// Amplitude experimentally determined to give a biquad output close to 1. (No attempt was
// made to produce exactly 1; it's not needed.)
var sourceAmplitude = 100;
// The output of the biquad filter should not change by more than this much between output
// samples. Threshold was determined experimentally.
var glitchThreshold = 0.0129;
// Test that a Biquad filter doesn't have it's output terminated because the input has gone
// away. Generally, when a source node is finished, it disconnects itself from any downstream
// nodes. This is the correct behavior. Nodes that have no inputs (disconnected) are
// generally assumed to output zeroes. This is also desired behavior. However, biquad
// filters have memory so they should not suddenly output zeroes when the input is
// disconnected. This test checks to see if the output doesn't suddenly change to zero.
function runTest() {
var context = new OfflineAudioContext(1, testDurationFrames, sampleRate);
// Create an impulse source.
var buffer = context.createBuffer(1, 1, context.sampleRate);
buffer.getChannelData(0)[0] = sourceAmplitude;
var source = context.createBufferSource();
source.buffer = buffer;
// Create the biquad filter. It doesn't really matter what kind, so the default filter type
// and parameters is fine. Connect the source to it.
var biquad = context.createBiquadFilter();
source.connect(biquad);
biquad.connect(context.destination);
source.start();
context.startRendering().then(function(result) {
// There should be no large discontinuities in the output
var success = true;
success = success && Should("Biquad output", result.getChannelData(0)).notGlitch(glitchThreshold);
if (success)
testPassed("Biquad tail output correctly completed.");
else
testFailed("Biquad tail output not correctly completed.");
}).then(finishJSTest);
}
runTest();
successfullyParsed = true;
</script>
</body>
</html>