maze-ascension/web/restart-audio-context.js
2024-09-17 20:19:16 +03:00

58 lines
1.4 KiB
JavaScript

// taken from https://developer.chrome.com/blog/web-audio-autoplay/#moving-forward
(() => {
// An array of all contexts to resume on the page
const audioContextList = [];
// An array of various user interaction events we should listen for
const userInputEventNames = [
"click",
"contextmenu",
"auxclick",
"dblclick",
"mousedown",
"mouseup",
"pointerup",
"touchend",
"keydown",
"keyup",
];
// A proxy object to intercept AudioContexts and
// add them to the array for tracking and resuming later
self.AudioContext = new Proxy(self.AudioContext, {
construct(target, args) {
const result = new target(...args);
audioContextList.push(result);
return result;
},
});
// To resume all AudioContexts being tracked
function resumeAllContexts(_) {
let count = 0;
for (const context of audioContextList) {
if (context.state !== "running") {
context.resume();
} else {
count++;
}
}
// If all the AudioContexts have now resumed then we
// unbind all the event listeners from the page to prevent
// unnecessary resume attempts
if (count === audioContextList.length) {
for (const eventName of userInputEventNames) {
document.removeEventListener(eventName, resumeAllContexts);
}
}
}
// We bind the resume function for each user interaction
// event on the page
for (const eventName of userInputEventNames) {
document.addEventListener(eventName, resumeAllContexts);
}
})();