Annuaire › Code ouvert
Code publié par son auteur, en lecture seule. « Copier dans mon espace » crée un nouveau site à vous (non publié) que vous pouvez modifier librement.
js/sons.js · 2.6 Ko
/* ============================================================
Fichier : js/sons.js
Rôle : jouer les effets sonores (clic, bonne réponse, erreur…).
Dépend de : les fichiers .wav du dossier medias/ (issus de la
médiathèque libre de droits du Portail).
Expose : l'objet global « Sons » avec jouer(), activer(), estActif().
Utilisé par : js/main.js.
------------------------------------------------------------
PIÈGE : AUTOPLAY. Les navigateurs interdisent de jouer un son tant
que l'utilisateur n'a pas interagi avec la page (clic, touche…).
Ici, le premier son est déclenché par le clic sur « Commencer » :
c'est donc autorisé. Si le navigateur refuse malgré tout, play()
renvoie une promesse rejetée : on l'attrape pour ne pas afficher
d'erreur. Un quiz doit rester jouable SANS son.
============================================================ */
const Sons = (function () {
/** Nom logique du son -> chemin RELATIF du fichier. */
const FICHIERS = {
clic: "medias/clic.wav",
pop: "medias/pop.wav",
succes: "medias/succes.wav",
erreur: "medias/erreur.wav",
victoire: "medias/victoire.wav"
};
/** Objets Audio déjà créés (on ne les crée qu'une fois : « cache »). */
const cache = {};
/** Les sons sont-ils activés ? (case à cocher de l'en-tête) */
let actif = true;
/**
* Active ou coupe tous les sons.
* @param {boolean} valeur - true pour activer, false pour couper
* @returns {void}
*/
function activer(valeur) {
actif = Boolean(valeur);
}
/**
* Indique si les sons sont activés.
* @returns {boolean} true si activés
*/
function estActif() {
return actif;
}
/**
* Joue un son à partir de son nom logique.
* @param {string} nom - "clic", "pop", "succes", "erreur" ou "victoire"
* @returns {void}
*/
function jouer(nom) {
if (!actif || !FICHIERS[nom]) { return; } // son coupé ou nom inconnu : on ne fait rien
try {
if (!cache[nom]) {
cache[nom] = new Audio(FICHIERS[nom]); // charge le fichier au premier usage
}
const audio = cache[nom];
audio.currentTime = 0; // revient au début, pour pouvoir rejouer le son aussitôt
const promesse = audio.play();
// play() renvoie une promesse dans les navigateurs récents ; on ignore un éventuel refus
if (promesse && typeof promesse.catch === "function") {
promesse.catch(function () { /* son refusé : tant pis */ });
}
} catch (erreur) {
// Audio indisponible : on continue sans son.
}
}
return { jouer: jouer, activer: activer, estActif: estActif };
})();