Звуковые эффекты в JavaScript / HTML5

Я использую HTML5 для программирования игр; препятствие, с которым я столкнулся сейчас, заключается в том, как играть звуковые эффекты.

Конкретные требования немногочисленны:

Играть и смешивать несколько звуков,Проиграть один и тот же семпл несколько раз, возможно, с перекрывающимся воспроизведением,Прервать воспроизведение сэмпла в любой точке,Предпочтительно воспроизводить файлы WAV, содержащие (низкокачественные) необработанные PCM, но я, конечно, могу их конвертировать.

Мой первый подход состоял в том, чтобы использовать HTML5<audio> элемент и определить все звуковые эффекты на моей странице. Firefox проигрывает файлы WAV просто замечательно, но звонит#play несколько раз на самом деле не воспроизводит семпл несколько раз. Из моего понимания спецификации HTML5,<audio> Элемент также отслеживает состояние воспроизведения, поэтому это объясняет, почему.

Моей непосредственной мыслью было клонирование аудио элементов, поэтому я создал для этого следующую крошечную библиотеку JavaScript (зависит от 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;
      };
    });
  }
};

Так что теперь я могу сделатьSnd.boom(); из консоли Firebug и играйтеsnd/boom.wav, но я все еще не могу воспроизвести один и тот же семпл несколько раз. Кажется, что<audio> element - это скорее функция потоковой передачи, а не то, с чем можно играть звуковыми эффектами.

Есть ли какой-нибудь умный способ заставить это случиться, что я пропускаю, предпочтительно используя только HTML5 и JavaScript?

Я должен также упомянуть, что моей тестовой средой является Firefox 3.5 на Ubuntu 9.10. Другие браузеры, которые я пробовал - Opera, Midori, Chromium, Epiphany - дали разные результаты. Некоторые ничего не играют, а некоторые бросают исключения.

Ответы на вопрос(16)

Ваш ответ на вопрос