Skip to content

Commit 03f5f70

Browse files
committed
oto: ensure resuming on browsers
AudioContext.resume might fail in theory. This change addresses the issue where resuming fails by ensuring the promise result. Updates hajimehoshi/ebiten#3122
1 parent c2a8efc commit 03f5f70

File tree

1 file changed

+24
-21
lines changed

1 file changed

+24
-21
lines changed

driver_js.go

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ type context struct {
2929
scriptProcessor js.Value
3030
scriptProcessorCallback js.Func
3131
ready bool
32-
callbacks map[string]js.Func
3332

3433
mux *mux.Mux
3534
}
@@ -165,28 +164,32 @@ registerProcessor('oto-worklet-processor', OtoWorkletProcessor);
165164
sp.Call("connect", d.audioContext.Get("destination"))
166165
}
167166

168-
setCallback := func(event string) js.Func {
169-
var f js.Func
170-
f = js.FuncOf(func(this js.Value, arguments []js.Value) any {
171-
if !d.ready {
172-
d.audioContext.Call("resume")
173-
d.ready = true
174-
close(ready)
175-
}
176-
js.Global().Get("document").Call("removeEventListener", event, f)
177-
return nil
178-
})
179-
js.Global().Get("document").Call("addEventListener", event, f)
180-
d.callbacks[event] = f
181-
return f
182-
}
183-
184167
// Browsers require user interaction to start the audio.
185168
// https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio
186-
d.callbacks = map[string]js.Func{}
187-
setCallback("touchend")
188-
setCallback("keyup")
189-
setCallback("mouseup")
169+
170+
events := []string{"touchend", "keyup", "mouseup"}
171+
172+
var onEventFired js.Func
173+
var onResumeSuccess js.Func
174+
onResumeSuccess = js.FuncOf(func(this js.Value, arguments []js.Value) any {
175+
d.ready = true
176+
close(ready)
177+
for _, event := range events {
178+
js.Global().Get("document").Call("removeEventListener", event, onEventFired)
179+
}
180+
onEventFired.Release()
181+
onResumeSuccess.Release()
182+
return nil
183+
})
184+
onEventFired = js.FuncOf(func(this js.Value, arguments []js.Value) any {
185+
if !d.ready {
186+
d.audioContext.Call("resume").Call("then", onResumeSuccess)
187+
}
188+
return nil
189+
})
190+
for _, event := range events {
191+
js.Global().Get("document").Call("addEventListener", event, onEventFired)
192+
}
190193

191194
return d, ready, nil
192195
}

0 commit comments

Comments
 (0)