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 {