audio: Bug fix: Do not create players every call of IsReady

Close #1709
This commit is contained in:
Hajime Hoshi 2021-07-10 19:21:27 +09:00
parent 6d0ffeb7d8
commit 4b7064ac58

View File

@ -71,6 +71,7 @@ type Context struct {
sampleRate int sampleRate int
err error err error
ready bool ready bool
readyOnce sync.Once
players map[playerImpl]struct{} players map[playerImpl]struct{}
@ -255,7 +256,9 @@ func (c *Context) IsReady() bool {
return r return r
} }
c.readyOnce.Do(func() {
// Create another goroutine since (*Player).Play can lock the context's mutex. // Create another goroutine since (*Player).Play can lock the context's mutex.
// TODO: Is this needed for reader players?
go func() { go func() {
// The audio context is never ready unless there is a player. This is // The audio context is never ready unless there is a player. This is
// problematic when a user tries to play audio after the context is ready. // problematic when a user tries to play audio after the context is ready.
@ -264,6 +267,7 @@ func (c *Context) IsReady() bool {
p := NewPlayerFromBytes(c, make([]byte, bufferSize()*2)) p := NewPlayerFromBytes(c, make([]byte, bufferSize()*2))
p.Play() p.Play()
}() }()
})
return r return r
} }