commit a9715c897c365d30ddbf00e347da04e81100618f
parent 3da5302ad38c51745e3a88f83f8ef4b3560d5ed5
Author: Jean Schurger <jean@schurger.org>
Date: Wed, 4 Nov 2026 19:34:06 -0500
Son : débloquer le contexte audio au premier geste (autoplay)
Le contexte Web Audio ouvert par SDL démarre « suspended » (politique d'autoplay
des navigateurs) : sans reprise, aucun son ne sort (parole, Exeldrums…). On le
reprend à chaque geste réel (clic/touche) tant qu'il est suspendu, via des
écouteurs persistants (le contexte peut n'exister qu'après le démarrage d'un
programme). Vérifié : l'émulateur produisait bien le son (pics ~18000/32767 sur
les coups de batterie), seul le contexte restait suspendu → passe à « running ».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QyJB9yqUAYm3wRQi4uytj9
Diffstat:
1 file changed, 15 insertions(+), 0 deletions(-)
diff --git a/web/shell.html.in b/web/shell.html.in
@@ -474,6 +474,21 @@
: location.pathname;
};
+ // Déblocage du son : le contexte Web Audio ouvert par SDL démarre « suspended » (politique
+ // d'autoplay des navigateurs) ; sans geste utilisateur, aucun son ne sort (parole, Exeldrums…).
+ // On le reprend à chaque geste réel (clic/touche), tant qu'il est suspendu — le contexte peut
+ // n'exister qu'après le démarrage d'un programme, d'où des écouteurs persistants.
+ function resumeAudio() {
+ try {
+ const sdl = window.Module && window.Module.SDL2;
+ const c = sdl && sdl.audioContext;
+ if (c && c.state === 'suspended') c.resume().catch(() => {});
+ } catch (e) { /* pas prêt */ }
+ }
+ for (const ev of ['pointerdown', 'mousedown', 'touchstart', 'keydown', 'click']) {
+ document.addEventListener(ev, resumeAudio, { capture: true, passive: true });
+ }
+
const Module = window.Module = {
canvas: canvas,
print: (text) => { console.log(text); log(text); },