From 58193fbfaa2857cb67bdf62904d15c6fced9d08c Mon Sep 17 00:00:00 2001 From: Denver Quane Date: Sat, 12 Aug 2023 21:16:34 -0600 Subject: [PATCH] fix(voice): session id deadlock on open (#1408) * Unlock when checking voice connection sessionID to prevent deadlock * Move lock to preserve concurrency safety, while allowing the sessionID to be populated * style: formatting Fix formatting of the documentation comment for VoiceConnection.Speaking function * feat: reword explanatory comment --------- Co-authored-by: Fedor Lapshin --- voice.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/voice.go b/voice.go index 79ce18e..e9c89be 100644 --- a/voice.go +++ b/voice.go @@ -76,7 +76,7 @@ type VoiceSpeakingUpdateHandler func(vc *VoiceConnection, vs *VoiceSpeakingUpdat // Speaking sends a speaking notification to Discord over the voice websocket. // This must be sent as true prior to sending audio and should be set to false // once finished sending audio. -// b : Send true if speaking, false if not. +// b : Send true if speaking, false if not. func (v *VoiceConnection) Speaking(b bool) (err error) { v.log(LogDebug, "called (%t)", b) @@ -294,11 +294,15 @@ func (v *VoiceConnection) open() (err error) { if v.sessionID != "" { break } + if i > 20 { // only loop for up to 1 second total return fmt.Errorf("did not receive voice Session ID in time") } + // Release the lock, so sessionID can be populated upon receiving a VoiceStateUpdate event. + v.Unlock() time.Sleep(50 * time.Millisecond) i++ + v.Lock() } // Connect to VoiceConnection Websocket