From 42861dfcd54f4686d91897f7472979fa16084dac Mon Sep 17 00:00:00 2001 From: "Brandon McGinty (chatgpt)" Date: Mon, 10 Aug 2026 04:01:42 -0400 Subject: [PATCH] Close audio streams when listeners detach --- gumble/gumble/audiolisteners.go | 4 ++++ gumble/gumble/listeners_regression_test.go | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/gumble/gumble/audiolisteners.go b/gumble/gumble/audiolisteners.go index e39fd1c..e56a4ea 100644 --- a/gumble/gumble/audiolisteners.go +++ b/gumble/gumble/audiolisteners.go @@ -17,6 +17,10 @@ func (e *audioEventItem) Detach() { return } e.detached = true + for user, stream := range e.streams { + close(stream) + delete(e.streams, user) + } if e.prev == nil { e.parent.head = e.next } else { diff --git a/gumble/gumble/listeners_regression_test.go b/gumble/gumble/listeners_regression_test.go index 72e2e32..c26a024 100644 --- a/gumble/gumble/listeners_regression_test.go +++ b/gumble/gumble/listeners_regression_test.go @@ -28,8 +28,13 @@ func TestListenerDetachIsIdempotentAndConcurrent(t *testing.T) { func TestAudioListenerDetachIsIdempotent(t *testing.T) { var listeners AudioListeners item := listeners.Attach(nil) + stream := make(chan *AudioPacket) + item.(*audioEventItem).streams[&User{}] = stream item.Detach() item.Detach() + if _, open := <-stream; open { + t.Fatal("detached audio listener stream remained open") + } listeners.mu.Lock() defer listeners.mu.Unlock() if listeners.head != nil || listeners.tail != nil {