Я использую 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 - произвели разные результаты. Некоторые не играют ничего, а некоторые бросают исключения.