◆ Portail Antalaha

Annuaire › Code ouvert

Quiz Antalaha et Madagascar

tutorial · Voir le site ↗
Connectez-vous pour copier ce site

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 };
})();