Мы пишем демонстрационную игру Real Time Strategy (RTS) для Canvas на HTML5 / JavaScript, и у нас все работает. Тем не менее, в Chrome (самая последняя версия) звук продолжает заикаться и, в конце концов, просто сдается. Код прекрасно работает в последних версиях Firefox, IE9 и Safari (хотя на iOS4 iPhone / iPad звук отсутствует, но, по всей видимости, это коммерческое решение Apple). Вы можете сами убедиться в том, что по приведенной ниже ссылке вы услышите несколько звуков одновременно, чтобы вызвать проблему.
http://www.enterprisewarfare.com/Play.aspx
Ниже приведен упрощенный код воспроизведения звука, обратите внимание, что каждый звук существует 4 раза (AUDIO_CHANELS_PER_FILE), чтобы имитировать более одного канала. Регулировка этого числа не приводит к потере звука раньше или позже, поэтому это не связано с достижением конца массива или повторным воспроизведением того же аудиообъекта. Мы опробовали форматы файлов OGG и MP3, и все работает в IE9 (MP3) и Firefox (OGG) без проблем. Мы также пытались найти файл обратно в начало, но безрезультатно.
this.PlaySound = function(sId)
{
var iSoundMapIndex;
var asoundChannels;
if(sId == null || sId.length == 0) return;
// Grab sound channels array
iSoundMapIndex = this.SoundMap[sId];
asoundChannels = this.Sounds[iSoundMapIndex];
if(asoundChannels == null)
{
this.World.AddMessage("Unable to find sound \"" + sId + "\".");
return;
}
// play the next in sequence
asoundChannels[this.SoundChannel[iSoundMapIndex]].volume = 1;
asoundChannels[this.SoundChannel[iSoundMapIndex]].play();
this.SoundChannel[iSoundMapIndex]++;
if(this.SoundChannel[iSoundMapIndex] == this.AUDIO_CHANNELS_PER_FILE) this.SoundChannel[iSoundMapIndex] = 0;
}