Меню

Сергей Драган

Разработка игр и разные мысли

Проверка Flash-приложением наличия звуковой карты

Сегодня, работая над проектом не за своей обычной машиной, а за подвернувшимся под руку Windows-сервером, я случайно узнал о любопытном но, к счастью, документированном нюансе класса Sound. Если в системе отсутствует звуковая карта, то после попытки воспроизведения звука метод play() возвращает null, что может стать причиной ошибки, генерируемой отлично работавшим на других машинах кодом.

Приведу пример:

var music: Sound = new GameMusic;
var musicSoundChannel: SoundChannel = new SoundChannel();
musicSoundChannel = music.play(); // строка выполняется, но после неё musicSoundChannel == null
musicSoundChannel.stop(); // и вот здесь будет null pointer error

Указанный выше код отлично работает на машине со звуковой картой, но поведёт себя так, как написано в комментариях, на системе без неё.

Чтобы избежать подобной ситуации, я предлагаю добавлять при запуске приложения небольшую проверку:

var testSound: Sound = new BlankTestSound; // какой-нибудь тестовый звук
var musicSoundChannel: SoundChannel = new SoundChannel();
musicSoundChannel = testSound.play(); // делаем тестовый запуск звука
if (menuMusicSoundChannel)
{
  trace("Звук есть!");
  musicSoundChannel.stop(); // всё, проверку мы прошли, тестовый звук можно тормозить
}
else
{
  trace("Грусьть и пичяль, звука нет"); // звука нет, потому больше в игре аудио воспроизводить не пытаемся
}

Я согласен, что сейчас практически не встретишь устройство без хоть какого-нибудь звука. Но включить этот нюанс в чек-лист всё равно не помешает.