Skip to content

Commit

Permalink
fix(voice): session id deadlock on open (#1408)
Browse files Browse the repository at this point in the history
* 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 <fe.lap.prog@gmail.com>
  • Loading branch information
denverquane and FedorLap2006 committed Aug 13, 2023
1 parent 393091b commit 58193fb
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion voice.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 58193fb

Please sign in to comment.