28 lines
936 B
JavaScript
28 lines
936 B
JavaScript
/**
|
|
* AudioWorkletProcessor для записи PCM-данных.
|
|
* Отправляет Float32Array-чанки на главный поток через port.
|
|
*/
|
|
class RecorderProcessor extends AudioWorkletProcessor {
|
|
constructor() {
|
|
super();
|
|
this._active = true;
|
|
this.port.onmessage = (e) => {
|
|
if (e.data === 'stop') this._active = false;
|
|
};
|
|
}
|
|
|
|
process(inputs) {
|
|
if (!this._active) return false; // выгружаем процессор
|
|
|
|
const input = inputs[0];
|
|
if (input && input.length > 0) {
|
|
// Копируем каналы — данные валидны только внутри process()
|
|
const channels = input.map(ch => new Float32Array(ch));
|
|
// Transferable — избегаем лишних копий
|
|
this.port.postMessage(channels, channels.map(c => c.buffer));
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
registerProcessor('recorder-processor', RecorderProcessor);
|