diff --git a/@packages/companion-client/src/voice/binary-protocol.ts b/@packages/companion-client/src/voice/binary-protocol.ts index 117c055..9d957d0 100644 --- a/@packages/companion-client/src/voice/binary-protocol.ts +++ b/@packages/companion-client/src/voice/binary-protocol.ts @@ -17,8 +17,11 @@ export function encodeUpstreamFrame(frame: AudioUpstreamFrame): ArrayBuffer { view.setUint8(0, UPSTREAM_FRAME_TYPE); view.setUint32(1, frame.seq, false); // big-endian - const dst = new Int16Array(buffer, UPSTREAM_HEADER_BYTES); - dst.set(frame.pcm); + // Int16Array requires 2-byte-aligned offsets; UPSTREAM_HEADER_BYTES=5 is odd. + // Copy PCM bytes via Uint8Array instead. + new Uint8Array(buffer, UPSTREAM_HEADER_BYTES).set( + new Uint8Array(frame.pcm.buffer, frame.pcm.byteOffset, frame.pcm.byteLength), + ); return buffer; } diff --git a/@packages/companion-client/src/voice/voice-client.ts b/@packages/companion-client/src/voice/voice-client.ts index 223f51b..39624da 100644 --- a/@packages/companion-client/src/voice/voice-client.ts +++ b/@packages/companion-client/src/voice/voice-client.ts @@ -76,7 +76,8 @@ export class VoiceClient { const socket = io(`${baseUrl}/voice`, { query: { session_id: this.config.sessionId }, - transports: ['websocket'], + // Default transports: polling first (works through HTTP proxies like Vite), + // then upgrades to WebSocket automatically. reconnection: this.config.reconnect, reconnectionAttempts: this.config.maxReconnectAttempts, reconnectionDelay: this.config.reconnectDelay,