Source code

Revision control

Copy as Markdown

Other Tools

/**
* @class ArrayFrozenProcessor
* @extends AudioWorkletProcessor
*/
class ArrayFrozenProcessor extends AudioWorkletProcessor {
constructor() {
super();
this._messageSent = false;
}
process(inputs, outputs, parameters) {
const input = inputs[0];
const output = outputs[0];
if (!this._messageSent) {
this.port.postMessage({
inputLength: input.length,
isInputFrozen: Object.isFrozen(inputs) && Object.isFrozen(input),
outputLength: output.length,
isOutputFrozen: Object.isFrozen(outputs) && Object.isFrozen(output)
});
this._messageSent = true;
}
return false;
}
}
/**
* @class ArrayTransferProcessor
* @extends AudioWorkletProcessor
*/
class ArrayTransferProcessor extends AudioWorkletProcessor {
constructor() {
super();
this._messageSent = false;
}
process(inputs, outputs, parameters) {
const input = inputs[0];
const output = outputs[0];
if (!this._messageSent) {
try {
// Transferring Array objects should NOT work.
this.port.postMessage({
inputs, input, inputChannel: input[0],
outputs, output, outputChannel: output[0]
}, [inputs, input, inputs[0], outputs, output, output[0]]);
// Hence, the following must NOT be reached.
this.port.postMessage({
type: 'assertion',
success: false,
message: 'Transferring inputs/outputs, an individual input/output ' +
'array, or a channel Float32Array MUST fail, but succeeded.'
});
} catch (error) {
this.port.postMessage({
type: 'assertion',
success: true,
message: 'Transferring inputs/outputs, an individual input/output ' +
'array, or a channel Float32Array is not allowed as expected.'
});
}
try {
// Transferring ArrayBuffers should work.
this.port.postMessage(
{inputChannel: input[0], outputChannel: output[0]},
[input[0].buffer, output[0].buffer]);
this.port.postMessage({
type: 'assertion',
success: true,
message: 'Transferring ArrayBuffers was successful as expected.'
});
} catch (error) {
// This must NOT be reached.
this.port.postMessage({
type: 'assertion',
success: false,
message: 'Transferring ArrayBuffers unexpectedly failed.'
});
}
this.port.postMessage({done: true});
this._messageSent = true;
}
return false;
}
}
registerProcessor('array-frozen-processor', ArrayFrozenProcessor);
registerProcessor('array-transfer-processor', ArrayTransferProcessor);