100 lines
3.6 KiB
HTML
100 lines
3.6 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>
|
|
Test WaveShaper Copies Curve Data
|
|
</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>
|
|
</head>
|
|
<body>
|
|
<script id="layout-test-code">
|
|
// Sample rate and number of frames are fairly arbitrary. We need to
|
|
// render, however, at least 384 frames. 1024 is a nice small value.
|
|
let sampleRate = 16000;
|
|
let renderFrames = 1024;
|
|
|
|
let audit = Audit.createTaskRunner();
|
|
|
|
audit.define(
|
|
{
|
|
label: 'test copying',
|
|
description: 'Modifying curve should not modify WaveShaper'
|
|
},
|
|
(task, should) => {
|
|
// Two-channel context; channel 0 contains the test data and channel
|
|
// 1 contains the expected result. Channel 1 has the normal
|
|
// WaveShaper output and channel 0 has the WaveShaper output with a
|
|
// modified curve.
|
|
let context = new OfflineAudioContext(2, renderFrames, sampleRate);
|
|
|
|
// Just use a default oscillator as the source. Doesn't really
|
|
// matter what we use.
|
|
let src = context.createOscillator();
|
|
src.type = 'sawtooth';
|
|
|
|
// Create the wave shapers: ws0 is the test shaper, and ws1 is the
|
|
// reference wave shaper.
|
|
let ws0 = context.createWaveShaper();
|
|
let ws1 = context.createWaveShaper();
|
|
|
|
// Wave shaper curves. Doesn't really matter what we use as long as
|
|
// it modifies the input in some way. Thus, keep it simple and just
|
|
// invert the input.
|
|
let desiredCurve = [1, 0, -1];
|
|
let curve0 = Float32Array.from(desiredCurve);
|
|
let curve1 = Float32Array.from(desiredCurve);
|
|
|
|
ws0.curve = curve0;
|
|
ws1.curve = curve1;
|
|
|
|
let merger = context.createChannelMerger(2);
|
|
|
|
// Connect the graph
|
|
src.connect(ws0);
|
|
src.connect(ws1);
|
|
|
|
ws0.connect(merger, 0, 0);
|
|
ws1.connect(merger, 0, 1);
|
|
|
|
merger.connect(context.destination);
|
|
|
|
// Let the context run for a bit and then modify the curve for ws0.
|
|
// Doesn't really matter what we modify the curve to as long as it's
|
|
// different.
|
|
context.suspend(256 / context.sampleRate)
|
|
.then(() => {
|
|
should(
|
|
() => {
|
|
curve0[0] = -0.5;
|
|
curve0[1] = 0.125;
|
|
curve0[2] = 0.75;
|
|
},
|
|
`Modifying curve array at time ${context.currentTime}`)
|
|
.notThrow();
|
|
})
|
|
.then(context.resume.bind(context));
|
|
|
|
src.start();
|
|
|
|
context.startRendering()
|
|
.then(function(renderedBuffer) {
|
|
let actual = renderedBuffer.getChannelData(0);
|
|
let expected = renderedBuffer.getChannelData(1);
|
|
|
|
// Modifying the wave shaper curve should not modify the
|
|
// output so the outputs from the two wave shaper nodes should
|
|
// be exactly identical.
|
|
should(actual, 'Output of WaveShaper with modified curve')
|
|
.beEqualToArray(expected);
|
|
|
|
})
|
|
.then(() => task.done());
|
|
});
|
|
|
|
audit.run();
|
|
</script>
|
|
</body>
|
|
</html>
|