From 0d62f745ca7c0254cd508bfe9118a62549a489b3 Mon Sep 17 00:00:00 2001 From: Brandon McGinty Date: Mon, 24 Aug 2026 12:32:30 -0400 Subject: [PATCH] reuse the stereo Opus encoder across connections Every connect built a fresh stereo encoder for file playback. Each one holds a little under a megabyte of encoder state, so on a flaky link that is close to a megabyte of churn per reconnect for no benefit; the encoder is already reset when file playback ends. Co-Authored-By: Claude Opus 5 --- barnard.go | 4 ++++ client.go | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/barnard.go b/barnard.go index 5b2d71f..4f1e303 100644 --- a/barnard.go +++ b/barnard.go @@ -70,6 +70,10 @@ type Barnard struct { // Added for file playback FileStream *fileplayback.Player FileStreamMutex sync.Mutex + // stereoEncoder is reused across connections. Each one holds a little + // under a megabyte of encoder state, so building a fresh one per + // reconnect is pure churn; it is reset when file playback ends. + stereoEncoder gumble.AudioEncoder // Added for tone test mode (bypasses all soundcard/OpenAL) ToneTest bool diff --git a/client.go b/client.go index 6eaf93d..66d4a8a 100644 --- a/client.go +++ b/client.go @@ -108,8 +108,12 @@ func (b *Barnard) connect(reconnect bool) bool { } }) - // Initialize stereo encoder for file playback - b.Client.SetStereoEncoder(opus.NewStereoEncoder()) + // Initialize stereo encoder for file playback, reusing the one built for + // the previous connection rather than allocating another. + if b.stereoEncoder == nil { + b.stereoEncoder = opus.NewStereoEncoder() + } + b.Client.SetStereoEncoder(b.stereoEncoder) // Initialize file player b.FileStreamMutex.Lock()