Я использую HTML5 для программирования игр; препятствие, с которым я столкнулся сейчас, - это как воспроизвести звуковые эффекты.
Конкретные требования немногочисленны:
- Воспроизведение и смешивание нескольких звуков,
- Воспроизведение одного и того же образца несколько раз, возможно перекрытие воспроизведения,
- Прерывание воспроизведения образца в любой точке,
- Желательно воспроизводить файлы WAV, содержащие (низкокачественные) raw 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> - это скорее больше потоковая функция, чем нечто, для воспроизведения звуковых эффектов.
Есть ли умный способ сделать это, что я пропал без вести, желательно используя только HTML5 и JavaScript?
Я также должен отметить, что моя тестовая среда - Firefox 3.5 на Ubuntu 9.10. Другие браузеры, которые я пробовал - Opera, Midori, Chromium, Epiphany - произвели разные результаты. Некоторые не играют ничего, а некоторые бросают исключения.
