diff --git a/src/utils/autoplay-audio-context-fix.js b/src/utils/autoplay-audio-context-fix.js new file mode 100644 index 0000000000000000000000000000000000000000..9a332d423ad7b6d4b0bc1177e7f3b436c3c783c1 --- /dev/null +++ b/src/utils/autoplay-audio-context-fix.js @@ -0,0 +1,25 @@ +/** + * Mobile Safari and Chrome will start Audio contexts in a "suspended" state. + * A user interaction (touch event) is needed in order to resume the AudioContext. + */ +const iDevices = /\biPhone.*Mobile|\biPod|\biPad|AppleCoreMedia/; + +if (iDevices.test(navigator.userAgent) || /Chrome/.test(navigator.userAgent)) { + document.addEventListener("DOMContentLoaded", () => { + const ctx = THREE.AudioContext.getContext(); + + function resume() { + ctx.resume(); + + setTimeout(function() { + if (ctx.state === "running") { + document.body.removeEventListener("touchend", resume, false); + document.body.removeEventListener("mouseup", resume, false); + } + }, 0); + } + + document.body.addEventListener("touchend", resume, false); + document.body.addEventListener("mouseup", resume, false); + }); +}