/** * 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);