Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!doctype html>
<title>Test parameters of process() AudioWorkletProcessor callback</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
var context;
promise_setup(async (t) => {
context = new AudioContext();
const filePath = 'processors/process-parameter-test-processor.js';
await context.audioWorklet.addModule(filePath);
});
const get_parameters = async (node, options) => {
const event = await new Promise((resolve) => {
node.port.onmessage = resolve;
});
const inputs = event.data.inputs;
assert_equals(inputs.length, options.numberOfInputs, 'inputs length');
const outputs = event.data.outputs;
assert_equals(outputs.length, options.numberOfOutputs, 'outputs length');
for (let port = 0; port < inputs.length; ++port) {
for (let channel = 0; channel < inputs[port].length; ++channel) {
assert_equals(inputs[port][channel].length, 128,
`inputs[${port}][${channel}].length`);
}
}
for (let port = 0; port < outputs.length; ++port) {
for (let channel = 0; channel < outputs[port].length; ++channel) {
assert_equals(outputs[port][channel].length, 128,
`outputs[${port}][${channel}].length`);
}
}
return event.data;
};
promise_test(async (t) => {
const options = {
numberOfInputs: 3,
numberOfOutputs: 0
};
// Connect a source so that one channel of one input is active.
context.suspend();
const source = new ConstantSourceNode(context);
source.start();
const merger = new ChannelMergerNode(context, {numberOfInputs: 2});
const active_channel_index = merger.numberOfInputs - 1;
source.connect(merger, 0, active_channel_index);
const node = new AudioWorkletNode(context, 'process-parameter-test', options);
const active_port_index = options.numberOfInputs - 1;
merger.connect(node, 0, active_port_index);
context.resume();
const {inputs} = await get_parameters(node, options);
for (let port = 0; port < inputs.length - 1; ++port) {
if (port != active_port_index) {
assert_equals(inputs[port].length, 0, `inputs[${port}].length`);
}
}
const active_input = inputs[active_port_index];
assert_equals(active_input.length, merger.numberOfInputs,
'active_input.length');
for (let channel = 0; channel < active_input.length; ++channel) {
let expected = channel == active_channel_index ? 1.0 : 0.0;
for (let sample = 0; sample < inputs.length; ++sample) {
assert_equals(active_input[channel][sample], expected,
`active_input[${channel}][${sample}]`);
}
}
}, '3 inputs; 0 outputs');
promise_test(async (t) => {
const options = {
numberOfInputs: 0,
numberOfOutputs: 3
};
const node = new AudioWorkletNode(context, 'process-parameter-test', options);
const {outputs} = await get_parameters(node, options);
for (let port = 0; port < outputs.length; ++port) {
assert_equals(outputs[port].length, 1, `outputs[${port}].length`);
for (let channel = 0; channel < outputs[port].length; ++channel) {
for (let sample = 0; sample < outputs.length; ++sample) {
assert_equals(outputs[port][channel][sample], 0.0,
`outputs[${port}][${channel}][${sample}]`);
}
}
}
}, '0 inputs; 3 outputs');
</script>