Efekty dźwiękowe w JavaScript / HTML5
Używam HTML5 do programowania gier; przeszkodą, na którą się teraz natknąłem, jest sposób odtwarzania efektów dźwiękowych.
Specyficzne wymagania są nieliczne:
Graj i miksuj wiele dźwięków,Zagraj w tę samą próbkę wiele razy, prawdopodobnie nakładające się na siebie,Przerwij odtwarzanie próbki w dowolnym punkcie,Najlepiej odtwarzać pliki WAV zawierające (niską jakość) surowego PCM, ale oczywiście mogę je konwertować.Moim pierwszym podejściem było użycie HTML5<audio>
element i zdefiniuj wszystkie efekty dźwiękowe na mojej stronie. Firefox odtwarza pliki WAV tylko peachy, ale wywołuje#play
wiele razy tak naprawdę nie odtwarza próbki wielokrotnie. Z mojego rozumienia specyfikacji HTML5<audio>
element śledzi również stan odtwarzania, co wyjaśnia dlaczego.
Moją pierwszą myślą było sklonowanie elementów audio, więc stworzyłem następującą malutką bibliotekę JavaScript, aby to zrobić dla mnie (w zależności od 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;
};
});
}
};
Więc teraz mogę to zrobićSnd.boom();
z konsoli Firebug i grajsnd/boom.wav
, ale wciąż nie mogę odtworzyć tej samej próbki wiele razy. Wydaje się, że<audio>
Element jest bardziej funkcją przesyłania strumieniowego, a nie czymś, z czym można odtwarzać efekty dźwiękowe.
Czy istnieje sprytny sposób, aby to się stało, że brakuje mi, najlepiej przy użyciu tylko HTML5 i JavaScript?
Powinienem również wspomnieć, że moim środowiskiem testowym jest Firefox 3.5 na Ubuntu 9.10. Inne przeglądarki, które próbowałem - Opera, Midori, Chromium, Epiphany - dawały różne wyniki. Niektórzy nie grają niczego, a niektóre rzucają wyjątki.