From 072b62b6edf6864fd75a1f8d721577350b32c58f 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 fc6f5c61..a177e42c 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 2c64c918..1a751122 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 388d59d8..a84595d5 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 c8123dc2..538fdcd9 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