/** * @class ActiveProcessingTester * @extends AudioWorkletProcessor * * This processor class sends a message to its AudioWorkletNodew whenever the * number of channels on the input changes. The message includes the actual * number of channels, the context time at which this occurred, and whether * we're done processing or not. */ class ActiveProcessingTester extends AudioWorkletProcessor { constructor(options) { super(options); this._lastChannelCount = 0; // See if user specified a value for test duration. if (options.hasOwnProperty('processorOptions') && options.processorOptions.hasOwnProperty('testDuration')) { this._testDuration = options.processorOptions.testDuration; } else { this._testDuration = 5; } // Time at which we'll signal we're done, based on the requested // |testDuration| this._endTime = currentTime + this._testDuration; } process(inputs, outputs) { const input = inputs[0]; const output = outputs[0]; const inputChannelCount = input.length; const isFinished = currentTime > this._endTime; // Send a message if we're done or the count changed. if (isFinished || (inputChannelCount != this._lastChannelCount)) { this.port.postMessage({ channelCount: inputChannelCount, finished: isFinished, time: currentTime }); this._lastChannelCount = inputChannelCount; } // Just copy the input to the output for no particular reason. for (let channel = 0; channel < input.length; ++channel) { output[channel].set(input[channel]); } // When we're finished, this method no longer needs to be called. return !isFinished; } } registerProcessor('active-processing-tester', ActiveProcessingTester);