diff --git a/src/workspaces/officerdev/src/MusicPlayer/MusicPlayerHost.tsx b/src/workspaces/officerdev/src/MusicPlayer/MusicPlayerHost.tsx index 461b1d2e..ec99306f 100644 --- a/src/workspaces/officerdev/src/MusicPlayer/MusicPlayerHost.tsx +++ b/src/workspaces/officerdev/src/MusicPlayer/MusicPlayerHost.tsx @@ -106,9 +106,11 @@ export const MusicPlayerHost = () => { }); engineRef.current = engine; engine.setVolume(muted ? 0 : volume); - // Resume the AudioContext on the first user gesture (browser autoplay policy). + // Satisfy the browser autoplay policy ONCE, on the first user gesture — after that, sticky activation + // lets engine.play() resume the context on its own. It MUST be once-only: a persistent listener would + // resume the context on every click, overriding a deliberate pause (pause = ctx.suspend()). const unlock = () => engine.unlock(); - document.addEventListener('pointerdown', unlock); + document.addEventListener('pointerdown', unlock, { once: true }); return () => { document.removeEventListener('pointerdown', unlock); engine.destroy();