blob: cbee60cbb9bd169ab6e224f7896bf03f977f9b97 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>
audiochannelmerger-cycle.html
</title>
<script src="../../imported/w3c/web-platform-tests/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">
// This specific sample rate is chosen to avoid the round/truncation error
// in delay time. See: crbug.com/448801
let sampleRate = 32768;
// Web Audio API's rendering quantum.
let renderingQuantum = 128;
// 4x of rendering quantum. This is to make the rendered result long
// enough so that we can observe the delayed output.
let renderLength = renderingQuantum * 4;
// 1x rendering quantum of delay.
let delayTime = renderingQuantum / sampleRate;
// Use 2 channels as a test case.
let numberOfChannels = 2;
let audit = Audit.createTaskRunner();
audit.define('merger-cyclic-graph', (task, should) => {
let context =
new OfflineAudioContext(numberOfChannels, renderLength, sampleRate);
let merger = context.createChannelMerger(2);
let delay = context.createDelay();
let source = context.createBufferSource();
// Create a mono source buffer filled with '1'.
source.buffer = createConstantBuffer(context, renderLength, [1]);
delay.delayTime.value = delayTime;
// Connect the source to input 0 of the merger. Connect the output of
// the merger to a delay node whose output is then connected to input 1
// of the merger. See: crbug.com/442925
source.connect(merger, 0, 0);
delay.connect(merger, 0, 1);
merger.connect(delay);
merger.connect(context.destination);
source.start();
context.startRendering().then(function(buffer) {
// Expected output values: the output of delay node will be a stereo
// signal of [1, 0]. When it feeds back to the 2nd input of merger
// node, the stereo channel will be summed to mono resulting in 0.5.
let expected_left = [];
let expected_right = [];
for (let i = 0; i < renderLength; i++) {
// Note that the delayed channel will be zero for the first 128
// samples due to the cyclic audio graph, the second 128 sample will
// be also zero because of 128 samples delay.
expected_left[i] = 1.0;
expected_right[i] = (i < renderingQuantum * 2) ? 0.0 : 0.5;
}
let actual_left = buffer.getChannelData(0);
let actual_right = buffer.getChannelData(1);
should(actual_left, 'Left channel').beEqualToArray(expected_left);
should(actual_right, 'Right channel').beEqualToArray(expected_right);
task.done();
});
});
audit.run();
</script>
</body>
</html>