Estou usando o HTML5 para programar jogos; o obstáculo que encontrei agora é como tocar efeitos sonoros.
Os requisitos específicos são poucos em número:
- Toque e misture vários sons,
- Reproduza a mesma amostra várias vezes, possivelmente sobreposições,
- Interrompa a reprodução de uma amostra a qualquer momento,
- De preferência, reproduza arquivos WAV contendo PCM bruto (de baixa qualidade), mas é possível convertê-los, é claro.
Minha primeira abordagem foi usar o <audio>
elemento HTML5 e definir todos os efeitos sonoros na minha página. O Firefox reproduz os arquivos WAV de maneira pêssego, mas chamar #play
várias vezes não reproduz a amostra várias vezes. Pelo meu entendimento da especificação HTML5, o <audio>
elemento também rastreia o estado de reprodução, o que explica o porquê.
Meu pensamento imediato foi clonar os elementos de áudio, então criei a seguinte pequena biblioteca JavaScript para fazer isso por mim (depende do 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;
};
});
}
};
Então agora eu posso fazer Snd.boom();
no console Firebug e jogar snd/boom.wav
, mas ainda não consigo reproduzir o mesmo exemplo várias vezes. Parece que o<audio>
elemento é realmente mais um recurso de streaming do que algo para reproduzir efeitos sonoros.
Existe uma maneira inteligente de fazer isso acontecer que eu estou perdendo, de preferência usando apenas HTML5 e JavaScript?
Devo também mencionar que, meu ambiente de teste é o Firefox 3.5 no Ubuntu 9.10. Os outros navegadores que experimentei - Opera, Midori, Chromium, Epiphany - produziram resultados variados. Alguns não jogam nada e outros lançam exceções.