<!DOCTYPE html>
<html>
<head>
<title>
Test Sampling for SetTargetAtTime
</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../resources/audit-util.js"></script>
<script src="../resources/audit.js"></script>
<script src="../resources/audioparam-testing.js"></script>
</head>
<body>
<script id="layout-test-code">
// Some slow sample rate, but otherwise arbitrary.
let sampleRate = 12800;
// Time constant for setTargetValue. Make it short, but is otherwise
// arbitrary.
let timeConstant = 10 / sampleRate;
// Defaut initial gain for test. Arbitrary, but we want it large so the
// changes look large, even if the relative change isn't.
let initialGain = 10000;
let audit = Audit.createTaskRunner();
// Test sampling of setTargetAtTime that starts at |startFrame|. A gain
// node is used for testing. |initializeGainFunction| initializes the
// gain value.
function doTest(
should, message, startFrame, threshold, initializeGainFunction) {
let context = new OfflineAudioContext(1, 256, sampleRate);
let source = context.createBufferSource();
let b = context.createBuffer(1, 1, sampleRate);
b.getChannelData(0)[0] = 1;
source.buffer = b;
source.loop = true;
let gain = context.createGain();
// Initialize the value of the gain node appropriately.
initializeGainFunction(gain);
gain.gain.setTargetAtTime(0, startFrame / sampleRate, timeConstant);
source.connect(gain);
gain.connect(context.destination);
source.start();
return context.startRendering().then(function(resultBuffer) {
// Verify that the sampling of the setTargetAtTime automation was done
// correctly. We just look at the sample just past the start of the
// automation.
let resultData = resultBuffer.getChannelData(0);
// Compute the true result at the frame just past startFrame and
// verify that the actual rendered result is within |threshold| of the
// expected value.
let frame = Math.ceil(startFrame);
let v = 10000 *
Math.exp(
-(frame / sampleRate - startFrame / sampleRate) /
timeConstant);
should(
resultData[frame], message + ': Target value at frame ' + frame)
.beCloseTo(v, {threshold: threshold});
});
}
function initializeGainBySetter(g) {
g.gain.value = initialGain;
}
function initializeGainBySetValue(g) {
g.gain.setValueAtTime(initialGain, 0);
}
audit.define('setValue;128.1', (task, should) => {
doTest(
should, 'Initialize by setValueAtTime', 128.1, 3.6029e-8,
initializeGainBySetValue)
.then(() => task.done());
});
audit.define('setValue;0.1', (task, should) => {
doTest(
should, 'Initialize by setValueAtTime', 0.1, 3.6029e-8,
initializeGainBySetValue)
.then(() => task.done());
});
audit.define('setValue;0.0', (task, should) => {
doTest(
should, 'Initialize by setValueAtTime', 0, 3.6029e-8,
initializeGainBySetValue)
.then(() => task.done());
});
audit.define('setter;128.1', (task, should) => {
doTest(
should, 'Initialize by setter', 128.1, 3.6029e-8,
initializeGainBySetter)
.then(() => task.done());
});
audit.define('setter;0.1', (task, should) => {
doTest(
should, 'Initialize by setter', 0.1, 3.6029e-8,
initializeGainBySetter)
.then(() => task.done());
});
audit.define('setter;0.0', (task, should) => {
doTest(should, 'Initialize by setter', 0, 0, initializeGainBySetter)
.then(() => task.done());
});
audit.run();
</script>
</body>
</html>