Sto usando HTML5 per programmare giochi; l'ostacolo che ho incontrato ora è come riprodurre effetti sonori.
I requisiti specifici sono pochi:
- Riproduci e mixa più suoni,
- Riproduci lo stesso campione più volte, possibilmente sovrapponendo le riproduzioni,
- Interrompere la riproduzione di un campione in qualsiasi momento,
- Preferibilmente riprodurre file WAV contenenti PCM non elaborati (di bassa qualità), ma ovviamente li posso convertire.
Il mio primo approccio è stato quello di utilizzare l' <audio>
elemento HTML5 e definire tutti gli effetti sonori nella mia pagina. Firefox riproduce i file WAV in modo semplice, ma chiamare #play
più volte non riproduce realmente il campione più volte. Dalla mia comprensione delle specifiche HTML5, l' <audio>
elemento traccia anche lo stato di riproduzione, quindi questo spiega perché.
Il mio pensiero immediato è stato quello di clonare gli elementi audio, quindi ho creato la seguente piccola libreria JavaScript per farlo (dipende da jQuery):
var Snd = {
init: function() {
$("audio").each(function() {
var src = this.getAttribute('src');
if (src.substring(0, 4) !== "snd/") { return; }
// Cut out the basename (strip directory and extension)
var name = src.substring(4, src.length - 4);
// Create the helper function, which clones the audio object and plays it
var Constructor = function() {};
Constructor.prototype = this;
Snd[name] = function() {
var clone = new Constructor();
clone.play();
// Return the cloned element, so the caller can interrupt the sound effect
return clone;
};
});
}
};
Quindi ora posso fare Snd.boom();
dalla console Firebug e giocare snd/boom.wav
, ma non riesco ancora a riprodurre lo stesso campione più volte. Sembra che l' <audio>
elemento sia più una funzionalità di streaming piuttosto che qualcosa con cui riprodurre effetti sonori.
C'è un modo intelligente per farlo accadere che mi manca, preferibilmente usando solo HTML5 e JavaScript?
Dovrei anche menzionarlo, il mio ambiente di test è Firefox 3.5 su Ubuntu 9.10. Gli altri browser che ho provato - Opera, Midori, Chromium, Epiphany - hanno prodotto risultati diversi. Alcuni non giocano nulla e alcuni generano eccezioni.