diff --git a/bun.lockb b/bun.lockb index 2026279..0fed084 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 33757fc..7c2e09a 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "express": "^5.2.1", "fluent-ffmpeg": "^2.1.3", "helmet": "^8.1.0", + "howler": "^2.2.4", "libsodium-wrappers": "^0.8.2", "p-retry": "^6.2.0", "pino": "^9.4.0", @@ -33,7 +34,6 @@ "react": "^19.2.6", "react-dom": "^19.2.6", "sodium-native": "^4.3.2", - "tone": "^15.1.22", "ws": "^8.20.1", "zod": "^4.4.3" }, diff --git a/public/dashboard.js b/public/dashboard.js index 557c709..e7af920 100644 --- a/public/dashboard.js +++ b/public/dashboard.js @@ -11,9 +11,6 @@ const state = { processor: null, nextStartTime: 0, noiseGateHold: 0, - opusDecoder: null, - opusDecoderReady: false, - opusDecodeQueue: [], }; const SAMPLE_RATE = 24000; @@ -165,19 +162,7 @@ const state = { handleJsonEvent(event.data); return; } - if (!state.isListening) return; - const bytes = new Uint8Array(event.data); - if (bytes.byteLength < 5) { - playPcm(event.data); - return; - } - const mode = bytes[0]; - if (mode === 1) { - const opusData = bytes.slice(5); - decodeOpus(opusData); - } else { - playPcm(event.data); - } + if (state.isListening) playPcm(event.data); }; } diff --git a/src/recorder.ts b/src/recorder.ts index 68aa0d0..8c9b0ef 100644 --- a/src/recorder.ts +++ b/src/recorder.ts @@ -176,7 +176,6 @@ export async function startRecording( onPacket: (chunk) => { if (chunk.length < 8) return; segmentManager.rotateIfNeeded(oggPacketStream); - broadcaster.broadcastOpusToWeb?.(chunk, userId); if (!broadcaster.broadcastPcmToWeb) return; decoder.rotateIfNeeded(); decoder.write(chunk); diff --git a/src/types.ts b/src/types.ts index 0358ad2..4c8ff95 100644 --- a/src/types.ts +++ b/src/types.ts @@ -42,7 +42,6 @@ export interface SegmentMetadata extends UserMetadata { export interface PcmBroadcaster { broadcastPcmToWeb?: (chunk: Buffer, userId: string) => void; - broadcastOpusToWeb?: (chunk: Buffer, userId: string) => void; updateActiveUser?: ( userId: string, data: { username: string; avatar: string; speaking: boolean }, diff --git a/src/webserver.ts b/src/webserver.ts index 47fd47d..821623e 100644 --- a/src/webserver.ts +++ b/src/webserver.ts @@ -238,22 +238,6 @@ export function startWebserver( }); }; - // Inbound: Discord Opus → tagged chunks → browser (WebCodecs decode) - (global as any).broadcastOpusToWeb = (chunk: Buffer, userId: string) => { - let hash = 0; - for (let i = 0; i < userId.length; i++) { - hash = (hash << 5) - hash + userId.charCodeAt(i); - hash |= 0; - } - const header = Buffer.alloc(5); - header.writeUInt8(1, 0); // mode: 1 = Opus - header.writeInt32LE(hash, 1); - const packet = Buffer.concat([header, chunk]); - wsClients.forEach((client) => { - if (client.readyState === 1) client.send(packet); - }); - }; - (global as any).updateActiveUser = ( userId: string, data: { username: string; avatar: string; speaking: boolean },