Я использую HTML5 для программирования игр; препятствие, с которым я столкнулся сейчас, состоит в том, как играть звуковые эффекты.
Конкретные требования немногочисленны:
- Играть и смешивать несколько звуков,
- Проиграть один и тот же семпл несколько раз, возможно, с перекрывающимся воспроизведением,
- Прервать воспроизведение сэмпла в любой точке,
- Предпочтительно воспроизводить файлы WAV, содержащие (низкокачественные) необработанные PCM, но я, конечно, могу их конвертировать.
Моим первым подходом было использование <audio>
элемента HTML5 и определение всех звуковых эффектов на моей странице. 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 - дали разные результаты. Некоторые ничего не играют, а некоторые бросают исключения.