From f9adb4382d9ae8c28732258142ae04bbf047be13 Mon Sep 17 00:00:00 2001 From: Alex P Date: Thu, 28 Aug 2025 00:35:51 +0000 Subject: [PATCH] feat(audio): add latency metrics collection for input and output Add granular metrics collection for audio processing latency in both input and output paths. This enables better performance monitoring through histograms. Also update build tags to include ARM platform and rename UI label for clarity. --- internal/audio/input.go | 12 ++++++++++++ internal/audio/output_ipc_manager.go | 10 ++++++++++ internal/audio/validation.go | 4 ++-- ui/src/components/AudioMetricsDashboard.tsx | 2 +- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/internal/audio/input.go b/internal/audio/input.go index fc6f5c6..a177e42 100644 --- a/internal/audio/input.go +++ b/internal/audio/input.go @@ -110,6 +110,12 @@ func (aim *AudioInputManager) WriteOpusFrame(frame []byte) error { atomic.AddInt64(&aim.framesSent, 1) aim.recordFrameProcessed(len(frame)) aim.updateLatency(processingTime) + + // Record latency to granular metrics collector for histogram + if granularCollector := GetGranularMetricsCollector(); granularCollector != nil { + granularCollector.RecordInputLatency(processingTime) + } + return nil } @@ -145,6 +151,12 @@ func (aim *AudioInputManager) WriteOpusFrameZeroCopy(frame *ZeroCopyAudioFrame) atomic.AddInt64(&aim.framesSent, 1) aim.recordFrameProcessed(frame.Length()) aim.updateLatency(processingTime) + + // Record latency to granular metrics collector for histogram + if granularCollector := GetGranularMetricsCollector(); granularCollector != nil { + granularCollector.RecordInputLatency(processingTime) + } + return nil } diff --git a/internal/audio/output_ipc_manager.go b/internal/audio/output_ipc_manager.go index 2c64c91..1a75112 100644 --- a/internal/audio/output_ipc_manager.go +++ b/internal/audio/output_ipc_manager.go @@ -103,6 +103,11 @@ func (aom *AudioOutputIPCManager) WriteOpusFrame(frame *ZeroCopyAudioFrame) erro aom.recordFrameProcessed(frame.Length()) aom.updateLatency(processingTime) + // Record latency to granular metrics collector for histogram + if granularCollector := GetGranularMetricsCollector(); granularCollector != nil { + granularCollector.RecordOutputLatency(processingTime) + } + return nil } @@ -132,6 +137,11 @@ func (aom *AudioOutputIPCManager) WriteOpusFrameZeroCopy(frame *ZeroCopyAudioFra aom.recordFrameProcessed(len(frameData)) aom.updateLatency(processingTime) + // Record latency to granular metrics collector for histogram + if granularCollector := GetGranularMetricsCollector(); granularCollector != nil { + granularCollector.RecordOutputLatency(processingTime) + } + return nil } diff --git a/internal/audio/validation.go b/internal/audio/validation.go index 388d59d..a84595d 100644 --- a/internal/audio/validation.go +++ b/internal/audio/validation.go @@ -1,5 +1,5 @@ -//go:build cgo -// +build cgo +//go:build cgo || arm +// +build cgo arm package audio diff --git a/ui/src/components/AudioMetricsDashboard.tsx b/ui/src/components/AudioMetricsDashboard.tsx index c8123dc..538fdcd 100644 --- a/ui/src/components/AudioMetricsDashboard.tsx +++ b/ui/src/components/AudioMetricsDashboard.tsx @@ -478,7 +478,7 @@ export default function AudioMetricsDashboard() {
- Microphone Input Config + Audio Input Config