const WORKLET_CODE_STRING: "\n class PCMProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this.inputSampleRate = 16000;\n this.outputSampleRate = 16000;\n this.emitRawAudio = false;\n this.calculateAudioMetrics = false;\n this.buffer = new Float32Array(0);\n this.noiseFloorDb = -80.0;\n\n this.port.onmessage = (e) => {\n if (e.data.type === 'config') {\n this.inputSampleRate = e.data.config.inputSampleRate;\n this.outputSampleRate = e.data.config.outputSampleRate;\n this.emitRawAudio = e.data.config.emitRawAudio;\n this.calculateAudioMetrics = e.data.config.calculateAudioMetrics;\n }\n };\n }\n\n calculateMetrics(channelData) {\n let sumSquares = 0;\n let peak = 0;\n let clippingSamples = 0;\n const len = channelData.length;\n const clipThreshold = 0.98;\n\n for (let i = 0; i < len; i++) {\n const val = channelData[i];\n const absVal = Math.abs(val);\n sumSquares += val * val;\n if (absVal > peak) {\n peak = absVal;\n }\n if (absVal >= clipThreshold) {\n clippingSamples++;\n }\n }\n\n const rms = Math.sqrt(sumSquares / (len || 1));\n const volume = Math.min(1.0, rms);\n const volumeDb = volume > 0.0001 ? 20 * Math.log10(volume) : -100;\n const isClipping = clippingSamples > 0;\n\n const elapsedSec = len / this.inputSampleRate;\n if (volumeDb < this.noiseFloorDb) {\n this.noiseFloorDb = volumeDb;\n } else {\n this.noiseFloorDb = Math.min(-30, this.noiseFloorDb + (1.0 * elapsedSec));\n }\n\n const snrDb = Math.max(0, Math.round(volumeDb - this.noiseFloorDb));\n\n let status = 'normal';\n if (volume < 0.01) {\n status = 'silent';\n } else if (isClipping) {\n status = 'clipping';\n }\n\n return {\n volume,\n volumeDb: Math.round(volumeDb),\n peak,\n isClipping,\n status,\n noiseFloorDb: Math.round(this.noiseFloorDb),\n snrDb\n };\n }\n\n process(inputs, outputs, parameters) {\n const input = inputs[0];\n if (input && input.length > 0) {\n const inputChannel = input[0];\n \n const metrics = this.calculateAudioMetrics ? this.calculateMetrics(inputChannel) : undefined;\n\n // Emit Raw Audio if requested (for visualization)\n if (this.emitRawAudio) {\n this.port.postMessage({ type: 'raw', buffer: inputChannel });\n }\n\n // 1. If rates match, fast path\n if (this.inputSampleRate === this.outputSampleRate) {\n const int16Data = new Int16Array(inputChannel.length);\n for (let i = 0; i < inputChannel.length; i++) {\n const s = Math.max(-1, Math.min(1, inputChannel[i]));\n int16Data[i] = s < 0 ? s * 0x8000 : s * 0x7FFF;\n }\n this.port.postMessage({ type: 'pcm', buffer: int16Data, metrics });\n return true;\n }\n\n // 2. Resampling path\n const newBuffer = new Float32Array(this.buffer.length + inputChannel.length);\n newBuffer.set(this.buffer);\n newBuffer.set(inputChannel, this.buffer.length);\n this.buffer = newBuffer;\n\n const ratio = this.inputSampleRate / this.outputSampleRate;\n const outputSamples = Math.floor((this.buffer.length - 1) / ratio);\n \n if (outputSamples > 0) {\n const int16Data = new Int16Array(outputSamples);\n for (let i = 0; i < outputSamples; i++) {\n const offset = i * ratio;\n const idxFloor = Math.floor(offset);\n const fraction = offset - idxFloor;\n \n const s0 = this.buffer[idxFloor];\n const s1 = this.buffer[idxFloor + 1] || s0;\n \n const sample = s0 + (s1 - s0) * fraction;\n const s = Math.max(-1, Math.min(1, sample));\n int16Data[i] = s < 0 ? s * 0x8000 : s * 0x7FFF;\n }\n \n this.port.postMessage({ type: 'pcm', buffer: int16Data, metrics });\n const consumedCount = Math.floor(outputSamples * ratio);\n this.buffer = this.buffer.slice(consumedCount);\n }\n }\n return true;\n }\n }\n\n registerProcessor(\"pcm-processor\", PCMProcessor);\n ";