Разбор форматов: звук в некоторых играх на Unreal Engine. Музыкальные форматы в играх

Музыка невероятно прочно интегрировалась в другие виды искусства и человеческой деятельности. Сегодня ни одно кино или игра не обходятся без саундтрека, радиопередача без джингла, а новый сингл любимой (да и нелюбимой) группы - без выхода сопровождающего клипа. Случается и такое, что "интегрированная" музыка нравится слушателю больше, чем произведение, в которое она интегрирована. В этом случае возникает закономерный вопрос: неужели для того, чтобы услышать зацепившую песню, каждый раз нужно открывать фильм или запускать игру, ее содержащую? Ну нет, лучше мы просто эту песню вытащим.

Вытаскивание звука из видеофайла - задача тривиальная и может претворяться в жизнь несколькими путями. Большинство пользователей для этого, стараясь обойтись подручными средствами, вынимают звуковую дорожку файла при помощи целой цепочки программ: VirtualDub > mp3DirectCut > Lame/Wav2Mp3. Другие же, напротив, ставят по такому случаю профессиональный редактор Adobe Audition, используя единственную его функцию - вытаскивание звука из видео. Ну, и еще обрезку время от времени. Первый способ можно сравнить с переливанием питьевой воды из бутыли в стакан при помощи фильтра, дистиллятора и воронки, а второй сопоставить с хрестоматийным забиванием гвоздей микроскопом. Поэтому мы с вами воспользуемся наиболее удобным и правильным вариантом - программой Easy Video To Audio Converter (см. КГ №33). Установите ее и откройте нужный вам файл. При помощи полосы поиска, окна предварительного просмотра и кнопок Start Time и End Time выберите тот фрагмент видео, звук из которого вы хотите вытянуть (например, песню из кинофильма). Нажмите на Settings и укажите каталог, куда будет сохраняться конечный аудиофайл, и качество экспорта. Можете заполнить id3-теги, хотя название композиции (если она одна) все равно придется вписывать уже потом. Ну, вот и все. Жмем на Convert и ждем результата. Надо сказать, что, если вы пользуетесь незарегистрированной версией программы, то оный результат вряд ли вас обрадует: программа конвертирует только половину заданного вами отрезка.

Для того чтобы вытащить звуковую дорожку DVD-диска, лучше всего воспользоваться специально для этого предназначенной программой #1 DVD Audio Ripper (www.dvdtox.com/dvdaudioripper.htm, $29, 1,96 Мб), которая во многом напоминает описанный выше Video To Audio Converter. Итак, устанавливаем и запускаем программу, вставляем диск в привод и жмем на Open Folder IFO Files Stored для открытия всей содержащейся на диске аудио- и видеоинформации или Open IFO File для выбора конкретного IFO-файла (или в том случае, если точная копия DVD лежит на вашем винчестере). Теперь при помощи предварительного просмотра выбираем и отмечаем галочкой нужные нам треки. Если в одной группе содержится несколько треков, и вам нужны лишь некоторые из них, необходимо снять галочку напротив самой группы - в противном случае программа первым делом сграбит ее целиком, причем в один файл, а уж потом примется за выбранные вами треки. При помощи кнопки Edit start and end time вы можете выбрать интересующий вас фрагмент дорожки. Укажите формат экспорта (wav, mp3, ogg или wma), если хотите, заполните теги и настройте качество выходного файла в окне Settings. Теперь можно смело нажимать на Start Ripping и ждать результата. Незарегистрированная версия #1 DVD Audio Ripper имеет ограничение на максимальную длину сохраняемого фрагмента аудио - не более пяти минут.

Флэш-ролики

Самым действенным средством для извлечения понравившейся мелодии (или любого другого ресурса) из Flash-ролика можно считать программу Sothink SWF Decompiler (www.sothink.com, $80, 3,2 Мб). Установив ее, просто выделите нужный ролик в Проводнике и во всплывающем меню выберите пункт Sothink SWF Decomplier. Того же результата можно достичь, сразу запустив программу и найдя ролик в панели Explorer. Теперь в панели Resources отображаются все ресурсы, которые можно вытащить из клипа. Если вас интересует только музыка, откройте вкладку Sound, прослушайте ее пункты и отметьте галочкой те из них, которые хотите извлечь. Если же вы хотите вынуть из ролика какие-то элементы, помимо звуков, просто изучите содержимое других вкладок. Закончив, жмите на Export, укажите путь для сохранения и наслаждайтесь полученным результатом. Еще одна полезная функция SWF Decomplier - экспорт SWF-ролика в "родной" формат FLA.

Игры

Выдергивание звуков, равно как и других ресурсов, из компьютерных игр –процедура, обычно требующая терпения. Разные разработчики по-разному решают проблему хранения данных, и поэтому универсального способа работы с играми не существует, да и не может существовать: к каждому продукту приходится искать свой подход. Какими могут быть эти подходы? Ну, например, если речь идет о действительно народной игре, например, GTA: San Andreas или NFS: Underground, то для нее наверняка создана специальная утилита, распаковывающая музыкальные файлы. Загляните на фан-сайт игры, и вы, скорее всего, найдете там все, что вам нужно, и даже немного больше. Например, по адресу gta.gameguru.ru/f_gta_sa_tools.htm можно скачать распаковщик GTA SA Music Extractor, который при размере в 50 Кб заменит вам восьмидисковый оригинальный саундтрек, просто расшифровав игровые аудиофайлы. Так что запасайтесь терпением, открывайте Google - и флаг вам в руки.

Не нашли распаковщика для интересующей вас игры? В этом случае в дело вступают программы общего назначения. Прежде всего, попробуйте воспользоваться утилитой Gap (по имени-отчеству - Game Audio Player, www.ag.ru/files/software/9, 1,09 Мб, freeware) - поскольку, как вы уже поняли, она специально предназначена именно для вытаскивания музыки. Установщика у Gap нет (сказывается русская родословная), так что просто выберите удобную папку и распакуйте программу туда. Как можно понять, запустив Game Audio Player, он и на самом деле представляет собой музыкальный проигрыватель, хоть и не слишком функциональный: попытка включения эквалайзера отсылает нас в хронологически неопределенное, но заведомо светлое будущее, а нынешний король всех музыкальных форматов - mp3 - плейером не поддерживается. Зато поддерживается огромное множество других форматов, о существовании которых большинство проигрывателей даже не догадываются. Нажимаем на значок Playlist и видим, что, несмотря на примитивность встроенного плейера, Gap - довольно-таки гибкая программа.

Если файлы данных подопытной игры находятся в открытом виде, но не читаются вашим проигрывателем, попробуйте открыть их здесь: File > Add File(s) или File > Add Directory, если вы хотите добавить в плейлист все понимаемые программой файлы в заданной папке. Если искомые звуки запакованы в один или несколько больших архивов, воспользуйтесь командой File > Scan File(s). Если вы не знаете, в каком именно файле хранится музыка, проверьте всю папку с игрой при помощи пункта Scan Directory. Опция Recurse Subdirectories влияет на то, будут ли при проверке выбранной директории сканироваться вложенные папки. Вам, скорее всего, понадобится ее включить. Итак, если удача вам улыбнулась, то по завершении сканирования Gap предложит вам список найденных объектов. Чтобы прослушать файл, дважды по нему кликните. Теперь выделите те файлы, которые хотите сохранить, и воспользуйтесь командой File > Save File(s). Если же формат игрового аудио окажется для вашего плейера экзотическим, вам пригодится встроенная в программу возможность конвертирования любого аудиофайла в WAV: File > Convert File(s). В качестве WAV Format можно выбрать либо PCM (чтобы впоследствии пережать его в mp3), либо уже сжимающие кодеки типа OggVorbis и Windows Media Audio.

Ну, а если Game Audio Player вам не помог, переходим к следующему пункту плана. Программа Magic Extractor (magicteam.ag.ru/files.html, 943 Кб, freeware) не ориентирована сугубо на вытаскивание аудио, а предназначена для распаковки игровых файлов целиком. Magic Extractor поддерживает довольно много форматов и в общей сложности может с успехом применяться почти в 200 играх. В левой части окна программы можно задать путь к папке с игрой и выбрать интересующие вас файлы (если вы открыли папку, но файлов для выбора не видите - значит, вам снова не повезло, и ваша игра в не входит в число поддерживаемых). Если же все прошло успешно, в правой части окна появится список запакованных объектов с видом по категориям. Кликнув на нужный файл, вызовите из всплывающего меню пункт "Извлечь выбранный объект". Правда, при распаковке некоторых типов архивов - например, близзардовского MPQ - вы не увидите ни категорий, ни даже расширений содержащихся в них файлов. Придется извлекать все и искать иголку в стоге сена. С другой стороны, с тем же MPQ прекрасно справляется вышеописанный Gap - нужно только задать ему список файлов архива, а эти списки для большинства известных игр, хранящих данные в MPQ, входят в дистрибутив.

Ни в коем случае не отчаивайтесь, если неудача постигла вас и здесь. Вы можете попробовать воспользоваться "универсальным", то есть не предназначенным для конкретной игры или игр, распаковщиком, коим является, например, FMV Extractor (сайт , 537 Кб, freeware). Программа поддерживает 12 наиболее распространенных игровых форматов медиа - таких, как Bink и Smacker Video, JPEG, WAV и т.д. Выберите исходный файл (Select Source File) и начните сканирование (Start Analysis). Просмотрите полученный список, отметьте нужные вам объекты и нажмите Save Selected Clips. Внимание: поиск mp3-файлов в FMV Extractor находится на этапе тестирования, главным образом, потому, что нынешний алгоритм их распознавания требует, мягко говоря, уйму времени. Включается режим поиска mp3 так: BETA > MP3 Mode. Файлы других форматов в этом режиме распознаваться не будут. Для поиска ресурсов в старых играх полезной может оказаться утилита Ripper, написанная давным-давно одним немецким любителем интерактивных развлечений: сайт (56 Кб). Программа знает около 60 различных форматов файлов, многие из которых в современных играх не используются и аналогичными по назначению разработками, вышедшими позже, не распознаются. Правда, как и для всех универсальных распаковщиков, камнем преткновения для Ripper становятся зашифрованные файлы, да и "утки", то есть фрагменты, ошибочно принятые за файлы, при его использовании тоже не редкость. Еще два неплохих универсальных распаковщика можно найти здесь: multiex.xentax.com и www.geocities.com/TimesSquare/8271. Пользование обеими программами довольно прозрачно, так что не будем на нем останавливаться.

Даже если все эти средства не привели вас к желаемому результату, не стоит расстраиваться. Посетите сайт www.extractor.ru, целиком посвященный вытаскиванию данных из игр. Там представлено огромное множество как универсальных, так и специальных утилит, которые, вполне вероятно, смогут решить вашу проблему. Ну, а тем, кому не жалко трафика, времени или денег, вообще не обязательно пытаться собственноручно вытащить музыку из игры. OST (оригинальный саундтрек) ко многим играм теперь можно заказать на официальном сайте разработчиков или в популярных музыкальных магазинах, скачать по peer-to-peer или, например, здесь: www.game-ost.ru.

Прямая запись

Если описанные выше методы не помогли вам добиться цели или ваша конкретная задача просто осталась без внимания (скажем, вы хотите записать передачу потокового интернет-радио), то остается последний способ, которым вы можете воспользоваться. Заключается он в том, чтобы произвести запись на лету, по мере воспроизведения. Крайностью этот способ можно считать потому, что, во-первых, звук при этом сжимается дважды (в случае, если исходное аудио уже сжато, а вы опять сохраняете его в mp3 или ogg), и поэтому теряет в качестве, а во-вторых, сами понимаете, если записывать таким способом получасовую передачу, вам потребуется на это полчаса времени. Для прямой записи можно использовать программы FairStars Recorder (www.fairstars.com, $25, 1,8 Мб) или Total Recorder (www.highcriteria.com, $18, 2,3 Мб). Для начала приготовьте звук к записи (запустите радио; откройте DVD-диск той единственной программой, которая умеет читать его экзотическую звуковую дорожку; отключите в игре эффекты, выставьте музыку на максимум и нажмите паузу). Выбирайте в качестве источника записи AUX вашей звуковой карты - и начинайте запись.

Советы
1. Самый простой способ пережать WAV-файл в mp3 - скачать (если его у вас нет, проверьте) с www.free-codecs.com/Lame_Encoder_download.htm (600 Кб) бесплатный кодировщик Lame и воспользоваться им. Если вас устраивает качество mp3, используемое по умолчанию (128 Kbps 44.100 Hz), просто перетащите дорожку в WAV на исполняемый файл lame.exe. В противном случае вызовите кодировщик из командной строки с нужными параметрами (список можно получить так: lame - help).
2. Если интересующая вас игра хранит свои файлы в открытом виде, но использует для этого какой-то экзотический формат, который даже Winamp не признает, попробуйте испытать дорогую профессиональную программу Awave Studio (www.fmjsoft.com/awmain.shtml, $140, 1,6 Мб) - мощное средство, умеющее конвертировать почти все звуковые форматы.

Удачи вам!

Михаил Федотов AlsoKnownAs $ky$pe@R, [email protected], Минск, 2006

Культура модификации игр зародилась ещё в древние времена. Самое раннее, что я помню, это Wolfenstein 3D (1992 год). Если не ошибаюсь, можно было рисовать свои карты, а потом и новых врагов, заменять текстуры и звуки. Главным препятствием в моддинге является разбор неизвестных форматов данных. Оставим моральные аспекты этого явления для других ресурсов, и остановимся на технических сложностях, которые могут возникнуть в этом нелегком деле.

У меня накопилось довольно много историй такого рода, от самых простых, типа разбора простейшего архива, где в одном файле хранятся много тысяч файлов игры, до замены 3D-моделей, исследования и написания нестандартных кодеков звука. Расскажу одну из них, средней сложности.

Допустим, у вас появилось желание заменить определённые фразы в игре, или вообще замахнуться на полную озвучку на каком-нибудь языке, для которого у разработчиков не хватило сил или ресурсов. Казалось бы, надо только записать звук, найти где он находится в игре, и заменить нужные файлы. Но не всегда это бывает просто, например, в последних играх из серии Batman: Arkham используется звуковой движок wwise, который уже довольно давно интегрирован в Unreal Engine.

Я уже не раз сталкивался с UE, но, как известно, коммерческие разработчики имеют возможность полностью менять любую часть кода движка, поэтому почти все игры получаются уникальными с точки зрения структур данных, и это всегда интересно поисследовать.

Для начала посмотрим звуковые файлы. Они как обычно лежат в папке audio и собраны в один большой пакет, с неожиданным расширением.WAD (привет DOOM). При желании даже можно извлечь из него все звуки, но это будет несколько тысяч безымянных файлов, и найти среди них что-то будет весьма проблематично, разве что «вручную» переслушивать их все. Надо сказать, что чаще всего бывает проще. Разработчики, для своего же удобства, оставляют где-нибудь файл со списком фраз. Но это не тот случай.

Логично предположить, что раз сама игра как-то находит нужные звуки и субтитры к ним, значит, эта информация где-то содержится в файлах, надо только её найти. Нигде в папках для локализации тексты не обнаруживаются, значит они разбросаны по отдельным уровням игры, как это часто бывает. Возьмем для примера один из.upk файлов с названием, похожим на уровень, и распакуем его. Благо, инструменты для этого имеются, даже с исходными текстами.

Внутри довольно быстро обнаруживаются файлы типа.RDialogueEvent, в которых невооруженным глазом видны тексты фраз на 11 языках.

Имена файлов похожи на имена исходных звуков. Замечательно, теперь осталось только найти соответствие между ними и звуковыми файлами. Вот только тут и начинаются проблемы. В звуковом пакете конечно есть идентификаторы. Это 30-битный хеш, который всегда используются в wwise для звуков, но к сожалению нигде среди файлов диалога их найти не удаётся. Везде одни непонятные цифры, ничего похожего на ID звука нет, они сразу были бы заметны. С другой стороны, это и понятно, ведь движок не так прост, и нельзя просто так взять и проиграть звуковой файл в игре. Он содержится в аудио-банке, у него множество свойств, накладывающих различные эффекты и т.д.

И тут оказывается, что в каждой папке с диалогом есть файл.akbank - видимо это и есть аудио банк wwise.

Вот у него внутри как раз очень много идентификаторов, перепробовав которые наугад, мы обнаруживаем, что один из них (выделен зеленым) имеется в звуковом пакете. Если мы извлечем оттуда данные по этому идентификатору, то получим некий сегмент из слепленных вместе нескольких звуков. Сконвертируем эти звуки из внутреннего формата wwise в обычные ogg. Да, действительно, в одном из них Бэтмен говорит: «I don"t have time for this», а в другом файле ему отвечают. И фразы как раз соответствуют текстам именно этого диалога.

Уже неплохо! В принципе, на этом можно было бы и остановиться: все диалоги разложены по папкам, для каждого из них есть банк со ссылкой на звуковой сегмент. Мы конечно не знаем, где какой файл, но разрезать сегмент на части, послушать и расставить по местам несколько фраз (а их в диалогах обычно бывает всего 3-4 штуки) можно и вручную.

Но мы не ищем легких путей. Разбираться, так до конца. Проверим на всякий случай, вдруг звуки идут прямо по порядку? Конечно же нет, они перепутаны. Как ни крути, где-то должна быть информация о связи звуков в сегменте с текстом диалога. Я довольно долго копался в разных файлах, в надежде что-то обнаружить, но всё бесполезно. Хорошо. Раз такое дело, распакуем все пакеты игры. Это несколько гигабайт, ну ничего, первый раз что-ли? Вот только полный поиск по всем данным игры также ничего не дал. Единственное место, где есть идентификаторы звуков, это аудио банк. Выходит, связь идёт только через него. Ничего не поделаешь, придется лезть внутрь и разбираться, как он устроен.

Теперь, для верности, найдём в игре какой-нибудь диалог, который можно быстро проверять. После эффектного вступления с очаровательной девушкой-репортёршей и маски-шоу, Бэтмена захватывает Hugo Strange. Он говорит пару фраз, начинающихся с «I feel I should thank you», потом уходит, и начинается игра. Именно здесь происходит первое сохранение. Этот момент нам подойдёт.

Найдём фразу злодея в файлах. Она оказывается в пакете OW_E8_Ch1z_Anim. Так сразу и не догадаешься. Внутри всего один диалог, в котором содержится всё начало игры. Это целых 24 фразы, но возможно это даже хорошо, в мешанине кодов легче найти число 24, чем 1 или 2. Итак, мы собирались изучить содержимое.akBank

Формат банков wwise оказывается уже частично исследован. Будем надеяться что этой информации хватит для нашей цели. Судя по началу файла.akbank, в нем находятся сразу 5 аудио банков для 5 языков, первым идёт банк INT (английский) - его мы и посмотрим.

Сначала там имеется непонятная таблица после заголовка ВКРК, потом довольно много нулей (это видно на прошлой картинке), потом сегмент BKHD, и потом сегмент HIRC, в котором, по всей видимости, находится описание всех аудио-объектов. В данном случае у нас их 79 штук (0x4F выделено зеленым). Как утверждает описание, объекты в сегменте идут один за другим, для каждого указан тип (1 байт), потом 32-битная длина, и ID. Длина и содержимое объекта отличается в зависимости от типа.

Объекты тип 2 - это собственно звуки. Тип выделен красным, длина - желтым. У каждого из них указан ID самого объекта (зеленым) и ID звукового файла (фиолетовым), где он содержится. Ниже видно начало следующего объекта такого же типа.

Объекты 3 - звуковые действия, похоже каждое из них это «проиграть звук», с какими-то неизвестными нам параметрами, но в каждом из них есть свой ID (серым) и ID звука, который собственно нужно проиграть (зеленым).

Объекты 4 - звуковые события. Очень короткие записи, в которых только и есть, что ID события (голубым), а также указано, что оно содержит только одно действие, и ID этого самого действия (серым).

Ну вот, похоже у нас имеется 24 цепочки событий следующего вида:

Событие -> действие -> звук

Они связаны идентификаторами, и в итоге заканчиваются ссылками на звуковые файлы. Как же найти нужные файлы? Поискав эти коды, мы обнаруживаем их как раз в той самой таблице в начале банка. Видимо это таблица, в которой записано, где внутри звукового сегмента находятся отдельные звуки. И действительно, в ней как раз 24 элемента, и для каждого файла указан тот самый ID, который у нас был в звуковом объекте, смещение относительно начала, и длина. Поздравляем! Теперь у нас полностью прослеживается связь от аудио-событий в банках до отдельных звуковых файлов:

To есть как исходные данные у нас есть ID нескольких событий, по одному для каждой фразы диалога, и для каждого из них мы можем найти звуковой файл. Но как связать их теперь с самим диалогом?

Попробуем поискать где-нибудь эти идентификаторы. В файлах диалогов их опять нет. В папке есть еще какие-то очень короткие файлы.akevent - их тоже 24 штуки. Очевидно, это файлы аудио-событий. Внутри какие-то небольшие числа, у всех одинаковые, от них никакого толку. Единственное, что там есть разного, это как раз id аудио-событий, которые мы нашли в банке.

Опять тупик: есть идентификаторы для всех событий, но связи между ними и текстом диалога нет! На всякий случай сделаем тест: поменяем в нужном файле ID и запустим игру. Да, действительно, Хьюго открывает рот, но ничего не говорит. Значит это именно те данные, по которым игра находит нужный звук. Заодно отмечаем, что субтитр всё равно показывается. Значит тексты диалогов в нашем случае первичны, а от них уже идёт звук.

И тут я вспоминаю, что у движка UE3 есть привычка ссылаться на объекты пакета через их порядковый номер внутри пакета, то есть прямо как они упакованы внутри него. Посмотрим файл экспорта, который образуется у нас при распаковке пакетов:

Номера здесь десятичные, и начинаются с нуля, в игре же они начинаются с 1, поэтому получается, что файлы событий в экспорте идут под номерами 0x35-0x4С. Посмотрим, нет ли их где-то среди диалогов. Начинаем смотреть - и надо же, прямо в начале файла есть этот номер!

Вот и последнее недостающее звено. Заодно рядом обнаруживаем 0x2С - это номер файла банка. В случае если в папке вдруг будет несколько диалогов, их тоже можно будет отличить. Теперь мы полностью знаем, как по тексту диалога найти соответствующий звук.

Такая вот получилась довольно сложная схема взаимодействия. Похоже разработчики решили не заботиться об удобстве, и просто положились на внутренние механизмы движка, что и привело к такому результату в данном случае. А случаи, как я уже сказал, бывают самые разные. Структура файлов и связи между ними могут быть совершенно другие. Здесь у нас от текста диалога шла ссылка на звук. А бывает наоборот, первичным является звук, а к нему по идентификатору находится текст. Или первично событие скрипта игры, а от него идут ссылки и на звук, и на текст. Бывает, что файлы находятся не по имени, а по хешу. Но в любом случае, каким-то образом они все связаны, остаётся только найти эту связь.

В качестве последнего штриха попробуем проверить наши результаты. Найдём файл диалога именно от нужной нам фразы «I feel I should thank you» и заменим в нём 4B на 4C. Запускаем игру, и наш друг Хьюго вместо этой фразы многозначительно произносит: «It will be my legacy, a monument to your failure and if you try to stop me, I guarantee everyone will know your secret.»

Оставим на этом Бэтмена, исследование можно считать законченным. В письменном виде процесс выглядит быстро, но на самом деле каждый этап может сопровождаться долгим созерцанием 16-ричных цифр, без всякой надежды на то, что в какой-то момент они сложатся в осмысленные цепочки, и вы поймёте, что они значат. Но иногда это всё-таки происходит.

сайт представляет вам второй материал из нашего цикла, посвященного звуку в современных играх. В этот раз мы подробно рассмотрим профессию саунд-дизайнера и сам процесс создания звукового окружения.

Профессия саунд-дизайнера

Современные игры содержат тысячи звуков. Некоторые из них практически незаметны, другие кажутся чем-то самим собой разумеющимся, третьи поражают воображение и заставляют нас верить в происходящее на экране. За всем этим стоит саунд-дизайнер - специалист по звукошумовому оформлению видеоигры.

Профессия саунд-дизайнера пришла в игровую индустрию из мира кино. В 1979 году режиссер Френсис Форд Коппола впервые назвал так Уотлера Мёрча за выдающиеся достижения при озвучивании военной драмы «Апокалипсис сегодня». Идейно же корни саунд-дизайна уходят в куда более древние времена: сценические шумовые эффекты использовались еще в античном театре.

Задачи игрового саунд-дизайнера многогранны: в них входит поддержание игровой механики, формирование атмосферы и эмоционального образа, предоставление информации и создание обратной связи. Несмотря на заимствование ключевых технологий, игровой саунд-дизайн сильно отличается от кинематографического. Кинофильм линеен и не интерактивен. Аудиодорожка к нему формируется один раз и не меняется с каждым новым просмотром. В играх все обстоит совершенно иначе: звуковое сопровождение собирается на лету в зависимости от действий игрока, а одни и те же звуки могут многократно повторяться, зацикливаться и проигрываться в разном акустическом окружении. Поэтому игровым саунд-дизайнерам приходится постоянно следить за сочетаемостью звуков между собой и учитывать все возможные варианты их воспроизведения.

Процесс

Работа над звуком начинается с написания экспликации - подробного плана, который освещает все возможные аспекты озвучивания будущей игры. Этот документ может насчитывать несколько десятков страниц и служит руководством к действию для всей аудиокоманды. Экспликация содержит описание игровых звуков, информацию об их характере, аудиоформатах, приоритетных технологиях, особенностях платформы и движка.

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

Отдельного упоминания заслуживает техника foley-озвучивания - одно из многочисленных наследий киноиндустрии. В игровом аудио её суть сводится к имитации одних звуков за счёт других - более простых в получении. Драки, например, исторически озвучиваются ударами кулака по арбузу или куску мяса, а хруст костей - ломанием морковки или сминанием пластикового стакана. Способ получения звука целиком и полностью зависит от фантазии саунд-дизайнера. Некоторые записывают упомянутый звук хруста костей, избивая молотком куриную тушку.

Следующая стадия - моделирование уникальных звуков. Как звучит выстрел из плазменной пушки? Что слышит персонаж, погружаясь в источник магической энергии? Каким голосом будет обладать шестиногая инопланетная тварь? Видеоигры буквально кишат объектами, не имеющими аналогов в реальном мире. Каждый из них должен звучать достоверно и уникально, а значит, простой звукозаписью уже не обойтись. Реалистичные звуки придется ускорять и замедлять, «разворачивать» задом наперед, многократно совмещать друг с другом, комбинировать с синтезированными тембрами и обрабатывать сложными цепочками эффектов. Одной лишь фантазии здесь недостаточно - придётся подключать природную наблюдательность. Нужно представить себе, из каких элементов может состоять тот или иной звук, какая именно часть объекта может его издавать и какое впечатление нужно донести этим звуком до игрока.

Так, приближение гигантского человекоподобного робота будет состоять из скрипа сервоприводов, металлического лязга и громкого топота, сотрясающего все окружающие объекты.

Не все звуки нужно записывать - для этого часто не хватает времени и бюджета. На помощь саунд-дизайнеру приходят многочисленные библиотеки с колоссальным количеством аудиоматериала. Применение «библиотечных» звуков в чистом виде в профессиональной среде считается дурным тоном. Поэтому большинство саунд-дизайнеров стремится сделать их уникальными, смешивая друг с другом и применяя разные обработки.

Далее следует этап интеграции звуков в программный код игры - процесс, который может занимать до 70% рабочего времени саунд-дизайнера. На этой стадии звуки присваиваются игровым объектам, задаются правила их воспроизведения и взаимодействия.

Например, у нас есть игровой объект «автомобиль», который может взорваться. В каком случае будет воспроизводиться звук его взрыва? Как далеко он будет слышен? Насколько он важен для игрока? Как часто автомобили будут взрываться в игре? Будет ли он заглушать речь игровых персонажей? Будет ли он громче звуков выстрелов, и как он будет с ними сочетаться?

Это - лишь малая часть вопросов, которые могут решаться во время интеграции одного звука из тысяч. В недавнем прошлом ситуация осложнялась еще и тем, что для замены каждого звука в игре приходилось обращаться к программистам. Современные средства наподобие Audiokinetic Wwise и FMOD Designer решают эту проблему, позволяя композиторам и саунд-дизайнерам самостоятельно встраивать любые аудиофайлы и автоматизировать их обработку.

Слово экспертов

Питер Комли (Peter Comley) - саунд-дизайнер из Microsoft Studios. За годы работы в компании он приложил руку ко множеству AAA-проектов, среди которых , серии Fable, Gears of War и Halo.

«Меня часто спрашивают, чем же занимается саунд-дизайнер в игровой индустрии. Давайте попробуем представить дешевую детскую игрушку, которая издает звук, когда мы нажимаем на кнопку. Звук может меняться в зависимости от силы нажатия, но в целом больше ничего эта штука делать не умеет. Задача саунд-дизайнера - использовать все доступные средства (навыки работы со звуком, конструкцию кнопки, операционную систему игрушки, специфику динамика и даже производственный план) так, чтобы пользователь захотел играть как можно дольше. Ты как гейм-дизайнер, но в твоем распоряжении есть только звук. Причем тебе нужно сделать игровой процесс не только интересным, но и затягивающим. Не знаю, хорошо это или плохо, но „затягивающий“ (addictive) - это высшая похвала, которую может получить любая игра.


Это, конечно, не самый реальный пример: таких простых игр, наверное, не существует. Но суть работы саунд-дизайнера сохраняется. Возьмите эту ситуацию, умножьте ее сложность в триллион раз, добавьте всякие приукрашивания и представьте, что задачи постоянно меняются. Теперь вы примерно представляете себе, что значит заниматься саунд-дизайном для современной крупной видеоигры».

Сэм Купер (Sam Cooper) - ведущий саунд-дизайнер Creative Assembly. Он работал над звуком , которая получила премию BAFTA за достижения в области игрового аудио. Кроме того, Сэм участвовал в озвучивании нескольких игр серии Total War.

«Иногда тон геймплейному событию задаётся с помощью простого интерфейсного звука длиной в полсекунды. Или можно подсознательно воздействовать на игрока атмосферными шумами окружения. Мы, игровые саунд-дизайнеры, всегда спрашиваем себя: „Что в этот момент должен чувствовать игрок?“, „Как мы можем поддержать эти эмоции?“.

В Creative Assembly мы предпочитаем сами записывать все возможные звуки. Это всегда интересно - не важно, работаем ли мы в полевых условиях, или в студии. Больше всего мне нравится записывать взрывы и звуки разрушений: это очень захватывающе. В студии тоже бывает весело. Например, когда мы записывали звуки расчлененки для Alien: Isolation, у нас был комплект микрофонов и куча всяких фруктов и овощей. Мы целый день их уничтожали, производя всякие отвратительные звуки - очень тогда перепачкались.


Игровой саунд-дизайн отличается от других сфер аудиоиндустрии тем, что нам приходится постоянно думать об интерактивности. Это влияет на все аспекты нашей работы. Мы не можем просто взять и сделать один идеальный звук для какого-то момента: аудио должно реагировать на целый ряд возможных событий. Взрыв, например, нужно записывать с учетом разрушаемых материалов и размеров помещения. При этом для каждой ситуации записывается несколько вариантов, ведь повторение одного и того же звука будет утомлять игрока».

В следующем материале мы рассмотрим, наверное, самый интересный для многих аспект игрового звука - музыку. Следите за обновлениями на нашем сайте. Первую часть нашего цикла вы можете найти .

Речь пойдёт о программной библиотеке для работы со звуком, известной под названием FMOD. Разработчиком этого программного продукта является компания Firelight Technologies Pty, Ltd. На момент написания статьи последним релизом FMOD была версия 3.74. С текущим состоянием дел и с новыми версиями, если они появились, вы можете ознакомиться на сайте www.FMOD.org . На том же сайте вы можете получить версии FMOD для различных операционных систем. Прямые ссылки на дистрибутив FMOD расположены

Библиотека функций FMOD представляет собой реализацию API верхнего уровня, который включает широкий набор функций для работы со звуковыми файлами различных форматов, обработки звуковых данных и воспроизведения звука через аудиосистему компьютера или игровых приставок. Для того чтобы рассказать обо всех возможностях этого API потребуется не один десяток web-страниц. Кроме того, основной нашей тематикой названа разработка звуковых игр, для которых главный интерес представляют функции для работы с объёмным (3D) звуком. Знакомством с этими функциями мы и ограничимся. Следует иметь в виду, что данная публикация не является полным руководством по FMOD, поэтому, разбирая приводимые ниже примеры, не следует пренебрегать официальной документацией. Все примеры в статье составлены на языке программирования C (Си).

Для создания источников 3D звука и расчета трёхмерной звуковой картины FMOD (версия для Windows) использует в качестве базы любую из следующих звуковых систем: WMM (Windows Multimedia), DirectSound3D (звуковая подсистема Microsoft DirectX) и A3D. FMOD обеспечивает такое взаимодействие с этими звуковыми системами, что переход от одной из них к другой требует минимальных изменений в коде программы (а часто вообще не требует никаких изменений). При работе с базовой звуковой системой DirectSound3D функции FMOD заметно облегчают управление объёмными источниками звука, упрощают их инициализацию, воспроизведение и позиционирование. Простота программирования FMOD (в сравнении с программированием базовых звуковых систем) является важным достоинством этого API (О программировании непосредственно DirectSound3D можно прочитать в статье Программирование объёмного звука в DirectSound3D).

Другим достоинством FMOD является лёгкость установки - достаточно разместить в системной папке или в папке, из которой запускается приложение, dll библиотеку, чтобы функции FMOD стали доступны. В версии 3.74, кроме обычной для Windows 32-разрядной dll, поставляется 64-разрядная библиотека FMOD.

FMOD содержит подробную документацию и примеры (вместе с заголовочными и другими служебными файлами) для VisualC, BorlandC, Watcom C, Borland Delphi и VisualBasic. Для некоммерческих приложений библиотека FMOD предоставляется бесплатно.

К недостаткам FMOD следует отнести отсутствие таких возможностей (которые реализованы в DirectSound3D), как создание направленных источников звука и создание зависимых источников звука (по крайней мере, в наборе функций FMOD не представлены функции, устанавливающие данные параметры пространственной обработки звука).

Модель пространства в FMOD

Модель пространства (система координат), используемая для размещения источников 3D звука, аналогична модели пространства в DirectSound3D. Здесь используется левосторонняя декартова система координат, состоящая из трёх ортогональных координатных осей. Ось X (икс) направлена вправо; ось Y (игрек) направлена вверх; ось Z (зэт) направлена вперед (то есть в монитор, если сидеть лицом к нему). Расстояние измеряется в метрах, но можно установить другую единицу измерения длин, задав соотношение между метром и новой единицей измерения. Любая точка в пространстве задается своими координатами, которые записываются в последовательности X, Y, Z. Координаты могут принимать как положительные, так и отрицательные значения. Координатную триаду XYZ, характеризующую положение точки в пространстве, можно рассматривать как вектор, начало которого находится в начале отсчета, то есть в точке с координатами (0, 0, 0), и конечной точкой с координатами (X, Y, Z). Кроме векторов положения, в FMOD используются векторы скорости, необходимые для вычисления доплеровского смещения в спектре звука движущихся источников. Вектор скорости задается тремя координатами своей конечной точки (начальной точкой вектора скорости считается точка (0, 0, 0)). Следует заметить, что FMOD (как и DirectSound3D) не занимается расчетом координат движущегося объекта. Эту задачу должен решать программист, передавая функциям FMOD данные, необходимые для моделирования исключительно звуковой картины в конкретной точке пространства и в конкретный момент. То есть по сути FMOD (как и DirectSound3D) рассчитывает статическую звуковую картину, которую программист может сделать динамичной для слушателя (игрока), часто меняя положение источников звука.

В тех функциях FMOD, для которых в качестве параметра должен передаваться вектор, используется указатель на структуру, состоящую из трёх вещественных (float) чисел, или на массив, состоящий из трёх вещественных (float) чисел. То есть две следующие конструкции будут одинаково восприняты функциями FMOD:

/* масив */ float pos = {10.0f, 2.0f, 4.2f}; /* структура */ struct VECTOR { float X; float Y; float Z; }; VECTOR pos = {10.0f, 2.0f, 4.2f};

Модель пространства в FMOD включает еще некоторые параметры среды, влияющие на распространение звуковых волн. С помощью функций FMOD можно установить степень затухания звука и степень выраженности доплеровского эффекта.

Объекты звуковой картины в FMOD

В FMOD существуют два вида объектов трёхмерного звукового пространства: источники звука и слушатели. В отличие от DirectSound3D, FMOD поддерживает модель нескольких слушателей. Во всем остальном обе системы аналогичны.

Источники звука в FMOD могут быть только точечными и ненаправленными, что означает отсутствие у источника собственных размеров в и всенаправленность распространения звука от этого источника. Положение слушателя, напротив, является ориентированным. Для этого задаютс направление двух ортогональных векторов единичного размера. Первый вектор ориентирует направление лица, то есть указывает, куда смотрит слушатель. Второй вектор всегда направлен из макушки вверх, то есть указывает направление вертикальной оси слушателя. Модуль каждого из этих векторов равен единице измерения длины, поэтому они носят названия единичных (Модуль вектора вычисляется как корень квадратный из суммы квадратов длин его проекций на оси координат).

Функции для работы с 3D звуком

для простоты изложения ниже приводятся не только функции FMOD, отвечающие непосредственно за создание объёмного звука, но и все те функции, которыми необходимо воспользоваться программисту, чтобы работать с библиотекой FMOD. Причем в списке функции расположены в той ориентировочной последовательности, в которой их следует вызывать в программе, взаимодействующей с FMOD. В документации, которая входит в комплект FMOD все приводимые ниже функции помещены в раздел "FSOUND API Reference".

  • FSOUND_GetVersion() - возвращает версию библиотеки FMOD, установленной на компьютере. Возвращаемое значение следует сравнить с константой FMOD_VERSION, которая хранит номер версии FMOD, для которой была скомпилирована программа.
  • FSOUND_SetOutput () / FSOUND_GetOutput () - выбрать/получить базовую звуковую систему (Windows Multimedia, DirectSound, A3D и т.п.). Выбор базовой системы должен производится до вызова функции FSOUND_Init().
  • FSOUND_SetDriver () / FSOUND_GetDriver () - выбрать/получить номер устройства вывода (звуковой карты). Выбор устройства должен производится до вызова функции FSOUND_Init().
  • FSOUND_SetMixer () /FSOUND_GetMixer () - выбрать/получить тип цифрового микшера. Выбор микшера должен производится до вызова функции FSOUND_Init(). Определение типа микшера не является обязательным, так как FMOD самостоятельно определит лучший из имеющихся вариантов.
  • FSOUND_Init() - инициализирует звуковую систему FMOD.
  • FSOUND_Sample_Load () - загружает в память и декодирует звуковой файл (поддерживаются.wav, .mp2, .mp3, .ogg, .raw и др.).
  • FSOUND_3D_SetDistanceFactor () - позволяет установить единицы измерения длин, отличные от метров.
  • FSOUND_3D_SetDopplerFactor () - позволяет установить доплеровское смещение. Базовое значение (1.0) соответствует скорости звука 340 м/с.
  • FSOUND_3D_SetRolloffFactor () - позволяет установить уровень потерь энергии звуковой волны (затухания). Базовое значение (1.0) соответствует нормальным условиям.
  • FSOUND_PlaySoundEx () - проигрывает звуковой файл, загруженный в память, через звуковой канал.
  • FSOUND_3D_SetAttributes () / FSOUND_3D_GetAttributes () - установить/получить вектор положения и вектор скорости источника звука.
  • FSOUND_3D_SetMinMaxDistance () / FSOUND_3D_GetMinMaxDistance () установить / получить минимальное и максимальное расстояние слышимости источника звука. Минимальным называется такое расстояние от источника звука до слушателя, при уменьшении которого громкость звука больше не возрастает, а остается на том значении, которого она достигла на минимальном расстоянии. Устанавливая разные минимальные расстояния, например, для самолета и шмеля, можно сделать их одинаково заметными на слух, несмотря на то, что гул мотора будет восприниматься как более мощный звук. Максимальным называется такое расстояние от источника звука до слушателя, начиная с которого громкость звука больше не уменьшается, а остается на уровне, который она достигла на максимальном расстоянии. Это означает, что как бы далеко не находился источник звука, он будет слышен.
  • FSOUND_SetPaused () - приостанавливает / возобновляет воспроизведение звука в канале.
  • FSOUND_3D_Listener_SetAttributes () / FSOUND_3D_Listener_GetAttributes () - установить/ получить вектор положения, вектор скорости и векторы ориентации слушателя.
  • FSOUND_Update () -обновить состояние звукового микшера, то есть обновить состояние звуковой панорамы, после чего все изменения в положении слушателя или источников звука вступают в силу.
  • FSOUND_Sample_Free () - освобождает память от звуковых данных, загруженных функцией FSOUND_Sample_Load().
  • FSOUND_Close () - выгружает звуковую систему FMOD.

Данный список является минимально необходимым и не включает ряд функций, позволяющих получать дополнительную информацию о звуковой карте, поддерживаемых алгоритмах обработки звука и т.п., а также управлять некоторыми параметрами воспроизведения звука.

Алгоритм использования FMOD в игровых программах

В центре нашего внимания будут игры, использующие объёмный (3D) звук. Как правило, в играх существует основной цикл игры, внутри которого происходит перемещение игровых объектов в пространстве. Такое перемещение может быть вызвано действиями игрока (например, в автосимуляторе это может быть поворот рулевого колеса вправо или влево) или изменением игровой ситуации (например, в "экшене" может приблизится монстр). Рассчитав новые координаты объектов, следует изменить и положение источников звука так, чтобы они соответствовали новому положению объектов в игровом пространстве.

Игровому циклу, как правило, предшествует та часть программы, в которой происходит инициализация переменных, загрузка необходимых библиотек и ресурсов. При использовании FMOD, в этой части должны располагаться функции: FSOUND_SetOutput, FSOUND_SetDriver и FSOUND_SetMixer. В качестве параметра для автоматического определения базовой звуковой системы в функцию FSOUND_SetOutput можно передать -1 (0FFFFFFFFh).

После успешной инициализации FMOD необходимо в соответствии со сценарием игры разместить в памяти звуковые данные. Функция FSOUND_Sample_Load, отвечающая за этот процесс, поддерживает несколько звуковых форматов и загрузка, скажем, .mp3 файла с точки зрения программиста ничем не отличается от загрузки файла в формате wav. Здесь полностью проявляются достоинства библиотеки FMOD, позволяющей упростить утомительную процедуру создания звуковых буферов и загрузки в них данных, характерную для DirectSound. Результатом работы FSOUND_Sample_Load будет указатель на образец звука, размещенный в памяти. Если обратиться к терминологии DirectSound, то это будет аналог вторичного звукового буфера. Указанный образец звука может быть использован для создания нескольких источников 3D звука, при этом нет необходимости создавать дополнительные копии этого образца.

Теперь, когда необходимые данные загружены, можно приступать к формированию трёхмерной звуковой картины. Необходимо помнить, что изменение вектора положения и вектора скорости, а также многих иных характеристик источника звука возможно только непосредственно во время воспроизведения звука функциями FSOUND_PlaySound и FSOUND_PlaySoundEx, поэтому, прежде чем поместить источник звука в какую-либо точку пространства, вы должны начать воспроизведение этого звука. Однако при вызове указанных функций звук будет воспроизводиться в той точке, где находится слушатель (Listener), что может нарушить сцену игры (например, монстр, который должен приближаться из самого дальнего закоулка, вдруг зарычит под ухом у игрока). Чтобы избежать подобного казуса, в функции FSOUND_PlaySoundEx() предусмотрен специальный параметр, который сразу же приостанавливает воспроизведение звука. Молчащий источник можно, без риска нарушить сцену игры, поместить в нужное место и возобновить воспроизведение звука. Для того чтобы изменения в звуковой картине вступили в силу, необходимо вызвать функцию FSOUND_Update.

Следует сказать, что в понятиях FMOD воспроизведение звука происходит через канал (channel), поэтому все, что программист собирается сделать с источником 3D звука, необходимо выполнять, пользуясь функциями, которые работают с каналом. Первым параметром в таких функциях выступает номер канала.

Синтаксис вызова функции FSOUND_PlaySoundEx следующий:

Int F_API FSOUND_PlaySoundEx(int channel, FSOUND_SAMPLE *sptr, FSOUND_DSPUNIT *dspunit, signed char startpaused);

В качестве параметров эта функция получает номер канала (channel), через который будет воспроизводится звук,; указатель (дескриптор sptr) на образец звука, размещенный в памяти; указатель (дескриптор dspunit) на блок каналов, к которому должен присоединиться вновь создаваемый канал (этот параметр может иметь значение NULL); флаг приостановки воспроизведения (paused), который должен быть TRUE, чтобы воспроизведение звука сразу же было приостановлено.

Если необходимо создать новый канал, то в параметре channel передается константа FSOUND_FREE. Если необходимо, чтобы звук воспроизводился во всех существующих каналах, то в channel передается константа FSOUND_ALL.

Функция возвращает номер (дескриптор) канала, через который воспроизводится звук. Если возникла ошибка, то функция возвращает -1 (0FFFFFFFFH). Номер (дескриптор) канала необходим для работы с функциями канального уровня, например, FSOUND_3D_SetAttributes.

Таким образом, создание и позиционирование источника звука программно может быть реализовано так:

FSOUND_SAMPLE *samp1 = NULL; int channel1 = -1; /* проверяем версию FMOD */ if (FSOUND_GetVersion()

Следует помнить, что функции FSOUND_PlaySound и FSOUND_PlaySoundEx помещают источник звука в текущую позицию слушателя, поэтому, если в параметре channel этих функций указан номер (дескриптор) существующего канала, то, несмотря на то, что для этого канала функцией FSOUND_3D_SetAttributes была установлена позиция, отличная от позиции слушателя, все равно источник звука переместится в позицию слушателя. Чтобы избежать искажения звуковой картины, необходимо перед вызовом FSOUND_PlaySoundEx сохранить позицию и скорость источника звука в специальных переменных, получив эти значения функцией FSOUND_3D_GetAttributes. После чего вызвать FSOUND_PlaySoundEx с приостановкой воспроизведения; затем переместить источник в нужную точку, воспользовавшись сохраненными значениями, а уж потом продолжить воспроизведение. Указанная последовательность действий, кроме всего прочего, напрямую относится к однократно проигрываемым звукам (то есть к таким источникам, которые не издают звук непрерывно, а звучат лишь при наступлении определенного события в игре).

Для изменения позиции, скорости и ориентации слушателя в пространстве следует использовать функцию FSOUND_3D_Listener_SetAttributes. Вот ее синтаксис:

Void F_API FSOUND_3D_Listener_SetAttributes(const F_FLOAT_API *pos, const F_FLOAT_API *vel, F_FLOAT_API fx, F_FLOAT_API fy, F_FLOAT_API fz, F_FLOAT_API tx, F_FLOAT_API ty, F_FLOAT_API tz);

В качестве параметров эта функция получает указатель на триаду координат позиции (pos), указатель на вектор скорости (vel), X, Y и Z составляющие единичного вектора, определяющего фронтальную ориентацию головы слушателя (fx, fy, fz); X, Y и Z составляющие единичного вектора, определяющего вертикальную ориентацию головы слушателя (tx, ty, tz). Несмотря на тип void, функция, согласно официальной документации, возвращает TRUE, если ее выполнение было успешным, и FALSE в случае ошибки.

В отличие от DirectSound3D, в FMOD может быть не один, а несколько слушателей. Это сделано для игровых приставок, где одно игровое устройство могут использовать одновременно несколько игроков. Выбор текущего слушателя производится при помощи функции FSOUND_3D_Listener_SetCurrent.

Когда игра завершена и в заключительном сегменте кода программы происходит освобождение ресурсов, занятых программой, необходимо использовать функции FSOUND_Sample_Free, которой в качестве параметра передается указатель (дескриптор) фрагмента звуковых данных в памяти, и FSOUND_Close, которая вызывается без параметров и выгружает звуковую систему FMOD.

FSOUND_Sample_Free(samp1); FSOUND_Close();

Обработка ошибок

Большинство функций FMOD, если иное не оговорено в документации, возвращают TRUE в случае успешного завершения. Если же в работе функции возникла ошибка, то возвращается FALSE. Для того чтобы получить дополнительную информацию об ошибке, следует воспользоваться функциями FSOUND_GetError и FMOD_ErrorString. Последняя функция является макросом, поэтому необходимо включить заголовочный файл FMOD_errors.h.

Функция FSOUND_GetError не требует параметров и возвращает код ошибки, возникшей при выполнении функции FMOD. Макрос FMOD_ErrorString получает этот код в качестве параметра и возвращает текстовое описание ошибки. Вот пример вызова этих функций:

/* вывод сообщения об ошибке в консольном режиме */ printf("Error: %s\n", FMOD_ErrorString(FSOUND_GetError()));

Управление ресурсами и звуковые платы нижней ценовой категории

Сегодня существуют различные по производительности и возможностям звуковые карты. Одни из них способны поддерживать до 100 аппаратных каналов для воспроизведения 3D звука, другие - не более четырех. Было бы недальновидно при разработке игр ориентироваться на "слабые" звуковые карты. Однако ошибка, которая может возникнуть при нехватке аппаратных каналов в игре с большим количеством источников звука, может сделать игру совершенно неработоспособной на указанной группе звуковых карт. В качестве выхода из данной ситуации FMOD предлагает использовать функцию FSOUND_SetMinHardwareChannels.

Эта функция вызывается один раз перед вызовом FSOUND_Init и устанавливает минимальнное количество аппаратных каналов, которое должно поддерживаться звуковой картой. После этого либо все из указанного при вызове FSOUND_SetMinHardwareChannels числа каналов будут воспроизводится с использованием аппаратных каналов, либо аппаратная поддержка использоваться не будет и микширование каналов будет происходить программным путем. Иными словами, например, если у вас 16 звуков и карта имеет такое же или большее число аппаратных каналов, то воспроизведение будет идти через эти каналы. Если окажется, что у карты всего 4 канала, то смешивание всех звуков будет выполняться программно.

Поддержка приоритетов

В FMOD реализована система приоритетов. Если множество источников звука должны воспроизводиться на ограниченном числе каналов, то некоторые из них могут быть более важными, чем другие. Если, например, главным действующим лицом в игре выступает стрелок, то воспроизведение звука выстрела было бы, вероятно, самым важным. Так что этому источнику звука (выстрел) следовало бы установить самый высокий приоритет посредством FSOUND_SetPriority. Менее важные звуки не будут воспроизводиться, если уже заняты все доступные каналы.

Заключение

Изложенный выше материал является необходимым для того, чтобы познакомиться с возможностями FMOD в области работы с объёмным звуком и начать использовать эту библиотеку в своих программах. Но одной этой статьи недостаточно, чтобы узнать о всех возможностях библиотеки FMOD. Следующим шагом может стать изучение примеров, входящих в дистрибутивный пакет FMOD.




Top