Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!DOCTYPE HTML>
<html>
<head>
<title>Test tail time lifetime of DelayNode after input is disconnected</title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="webaudio.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<pre id="test">
<script class="testbody" type="text/javascript">
// Web Audio doesn't provide a means to precisely time disconnect()s but we
// can test that the output of delay nodes matches the output from their
// sources before they are disconnected.
SimpleTest.waitForExplicitFinish();
const signalLength = 128;
const bufferSize = 4096;
const sourceCount = bufferSize / signalLength;
// Delay should be long enough to allow CC to run
var delayBufferCount = 20;
const delayLength = delayBufferCount * bufferSize;
var sourceOutput = new Float32Array(bufferSize);
var delayOutputCount = 0;
var sources = [];
function onDelayOutput(e) {
if (delayOutputCount < delayBufferCount) {
delayOutputCount++;
return;
}
compareChannels(e.inputBuffer.getChannelData(0), sourceOutput);
e.target.onaudioprocess = null;
SimpleTest.finish();
}
function onSourceOutput(e) {
// Record the first buffer
e.inputBuffer.copyFromChannel(sourceOutput, 0);
e.target.onaudioprocess = null;
}
function disconnectSources() {
for (var i = 0; i < sourceCount; ++i) {
sources[i].disconnect();
}
SpecialPowers.forceGC();
SpecialPowers.forceCC();
}
function startTest() {
var ctx = new AudioContext();
var sourceProcessor = ctx.createScriptProcessor(bufferSize, 1, 0);
sourceProcessor.onaudioprocess = onSourceOutput;
// Keep audioprocess events going after source disconnect.
sourceProcessor.connect(ctx.destination);
var delayProcessor = ctx.createScriptProcessor(bufferSize, 1, 0);
delayProcessor.onaudioprocess = onDelayOutput;
var delayDuration = delayLength / ctx.sampleRate;
for (var i = 0; i < sourceCount; ++i) {
var delay = ctx.createDelay(delayDuration);
delay.delayTime.value = delayDuration;
delay.connect(delayProcessor);
var source = ctx.createOscillator();
source.frequency.value = 440 + 10 * i
source.start(i * signalLength / ctx.sampleRate);
source.stop((i + 1) * signalLength / ctx.sampleRate);
source.connect(delay);
source.connect(sourceProcessor);
sources[i] = source;
}
// Assuming the above Web Audio operations have already scheduled an event
// to run in stable state and start the graph thread, schedule a subsequent
// event to disconnect the sources, which will remove main thread connection
// references before it knows the graph thread has started using the source
// streams.
SimpleTest.executeSoon(disconnectSources);
};
startTest();
</script>
</pre>
</body>
</html>