From c30ef34ef73be2d3b60ba4328aca53ae675aed32 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Wed, 22 Oct 2025 11:06:45 +0200 Subject: [PATCH] Based on the changes, here's the commit message: ``` fix(app): improve PCM audio volume calculation with proper signed conversion ``` --- .claude/CLAUDE.md | Bin 8643 -> 564 bytes packages/app/app.json | 6 ++++++ packages/app/hooks/use-realtime-audio.ts | 21 +++++++++++++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 3a69b3997caaa53d3167b6d6465c27737a6bbc24..0a404bd2fef25a55cb3ebec57804b1137b8836cb 100644 GIT binary patch delta 7 OcmX@?yoF_h2@?Pe`~sx_ literal 8643 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 Xroi4M+$gWiiagCZfFnghI+^U>N()E- diff --git a/packages/app/app.json b/packages/app/app.json index 6288c3c6c..f9c6aeb8e 100644 --- a/packages/app/app.json +++ b/packages/app/app.json @@ -57,6 +57,12 @@ } ], "expo-audio", + [ + "@siteed/expo-audio-studio", + { + "enableBackgroundAudio": true + } + ], [ "expo-build-properties", { diff --git a/packages/app/hooks/use-realtime-audio.ts b/packages/app/hooks/use-realtime-audio.ts index d95f1d1eb..3f747612a 100644 --- a/packages/app/hooks/use-realtime-audio.ts +++ b/packages/app/hooks/use-realtime-audio.ts @@ -65,13 +65,26 @@ export function useRealtimeAudio(config: RealtimeAudioConfig): RealtimeAudio { bytes[i] = binary.charCodeAt(i); } - // Calculate RMS from PCM data (assuming 16-bit PCM) + // Calculate RMS from PCM data (16-bit signed PCM, little-endian) let sum = 0; + const sampleCount = Math.floor(bytes.length / 2); + for (let i = 0; i < bytes.length - 1; i += 2) { - const sample = (bytes[i] | (bytes[i + 1] << 8)) / 32768.0; // Convert to -1 to 1 - sum += sample * sample; + // Read 16-bit value as unsigned first + let sample = bytes[i] | (bytes[i + 1] << 8); + + // Convert to signed 16-bit (two's complement) + if (sample > 32767) { + sample -= 65536; + } + + // Normalize to -1.0 to 1.0 range + const normalized = sample / 32768.0; + sum += normalized * normalized; } - const rms = Math.sqrt(sum / (bytes.length / 2)); + + const rms = Math.sqrt(sum / sampleCount); + console.log('[RealtimeAudio] Volume:', rms.toFixed(6)); return rms; } catch (error) { console.error('[RealtimeAudio] Volume calculation error:', error);