WORKLET_CODE_STRING

Variable: WORKLET_CODE_STRING

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  ";