Skip to content

Instantly share code, notes, and snippets.

@ken107
Last active February 25, 2024 16:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ken107/409bfb0cc8d19bc3baef8dca021a7417 to your computer and use it in GitHub Desktop.
Save ken107/409bfb0cc8d19bc3baef8dca021a7417 to your computer and use it in GitHub Desktop.
function makeAudioPlayer(audio) {
audio.oncanplay = () => sm.trigger("onCanPlay")
audio.onerror = () => sm.trigger("onError", new Error(audio.error.message || audio.error.code))
audio.onended = () => sm.trigger("onEnd")
const sm = new StateMachine({
IDLE: {
load(url) {
audio.src = url
return "LOADING_PAUSED"
},
pause() {
},
},
LOADING_PAUSED: {
onCanPlay() {
return "PAUSED"
},
onError(err) {
return "IDLE"
},
load(url) {
audio.src = url
},
play() {
return "LOADING_PLAY"
},
pause() {
},
},
LOADING_PLAY: {
onCanPlay() {
audio.play()
.catch(err => sm.trigger("onError", err instanceof DOMException ? new Error(err.name || err.message) : err))
return "PLAYING"
},
onError(err) {
return "IDLE"
},
load(url) {
audio.src = url
},
play() {
},
pause() {
return "LOADING_PAUSED"
},
},
PAUSED: {
load(url) {
audio.src = url
return "LOADING_PAUSED"
},
play() {
audio.play()
.catch(err => sm.trigger("onError", err instanceof DOMException ? new Error(err.name || err.message) : err))
return "PLAYING"
},
pause() {
},
},
PLAYING: {
onEnd() {
return "PAUSED"
},
onError(err) {
return "IDLE"
},
load(url) {
audio.src = url
return "LOADING_PLAY"
},
play() {
},
pause() {
audio.pause()
return "PAUSED"
},
},
})
return {
load(url) {
sm.trigger("load", url)
},
play() {
sm.trigger("play")
},
loadAndPlay(url) {
sm.trigger("load", url)
sm.trigger("play")
},
pause() {
sm.trigger("pause")
},
resume() {
sm.trigger("play")
},
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment