exl100

Émulateur Exelvision EXL 100 (1984) dans le navigateur : dsp-cpp en WebAssembly, cartouches et cassettes BASIC
git clone https://git.schurger.org/exl100.git
Log | Files | Refs | README

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:
Mweb/shell.html.in | 15+++++++++++++++
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); },