- Cargo workspace with 6 domain crates: core, audio, transcription, ai-formatting, storage, cloud-providers - Minimal Tauri shell (lib.rs + main.rs) with plugin registration - Svelte 5 frontend copied from Ramble v0.2 - All crates compile as empty stubs - App identifier: uk.co.corbel.kon Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
44 lines
1.1 KiB
JavaScript
44 lines
1.1 KiB
JavaScript
class PcmProcessor extends AudioWorkletProcessor {
|
|
constructor() {
|
|
super();
|
|
this.buffer = [];
|
|
// sampleRate is a global in AudioWorkletProcessor scope
|
|
this.ratio = sampleRate / 16000;
|
|
this.needsResample = Math.abs(this.ratio - 1.0) > 0.01;
|
|
this.resamplePos = 0;
|
|
}
|
|
|
|
process(inputs) {
|
|
const input = inputs[0];
|
|
if (!input || input.length === 0) return true;
|
|
|
|
const samples = input[0]; // First channel (mono)
|
|
if (!samples) return true;
|
|
|
|
if (this.needsResample) {
|
|
// Simple downsampling to 16kHz
|
|
for (let i = 0; i < samples.length; i++) {
|
|
this.resamplePos += 1;
|
|
if (this.resamplePos >= this.ratio) {
|
|
this.buffer.push(samples[i]);
|
|
this.resamplePos -= this.ratio;
|
|
}
|
|
}
|
|
} else {
|
|
for (let i = 0; i < samples.length; i++) {
|
|
this.buffer.push(samples[i]);
|
|
}
|
|
}
|
|
|
|
// Send every ~0.5 seconds at 16kHz = 8000 samples
|
|
if (this.buffer.length >= 8000) {
|
|
this.port.postMessage({ type: "pcm", samples: this.buffer });
|
|
this.buffer = [];
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
registerProcessor("pcm-processor", PcmProcessor);
|