Поддержка EAX в библиотеке FMOD

Дата публикации:2005
Twitter Facebook Vkontakte

Знакомство со спецификацией EAX

Разработанная и продвигаемая фирмой Creative Labs система пространственной обработки звука Environmental Audio eXtensions™ (EAX) используется многими разработчиками игр для создания естественного объемного звука с учетом специфики того помещения или пространства, где развиваются события игры и где находятся источники звуков. EAX можно представить как набор спецификаций, определяющих модели и алгоритмы для создания звуковых эффектов окружающего пространства или помещения, основанных на реверберации (Environmental Audio означает пространственный звук).

Под понятием «реверберация» (от ср .-век. лат. reverberatio - отражение) понимают послезвучание, сохраняющееся после выключения источника звука и обусловленное неодновременным приходом в данную точку отраженных или рассеянных звуковых волн. Реверберация оказывает значительное влияние на слышимость речи и музыки в помещении.

EAX также включает в себя набор функций API, позволяющих программисту воспользоваться аппаратной поддержкой EAX. На момент подготовки этой статьи уже появилась четвертая версия EAX, которая доступна на сайте Creative Labs в разделе для разработчиков.

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

Поддержка системы EAX обеспечивается на аппаратном уровне встроенными аудиопроцессорами звуковых плат (звуковыми акселераторами). Разумеется, что в первую очередь такая поддержка реализована на платах Creative.В основу EAX положена технология E-mu Environmental Modeling, поддерживаемая аудиопроцессором EMU10K1, установленном на серии звуковых карт SBLive! В моделях EAX учитывается тип звукоизлучателей: наушники, стерео- и квадросистема. Аудиоакселератор EMU10K1 раскладывает любой звуковой поток на множество каналов, а потом на каждый канал в реальном времени накладывает реверберации. Благодаря чему создаются новые звуки, более близкие к их естественному звучанию в реальном пространстве.

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

Изначально предполагалось, что EAX не будет использовать геометрическую модель сцены, то есть источники звука могли быть не связаными с графическими объектами. Главное было создать звуковую атмосферу игровой сцены, то есть воздействовать на эмоциональное состояние игрока подобно тому, как в кинофильме звуковое сопровождение всегда подчеркивает остроту переживаний, акцентируясь на самом важном и пренебрегая незначительными звуковыми подробностями. Руководствуясь этим подходом, создатели EAX в качестве основы выбрали статическую модель звуковой среды, а не ее геометрические параметры. В статической модели автоматически рассчитываются эффекты реверберации и отражения относительно слушателя с учетом размеров помещения, направления звука и других параметров, которые программист может устанавливать для каждого источника звука. Расчет статической модели требует меньших вычислительных ресурсов, чем моделей, основанных на геометрическом подходе. EAX использует подготовленные заранее звуковые модели, которые представляют собой набор числовых значений параметров помещения или пространства. Параметры эти характеризуют не расположение предметов в помещении, как это бывает в геометрической модели, а поведение звуковых волн в таком помещении или пространстве, то есть задержки распространения, степень затухания, звукопоглощение и звукоотражение на разных звуковых частотах. Если по сюжету игры необходимо сменить длинный коридор на большой ангар, то достаточно сменить одну статическую модель (модель коридора) на другую (модель ангара). Модели различных помещений (их числовые значения) представлены в EAX в виде пресетов (предустановок). Такой подход обеспечивает более простое программирование 3D звука в игре, позволяет уменьшить объем вычислений при моделировании звуковой панорамы. Получаемый звук обладает весьма реалистичным звучанием. С другой стороны, статичность метода может служить причиной того, что выбранный пресет в процессе игры может перестать соответствовать графическому (геометрическому) представлению сцены. Например, в геометрической модели, если, например, рухнули стены помещения, то звук изменится в силу самой модели, а не принудительно, исходя из каких-то иных флагов или признаков. В случае статической модели звук будет оставаться таким же, как и до обрушения стен, пока не будет выбран другой пресет.

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

В EAX 2.0 Обновлена реверберационная модель; добавлены эффекты звуковых преград (Occlusions) и препятствий (Obstructions); реализовано отдельное управление ранними и поздними отражениями; возможен продолжительный контроль размеров помещений; учитываются акустические свойства воздуха (поглощение звука). Теперь для использования эффектов Environmental Audio не требуется описание геометрии помещения. EAX 2.0 построен на возможностях первой версии и создает еще более реалистичные эффекты.

EAX 3.0 позволяет осуществить контроль за началом реверберации и ранними отражениями для каждого источника звука; реализует динамический переход между моделями пространства; содержит улучшенную дистанционную модель для автоматического управления реверберацией и начальными отражениями в зависимости от положения источников звука относительно слушателя. В этой спецификации уже происходит некоторый отход от статической модели и в ее состав включены методы, свойственные для геометрических моделей: Расчеты Ray-Tracing (отражение лучей) для получения параметров отражения для каждого источника звука. Кроме того, реализованы отдельные отражения для дальних эхо. Улучшенное дистанционное представление, призванное заменить статические реверберационные модели. EAX 3.0 совмещает вторую версию с новыми возможностями. Более высокий уровень реализма достигается благодаря поддержки местных отражений, изолированных отражений, продолжительных переходов между звуковыми сценами и др.

Средства FMOD для работы с EAX

Популярная среди многих разработчиков (особенно среди энтузиастов, создающих некоммерческое программное обеспечение) библиотека функций работы со звуком FMOD (разработчик Firelight Technologies Pty) предоставляет ряд возможностей для работы с системой EAX. О них далее и пойдет речь.

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

На данный момент (речь идет о версии FMOD 3.74) библиотека поддерживает EAX 2.0 и 3.0 (однако, предполагается, что спецификации EAX совместимы "снизу вверх", то есть настройки для EAX 2.0 будут корректно поддерживаться звуковыми картами, реализующими EAX 3.0 и т.д.).

Проверка наличия аппаратной поддержки EAX

Прежде чем использовать EAX в целях создания реалистичной звуковой панорамы, необходимо определить, есть ли такая поддержка у звуковой карты. Для этой цели в библиотеке FMOD предназначена функция FSOUND_GetDriverCaps(). В качестве параметра эта функция получает целое число, указывающее номер звуковоспроизводящего устройства в системе. Нулевое значение соответствует устройству принятому по умолчанию. На компьютерах с одной звуковой картой устройство по умолчанию и есть эта звуковая карта. В качестве второго параметра функция получает указатель на целочисленную переменную, то есть на адрес в памяти, по которому будет записано целое число, представляющее собой набор битовых полей. Эти битовые поля указывают, какие режимы работы поддерживает звуковая карта. При удачном выполнении функция возвращает TRUE, при ошибке - FALSE.

В файле fmod.h определены три константы: FSOUND_CAPS_HARDWARE, FSOUND_CAPS_EAX2, FSOUND_CAPS_EAX3, которые задают битовые поля, свидетельствующие о поддержке аппаратного 3D звука, EAX 2.0 и EAX 3.0 соответственно.

/* Пример анализа возможностей звуковой карты */
/* для win32 */
...
UINT caps = 0;
UINT device_id = 0; //устройство по умолчанию
char msg_buf [256]; //буфер для сообщения
	FSOUND_GetDriverCaps(device_id, &caps);
msg_buf[0] = 0;
	if (!caps) 
		sprintf(msg_buf, "Нет аппаратной поддержки 3D звука и EAX.\r\n");
	if (caps & FSOUND_CAPS_HARDWARE)
		strcat(msg_buf, "* Поддержка 3D звука\r\n");
	if (caps & FSOUND_CAPS_EAX2)
		strcat(msg_buf, "* Поддержка EAX 2 \r\n");
	if (caps & FSOUND_CAPS_EAX3)
		strcat(msg_buf, "* Поддержка EAX 3 \r\n");
// Вывод сообщения
MessageBox (NULL, msg_buf, "Информация", MB_OK);
...

Функция FSOUND_GetDriverCaps () должна вызываться до вызова функции FSOUND_Init () или после вызова функции FSOUND_Close ();

Структуры FSOUND_REVERB_PROPERTIES и FSOUND_REVERB_CHANNELPROPERTIES

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

Структура FSOUND_REVERB_PROPERTIES содержит параметры, общие для всех существующих источников звука. Структура FSOUND_REVERB_CHANNELPROPERTIES характеризует отдельно взятый источник (канал). Ниже представлены списки членов этих структур: сначала для FSOUND_REVERB_PROPERTIES, а затем FSOUND_REVERB_CHANNELPROPERTIES. Подробное рассмотрение физического смысла указанных параметров выходит за рамки статьи. По всем вопросам следует обращаться к документации по EAX.

/* FSOUND_REVERB_PROPERTIES */
/ Числа отражают диапазон значений и значение, установленное по умолчанию. */
/* Целые числа, как правило, представляют децибелы, */
/* вещественные числа представляют линейную зависимость. */
unsigned int Environment
/* 0 , 25 , 0 , sets all listener properties (WIN32/PS2 only) */
float EnvSize
/* 1.0 , 100.0 , 7.5 , Размер помещения (пространства) в метрах(WIN32 only) */
float EnvDiffusion
/* 0.0 , 1.0 , 1.0 , Проницаемость (диффузность) пространства(WIN32/XBOX) */
int Room
/* -10000, 0 , -1000 , Уровень выраженности эффекта комнаты (на средних частотах) (WIN32/XBOX/PS2) */
int RoomHF
/* -10000, 0 , -100 , Относительный уровень выраженности эффекта комнаты на высоких частотах(WIN32/XBOX) */
int RoomLF
/* -10000, 0 , 0 , Относительный уровень выраженности эффекта комнаты на низких частотах(WIN32 only) */
float DecayTime
/* 0.1 , 20.0 , 1.49 , Время затухания реверберации на средних частотах(WIN32/XBOX) */
float DecayHFRatio
/* 0.1 , 2.0 , 0.83 , high-frequency to mid-frequency decay time ratio (WIN32/XBOX) */
float DecayLFRatio
/* 0.1 , 2.0 , 1.0 , low-frequency to mid-frequency decay time ratio (WIN32 only) */
int Reflections
/* -10000, 1000 , -2602 , Уровень раннего отражения относительно эффекта комнаты(WIN32/XBOX) */
float ReflectionsDelay
/* 0.0 , 0.3 , 0.007 , Время задержки начальной реверберации(WIN32/XBOX) */
float ReflectionsPan[3]
/* , , [0,0,0], Панорамный вектор раннего отражения (WIN32 only) */
int Reverb
/* -10000, 2000 , 200 , Уровень позднего отражения относительно эффекта комнаты (WIN32/XBOX) */
float ReverbDelay
/* 0.0 , 0.1 , 0.011 , Время задержки позднего отражения относительно начальной реверберации (WIN32/XBOX) */
float ReverbPan[3]
/* , , [0,0,0], Панорамный вектор позднего отражения (WIN32 only) */
float EchoTime
/* .075 , 0.25 , 0.25 , echo time (WIN32/PS2 only. PS2 = Время запаздывания для эхо/DELAY modes only) */
float EchoDepth
/* 0.0 , 1.0 , 0.0 , Глубина эха (WIN32/PS2 only. PS2 = Feedback level for ECHO mode only) */
float ModulationTime
/* 0.04 , 4.0 , 0.25 , Время (период) модуляции(WIN32 only) */
float ModulationDepth
/* 0.0 , 1.0 , 0.0 , Глубина модуляции(WIN32 only) */
float AirAbsorptionHF
/* -100 , 0.0 , -5.0 , Изменение уровня на единицу длины (поглощение) на высоких частотах(WIN32 only) */
float HFReference
/* 1000.0, 20000 , 5000.0 , reference high frequency (hz) (WIN32/XBOX) */
float LFReference
/* 20.0 , 1000.0, 250.0 , reference low frequency (hz) (WIN32 only) */
float RoomRolloffFactor
/* 0.0 , 10.0 , 0.0 , Подобно FSOUND_3D_SetRolloffFactor но для эффекта комнаты(WIN32/XBOX) */
float Diffusion
/* 0.0 , 100.0 , 100.0 , Value that controls the echo density in the late reverberation decay. (XBOX only) */
float Density
/* 0.0 , 100.0 , 100.0 , Value that controls the modal density in the late reverberation decay (XBOX only) */
unsigned int Flags
/* FSOUND_REVERB_FLAGS - Модифицирует поведение вышеуказанных членов структуры (WIN32/PS2 only) */
/* FSOUND_REVERB_CHANNELPROPERTIES */
int Direct
/* -10000, 1000, 0, direct path level (at low and mid frequencies) (WIN32/XBOX) */
int DirectHF
/* -10000, 0, 0, relative direct path level at high frequencies (WIN32/XBOX) */
int Room
/* -10000, 1000, 0, Уровень выраженности эффекта комнаты (на низких и средних частотах) (WIN32/XBOX/PS2) */
int RoomHF
/* -10000, 0, 0, Относительный уровень эффекта комнаты на высоких частотах(WIN32/XBOX) */
int Obstruction
/* -10000, 0, 0, Основное управление обструкцией (attenuation at high frequencies) (WIN32/XBOX) */
float ObstructionLFRatio
/* 0.0, 1.0, 0.0, Уровень обструкции на низких частотах re. main control (WIN32/XBOX) */
int Occlusion
/* -10000, 0, 0, main Управление окклюзией (attenuation at high frequencies) (WIN32/XBOX) */
float OcclusionLFRatio
/* 0.0, 1.0, 0.25, occlusion low-frequency level re. main control (WIN32/XBOX) */
float OcclusionRoomRatio
/* 0.0, 10.0, 1.5, relative occlusion control for room effect (WIN32) */
float OcclusionDirectRatio
/* 0.0, 10.0, 1.0, relative occlusion control for direct path (WIN32) */
int Exclusion
/* -10000, 0, 0, main exlusion control (attenuation at high frequencies) (WIN32) */
float ExclusionLFRatio
/* 0.0, 1.0, 1.0, exclusion low-frequency level re. main control (WIN32) */
int OutsideVolumeHF
/* -10000, 0, 0, outside sound cone level at high frequencies (WIN32) */
float DopplerFactor
/* 0.0, 10.0, 0.0, like DS3D flDopplerFactor but per source (WIN32) */
float RolloffFactor
/* 0.0, 10.0, 0.0, like DS3D flRolloffFactor but per source (WIN32) */
float RoomRolloffFactor
/* 0.0, 10.0, 0.0, like DS3D flRolloffFactor but for room effect (WIN32/XBOX) */
float AirAbsorptionFactor
/* 0.0, 10.0, 1.0, multiplies AirAbsorptionHF member of FSOUND_REVERB_PROPERTIES (WIN32) */
int Flags
/* FSOUND_REVERB_CHANNELFLAGS - modifies the behavior of properties (WIN32) */

Пресеты

Как уже говорилось, фирма Creative Labs предоставляет наборы числовых значений для членов, входящих в указанные структуры. Эти числовые значения присутствуют в библиотеке FMOD как предустановки (пресеты). Благодаря пресетам отпадает необходимость самостоятельно проводить физические эксперименты по определению параметров того или иного помещения, а также звукопоглощения и звукоотражения материала, из которого сложены стены. Пресеты составлены только для структуры FSOUND_REVERB_PROPERTIES. Числовые параметры пресетов можно посмотреть в файле fmod.h, в котором они объявлены посредством инструкции #define. В силу этого пресеты можно использовать только для инициализации структур при их объявлении, например:

FSOUND_REVERB_PROPERTIES prop = FSOUND_PRESET_AUDITORIUM;

Вот список пресетов, используемых при работе с DirectSound3D в системе Windows:

  • FSOUND_PRESET_OFF - обработка реверберации отключена
  • FSOUND_PRESET_GENERIC - параметры по умолчанию
  • FSOUND_PRESET_PADDEDCELL - "келья (палата), обитая материалом"
  • FSOUND_PRESET_ROOM - "комната"
  • FSOUND_PRESET_BATHROOM - "ванная комната"
  • FSOUND_PRESET_LIVINGROOM - "жилая комната"
  • FSOUND_PRESET_STONEROOM - "комната с каменными стенами"
  • FSOUND_PRESET_AUDITORIUM - "аудитория"
  • FSOUND_PRESET_CONCERTHALL - "концертный зал"
  • FSOUND_PRESET_CAVE - "пещера"
  • FSOUND_PRESET_ARENA - "арена"
  • FSOUND_PRESET_HANGAR "ангар"
  • FSOUND_PRESET_CARPETTEDHALLWAY - "коридор (прихожая), выложенный коврами"
  • FSOUND_PRESET_HALLWAY - "коридор" ("прихожая")
  • FSOUND_PRESET_STONECORRIDOR - "коридор с каменными стенами и полом"
  • FSOUND_PRESET_ALLEY -"аллея"
  • FSOUND_PRESET_FOREST - "лес"
  • FSOUND_PRESET_CITY - "город"
  • FSOUND_PRESET_MOUNTAINS - "скалы"
  • FSOUND_PRESET_QUARRY - "карьер"
  • FSOUND_PRESET_PLAIN - "степь"
  • FSOUND_PRESET_PARKINGLOT - "автостоянка"
  • FSOUND_PRESET_SEWERPIPE - "канализационная труба"
  • FSOUND_PRESET_UNDERWATER - "под водой"
  • FSOUND_PRESET_DRUGGED - "заторможенный"
  • FSOUND_PRESET_DIZZY - "головокружительный"
  • FSOUND_PRESET_PSYCHOTIC - "психотический"

Установка и чтение пространственных параметров

Для назначения определенных пространственных параметров источнику объемного звука в библиотеке FMOD предназначены функции FSOUND_Reverb_SetProperties () и FSOUND_Reverb_SetChannelProperties (). Для получения установленных параметров, служат обратные функции FSOUND_Reverb_GetProperties () и FSOUND_Reverb_GetChannelProperties (). Установку параметров реверберации можно выполнять и во время воспроизведения звука. Для того чтобы новые параметры вступили в силу, необходимо вызвать функцию FSOUND_Update().

Функции FSOUND_Reverb_SetProperties () и FSOUND_Reverb_GetProperties () предназначены для установки и получения общих параметров окружающего пространства соответственно. Обе функции получают один единственный параметр - указатель на структуру FSOUND_REVERB_PROPERTIES , соответствующую спецификации EAX. В случае FSOUND_Reverb_SetProperties () этот указатель должен адресовать уже инициализированную структуру, заполненную необходимыми числовыми значениями. В случае FSOUND_Reverb_GetProperties () указатель адресует область памяти, предназначенную для сохранения числовых значений. При успешном завершении функции возвращают TRUE, в противном случае - FALSE.

/* Пример установки параметров реверберации */
FSOUND_REVERB_PROPERTIES props = FSOUND_PRESET_STONEROOM;
if (!FSOUND_Reverb_SetProperties (&props))
{
/* обработка ошибки */
...
};
FSOUND_Update();
...

Отдельному источнику звука (каналу) можно назначить параметры реверберационной модели (в том числе и такие, как обструкция и окклюзия) посредством функции FSOUND_Reverb_SetChannelProperties (), а прочитать их с помощью FSOUND_Reverb_GetChannelProperties (). Эти функции получают два параметра. Первый, как и для всех функций FMOD, работающих с каналами, это номер канала, через который идет воспроизведение звука. Второй параметр - это указатель на структуру FSOUND_REVERB_CHANNELPROPERTIES. При вызове FSOUND_Reverb_SetChannelProperties() он должен адресовать уже инициализированную структуру, а при вызове FSOUND_Reverb_GetChannelProperties () - свободное место в памяти, достаточное для сохранения полученных значений. Для функции FSOUND_Reverb_SetChannelProperties () bбиблиотека FMOD не располагает пресетами, поэтому выбор числовых значений для тех или иных членов структуры FSOUND_REVERB_CHANNELPROPERTIES ложится на плечи программиста.

/* Пример установки параметров реверберации */
/* для отдельного источника звука */
...
int channel; // номер канала 
FSOUND_SAMPLE *samp = NULL; // указатель на звуковой буфер
// инициализация структуры необходимыми значениями
FSOUND_REVERB_CHANNELPROPERTIES channel_props = {... }; 
// загрузка звуковых данных
samp = FSOUND_Sample_Load (FSOUND_FREE, "motor.wav", FSOUND_HW3D | FSOUND_LOOP_NORMAL, 0, 0);
// открытие канала воспроизведения
	channel = FSOUND_PlaySound(FSOUND_FREE, samp);
// установка параметров реверберации
if (!FSOUND_Reverb_SetChannelProperties (channel, &channel_props))
{
/* обработка ошибки */
...
};
FSOUND_Update();
...

Пример программы

В качестве примера работы с функциями FMOD и системой EAX предлагается программа на языке программирования Си (ANSI C), создающая приложение Windows в форме диалогового окна, в котором можно выбрать из списка один из пресетов и прослушать, как изменится звучание источника объемного звука. При запуске приложения выводится диалог для выбора звукового файла. Кроме того, приложение позволяет просмотреть параметры звуковой карты: наличие аппаратной поддержки для 3D звука и EAX (разумеется, что эффекты пространственного звучания будут иметь место только, если звуковая карта поддерживает EAX). Программа написана и откомпилирована при помощи пакета lccwin32, однако программисту, использующему иную среду разработки, не составит труда адаптировать исходный код для своих нужд. Следует учесть, что в состав FMOD входят несколько библиотек (.lib), каждая из которых предназначена для своего компилятора.

  • fmodbc.lib - для Borland C Builder
  • fmodlcc.lib - для lccwin32
  • fmodvc.lib - для Microsoft Visual C/C++
  • fmodwc.lib - для Watcom C++

В предлагаемом примере используются функции Win32 API и библиотеки FMOD. Для работы программы вы должны установить у себя на компьютере библиотеку fmod или поместить в папку с исполняемым файлом (eaxdemo.exe) файл библиотеки fmod.dll.



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2017