Программирование объемного звука в DirectSound3D
Основные черты и понятия DirectSound3D
Построение объемной звуковой картины
Минимальное и максимальное расстояние до источника
Режимы пространственной обработки источника
Немедленное и отложенное применение установок
Общая схема взаимодействия программы и DirectSound3D
Программирование в DirectSound3D
Средства разработки, включаемые файлы и библиотеки
Типы и структуры, используемые при работе с подсистемой
D3DVALUE — тип скалярного значения
D3DVECTOR — тип векторного значения
DSBUFFERDESC — описатель создаваемого буфера
DS3DBUFFER — описатель источника звука
DS3DLISTENER — описатель слушателя
Первичные и производные объекты
Перечень интерфейсов DirectSound3D
Значения, возвращаемые методами интерфейсов
Интерфейс IDirectSound3DBuffer
GetMaxDistance — запрос максимального расстояния
GetMinDistance — запрос минимального расстояния
SetMaxDistance — установка максимального расстояния
SetMinDistance — установка минимального расстояния
GetMode — запрос режима пространственной обработки
SetMode — установка режима пространственной обработки
GetPosition — запрос текущих координат
SetPosition — установка координат
GetConeAngles — запрос ширины конусов
GetConeOrientation — запрос направления источника
GetConeOutsideVolume — запрос громкости за пределами конусов
SetConeAngles — установка ширины конусов
SetConeOrientation — установка направления источника
SetConeOutsideVolume — установка громкости за пределами конусов
GetVelocity — запрос скорости перемещения
SetVelocity — установка скорости перемещения
GetAllParameters — запрос всех параметров источника
SetAllParameters — установка всех параметров источника
Интерфейс IDirectSound3DListener
GetOrientation — запрос направления слушателя
SetOrientation — установка направления слушателя
GetPosition — запрос координат слушателя
SetPosition — установка координат слушателя
GetDistanceFactor — запрос масштаба расстояния
SetDistanceFactor — установка масштаба расстояния
GetDopplerFactor — запрос коэффициента эффекта Доплера
SetDopplerFactor — установка коэффициента эффекта Доплера
GetRolloffFactor — запрос коэффициента затухания
SetRolloffFactor — установка коэффициента затухания
GetVelocity — запрос скорости перемещения
SetVelocity — установка скорости перемещения
GetAllParameters — запрос всех параметров слушателя
SetAllParameters — установка всех параметров слушателя
CommitDeferredSettings — фактическое применение установок
Оптимизация вывода звука в DirectSound3D
Оптимизация смены параметров звука
Использование трехмерной обработки
Очередность создания источников звука
Глушение источника на расстоянии
Пример программы, создающей пространственный звук
DirectSound3D — расширение базовой подсистемы DirectSound, предназначенное для создания объемной звуковой картины из отдельных источников звука. В отличие от «плоского» стереофонического звука, который получается в DirectSound, расширение DirectSound3D моделирует процесс распространения звука в пространстве и его восприятие слушателем с учетом основных физических законов и параметров среды. В результате слушатель даже в обычных стереонаушниках может четко различать, приходит звук спереди или сзади, сверху или снизу, близко или далеко находится источник и т.п.
В DirectSound3D применяется концепция виртуального пространства — единая с подсистемой Direct3D, отвечающей за построение объемных изображений, что позволяет использовать единые координаты для изображения и озвучивания объектов.
Поскольку DirectSound3D является не самостоятельной подсистемой, а расширением базовой DirectSound, то онлайновая справочная система Microsoft по DirectSound3D является частью справочной системы по DirectSound.
В этой статье мы расскажем о программировании DirectSound3D из пакета DirectX 7.0.
Основные черты и понятия DirectSound3D
Назначение и структура
Расширение DirectSound3D является производным базовой подсистемы DirectSound. Основным интерфейсом, через который происходит доступ к звуковому адаптеру, по-прежнему является IDirectSound, а параметры объемного звучания управляются интерфейсами IDirectSound3DBuffer (описатель буфера источника объемного звука) и IDirectSound3DListener (описатель слушателя объемной звуковой картины).
Ряд индивидуальных параметров задается для каждого источника в отдельности; общие для всего звукового пространства параметры считаются параметрами слушателя и задаются посредством его интерфейса.
Построение объемной звуковой картины
Звуковая картина строится подсистемой DirectSound3D в трехмерном пространстве, где присутствуют звуковые объекты двух видов:
- Произвольное количество пространственных источников (sources) звука с заданными параметрами. Источники излучают звук, который распространяется в пространстве.
- Один слушатель, воспринимающий звуковые колебания из пространства.
Источники звука и слушатель являются объектами в трехмерном звуковом пространстве. Каждый объект имеет следующие параметры:
- Координаты — абсолютные или относительные трехмерные координаты объекта в пространстве.
- Ориентация — направленность объекта. Для источника звука ориентация определяет основное направление, в котором излучается звук, а для слушателя — откуда он получает наибольшее количество звуковых сигналов.
- Скорость и направление перемещения — параметры движения источника в пространстве.
Виртуальный источник звука
Источник звука может быть точечным (ненаправленным) и векторным (направленным). По умолчанию источник считается точечным, то есть он излучает одинаково во всех направлениях. Для направленного источника задаются ориентация и параметры звучания в виде двух вложенных углов (конусов): внутренний (inside cone — конус видимости источника) и наружный (outside cone — конус слышимости источника).
В пределах конуса видимости (слушателя и источник ничто не разделяет, и слушатель может видеть источник непосредственно) интенсивность звука определяется только расстоянием. За пределами этого конуса, но внутри конуса слышимости (источник закрыт от слушателя, но не наглухо) интенсивность падает по мере удаления слушателя от границы конуса видимости. За пределами конуса слышимости интенсивность сразу падает до нуля (источник не слышен).
В промежуточной зоне (зоне разности углов конусов) интенсивность падает с заданной скоростью, которая задается приложением. Точечный (ненаправленный) источник является частным случаем этой модели: здесь углы обоих конусов равны 360°, а затухание равно нулю.
Источник также может быть независимым либо привязанным к слушателю. Параметры независимых источников (координаты, скорость, направление) задаются абсолютными в пространстве, а привязанных — относительно головы слушателя. Таким образом, привязанные источники перемещаются в пространстве вместе со слушателем. Отношение источника к слушателю задается так называемым режимом обработки (моделирования).
Источники звука, как и в базовом DirectSound, представлены своими вторичными звуковыми буферами.
Виртуальный слушатель
Слушатель представлен в пространстве своей головой. Подсистема моделирует распространение звуковых колебаний в среде, рассчитывает их параметры в области головы слушателя и создает в излучателях такой звуковой сигнал, чтобы реальный слушатель ощущал себя в заданном месте созданной звуковой картины.
В процессе моделирования распространения звука учитывается затухание звука на расстоянии (rolloff), эффект Доплера (Doppler), позиция слушателя по отношению к направленному источнику звука и т.п.
При моделировании восприятия звука слушателем используется техника «виртуальной головы», учитывающая такие параметры, как угол падения звука по отношению к голове слушателя, разность фаз прихода волны в левое и правое ухо, проникновение волн в "противоположное" ухо через голову с ослаблением высоких частот, проникновение волн сзади через ушные раковины и т.п.
Ориентация слушателя задается при помощи двух ортогональных векторов с точками начала в центре головы. Верхний (top) вектор указывает направление макушки слушателя, а передний (front) — направление лица. Векторы должны быть ортогональными, иначе подсистема корректирует положение переднего вектора, устанавливая его под прямым углом к верхнему.
Слушатель звука представлен в DirectSound3D первичным звуковым буфером. Следовательно, слушатель в виртуальном звуковом пространстве может быть только один.
Координаты объектов
Координаты в виртуальном звуковом пространстве задаются в декартовой системе координат, где ось X направлена вправо, Y — вверх, а Z — вдаль (от себя). Система координат принята такой же, как и в подсистеме Direct3D (управление объемными изображениями). Это позволяет использовать единое пространство для изображения и звука (например, в игровой программе).
Единицы измерения расстояний
Расстояния в пространстве задаются в метрах. При желании можно указывать расстояния в других единицах (например, футах) — тогда необходимо задать масштаб (distance factor). Значение параметра масштаба представляет собой размер выбранной единицы в метрах; подсистема будет делить на него заданные значения, чтобы получить расстояния в метрах.
Скорость движения объекта
Подсистема DirectSound никогда не перемещает объекты сама — это может делать только приложение. Скорости объектов нужны только для вычисления эффекта Доплера (частотного смещения из-за относительного сложения скоростей). Скорость перемещения объекта задается в метрах в секунду, отдельно по каждой из координат. Здесь также действует параметр масштаба.
Минимальное и максимальное расстояние до источника
Поскольку затухание звука ощутимо проявляется только на определенных расстояниях, подсистема старается исключить лишнюю обработку в случаях, когда источник находится либо в непосредственной близости от слушателя, либо очень далеко. Для этого введено два предельных расстояния: минимальное (minimum distance) и максимальное (maximum distance).
При приближении источника на минимальное расстояние подсистема воспроизводит его на стандартной (установленной) громкости, а при дальнейшем приближении источника к слушателю громкость его звучания больше не возрастает. При удалении источника дальше максимального расстояния его громкость аналогичным образом перестает ослабевать. Возможно также автоматическое глушение (остановка) источника при достижении максимального расстояния (флаг MUTE3DATMAXDISTANCE), что позволяет перераспределять аппаратные ресурсы в пользу источников с большей слышимостью.
Установление разумного минимального расстояния позволяет ограничить предельную громкость сильных звуков, чтобы они не забивали все остальные звуки. (Microsoft в своей документации приводит хороший пример с ревом реактивного самолета и жужжанием пчелы, рекомендуя записывать их на сравнимой громкости и устанавливать реалистичные минимальные расстояния). Разумное же максимальное расстояние позволяет сохранить на минимуме слышимость источника, звук которого важен для общей картины независимо от его фактической удаленности от слушателя.
Напротив, при использовании глушения нужно позаботиться, чтобы при достижении максимального расстояния источник уже не был слышен, иначе в моменты его автоматического глушения и перезапуска звук будет пропадать и возникать внезапно, резко.
По умолчанию минимальное расстояние установлено в один метр, а максимальное — в большом числовом значении (источник перестает быть слышимым задолго до того, как подсистема перестанет уменьшать громкость).
Стереофонические источники
Поскольку подсистема сама создает звуковую картину в пространстве, использование стереофонических источников теряет смысл. Если пространственный источник заявлен стереофоническим, то подсистема автоматически смешивает стереоканалы в один, что только приводит к дополнительным накладным расходам. По той же причине для пространственных источников запрещено управление панорамой.
Режимы пространственной обработки источника
Для каждого пространственного источника может быть задан один из трех режимов обработки (processing modes):
- Обычный (normal) — независимый источник, координаты задают расположение и ориентацию источника в пространстве независимо от положения слушателя. В этом режиме устанавливаются источники, не имеющие отношения к слушателю.
- Относительно головы (head-relative) — связанный источник, координаты задают расположение источника по отношению к голове слушателя (к координатам центра головы). В этом режиме устанавливаются источники, принадлежащие слушателю и перемещающиеся вместе с ним.
- Без обработки (disabled) — пространственная обработка не выполняется, звучание источника независимо от его параметров всегда считается исходящим из центра головы слушателя.
Выраженность эффектов
В подсистеме возможна программная регулировка выраженности (яркости) пространственных эффектов — затухания на расстоянии (rolloff) и частотного смещения при движении объекта (эффект Доплера). Посредством этого достигается оптимальный баланс между объемом пространства и влиянием на звук расстояний/скоростей. Если действие происходит в пределах ограниченного помещения, то можно искусственно расширить его за счет более яркого моделирования эффектов, а в случае большого пространства, то — наоборот, уменьшить, чтобы громкие звуки от ближайших источников не били по барабанным перепонкам.
Степень выраженности эффектов задается коэффициентом по отношению к реальному проявлению эффекта. Например, коэффициент 3 соответствует трехкратному усилению эффекта, а 0,5 — двукратному его ослаблению. Моделирование каждого из этих эффектов также может быть полностью отключено путем задания нулевого коэффициента.
Немедленное и отложенное применение установок
Операции установки параметров источника или слушателя часто приводят к полному пересчету звуковой картины, а этот процесс требует значительного количества процессорного времени. При использовании большого количества источников звука и при быстром изменении их параметров (типичная ситуация в сложной игре) установки выполняются группами, отчего происходит много ненужных пересчетов. Для оптимизации этого процесса в подсистеме имеются функции одновременной установки всех параметров, однако они не всегда удобны. Дополнительно в каждой функции установки параметров указывается, когда реально должна быть выполнена установка: немедленно или после вызова специальной функции (отложенная установка). Таким образом, программа может выполнить серию отложенных установок, которые просто модифицируют параметры объектов, после чего затребовать фактическое применение параметров, при котором уже будет выполнен обсчет звукового пространства.
Общая схема взаимодействия программы и DirectSound3D
Программа начинает работу с подсистемой обычным образом, создавая объект IDirectSound для устройства воспроизведения, как было описано ранее (CD-ROM к №12’2000). Создание объекта-модели виртуального звукового пространства выполняется посредством создания первичного пространственного звукового буфера (флаги PRIMARYBUFFER и CTRL3D). Затем у объекта буфера при помощи метода QueryInterface запрашивается объект с интерфейсом IDirectSound3DListener, описывающий слушателя пространственного звука.
При создании вторичных буферов источников звука также задается флаг CTRL3D, указывающий, что создаваемый источник будет пространственным. Если этот флаг не задан, будет создан обычный источник — ненаправленный и находящийся в центре головы слушателя; звучание этого источника не будет участвовать в моделировании распространения звука в пространстве, а лишь будет смешиваться с остальным звучанием непосредственно перед подачей звука в излучатели.
Интерфейс объекта пространственного источника запрашивается у объекта буфера, снабженного флагом CTRL3D, посредством метода IDirectSoundBuffer::QueryInterface. В результате создается объект пространственного источника и его буфера с интерфейсом IDirectSound3DBuffer, через который доступно управление координатами, режимами и прочими параметрами источника.
По умолчанию источник считается независимым; для источников других типов нужно установить режим пространственной обработки методом SetMode.
Для каждого источника рекомендуется установить предельные расстояния, по которым будет рассчитываться его слышимая интенсивность методами SetMinDistance и SetMaxDistance. Если этого не сделать, то будут использоваться значения по умолчанию: ближе одного метра интенсивность перестает нарастать, а при удалении даже на значительное расстояние обработка источника будет отнимать системные ресурсы, даже если звук давно перестал быть слышимым.
При использовании иных единиц измерения расстояний, отличных от метров, необходимо установить поправку методом SetDistanceFactor. Этот же метод можно использовать для произвольного масштабирования звукового пространства, сразу меняя его геометрические размеры.
При необходимости можно отрегулировать степень выраженности эффектов — эффекта Доплера и эффекта затухания звука, чтобы создать у слушателя реалистичное, но ненавязчивое ощущение пространственной звуковой картины. Это делается методами SetDopplerFactor и SetRolloffFactor.
Всеми перемещениями объектов — источников и слушателя — заведует исключительно программа. Движение объекта в пространстве реализуется последовательным применением методов IDirectSound3DBuffer::SetPosition и IDirectSound3DListener::SetPosition. При этом программа должна корректно отслеживать скорость движения объекта и передавать ее подсистеме методами IDirectSound3DBuffer::SetVelocity и IDirectSound3DListener::SetVelocity.
Для направленных источников следует задать и поддерживать ориентацию и ширину конусов видимости и слышимости вместе с законом изменения интенсивности в их пределах. Для этого служат методы SetConeOrientation, SetConeAngles и SetConeOutsideVolume.
Для слушателя следует задать и поддерживать его ориентацию методом SetOrientation.
Программирование в DirectSound3D
Средства разработки, включаемые файлы и библиотеки
Все необходимые включаемые файлы и библиотеки входят в набор для программирования DirectSound.
Типы и структуры, используемые при работе с подсистемой
D3DVALUE — тип скалярного значения
Эквивалентен типу float. Представляет скалярное (одномерное) значение — координат, скорости, угла и т.п.
D3DVECTOR — тип векторного значения
Представляет трехмерный вектор и эквивалентен следующей структуре:
union { D3DVALUE x; D3DVALUE dvX; }; union { D3DVALUE y; D3DVALUE dvY; }; union { D3DVALUE z; D3DVALUE dvZ; };
DSBUFFERDESC — описатель создаваемого буфера
Структура была описана в первом выпуске статьи, посвященном программированию базовой подсистемы DirectSound. Здесь мы расскажем только об отдельных флагах и полях dwFlags, имеющих отношение к пространственному звуку, а также о поле guid3DAlgorithm, введенном в DirectX 7 и имеющем отношение только к пространственному звуку:
- dwFlags — флаги требуемых возможностей и режимов работы создаваемого звукового буфера. Константы имен флагов имеют префикс DSBCAPS_:
PRIMARYBUFFER |
Буфер является первичным. Если флаг не установлен, то буфер является вторичным. Первичный звуковой буфер в DirectSound3D представляет слушателя, а вторичные буферы — источники звука |
---|---|
CTRL3D |
Создаваемый буфер будет представлять источник пространственного звука, иначе будет создан источник обычного, «плоского» звука. Для пространственного источника допускается управление пространственным звучанием (координаты, скорость, направление и т.п.), однако запрещено управление стереопанорамой |
MUTE3DATMAXDISTANCE |
Звучание источника должно быть заглушено (остановлено) при достижении максимального расстояния от слушателя, на котором звук перестает быть слышимым. В этот момент DirectSound3D прекращает снижать громкость источника и останавливает его, чтобы не создавать лишних расходов. При уменьшении расстояния звучание будет запущено автоматически. Этот флаг допускается только для пространственных источников |
- guid3DAlgorithm — алгоритм моделирования «виртуальной головы» для данного источника звука, применяемый в случае программной (software) обработки (смешивания). При использовании аппаратной (hardware) обработки это поле игнорируется. Доступность алгоритмов зависит от способа реализации подсистемы DirectSound: в виде драйвера VxD (Win 9x/ME) либо WDM (Win 98/ME, 2000). Имена констант для алгоритмов имеют префикс DS3DALG_:
HRTF_FULL |
Доступен только с драйверами WDM. Запрашивает использование полной модели «виртуальной головы», что дает максимальную реалистичность звучания в сочетании с интенсивным использованием процессора |
---|---|
HRTF_LIGHT |
Доступен только с драйверами WDM. Запрашивает использование упрощенной модели «виртуальной головы», менее реалистичной по звучанию, однако более эффективной по использованию процессора |
NO_VIRTUALIZATION |
Доступен с драйверами любого типа. Отключает моделирование «виртуальной головы», сводя звуковую картину к обычному стереозвучанию. Все звуковые колебания просто складываются в точке, соответствующей центру головы, с масштабированием громкости в стереоканалах. Этот режим позволяет подсистеме использовать средства обычной двухмерной аппаратной обработки при отсутствии свободных пространственных аппаратных голосов (каналов) |
DEFAULT |
Доступен с драйверами любого типа. Позволяет подсистеме выбирать наиболее подходящий алгоритм самостоятельно (по умолчанию). Пока подсистема выбирает режим NO_VIRTUALIZATION, однако в будущем планируется сделать установку режима по умолчанию доступной для пользователя |
DS3DBUFFER — описатель источника звука
Описывает параметры источника пространственного звука.
DWORD dwSize; D3DVECTOR vPosition; D3DVECTOR vVelocity; DWORD dwInsideConeAngle; DWORD dwOutsideConeAngle; D3DVECTOR vConeOrientation; LONG lConeOutsideVolume; D3DVALUE flMinDistance; D3DVALUE flMaxDistance; DWORD dwMode;
- dwSize — размер структуры в байтах. Устанавливается приложением.
- vPosition — текущие координаты источника звука.
- vVelocity — скорость перемещения источника. Задается в разложенном виде, скоростями по каждой координате в отдельности
- dwInsideConeAngle — угол внутреннего звукового конуса (конуса видимости).
- dwOutsideConeAngle — угол наружного звукового конуса (конуса слышимости).
- vConeOrientation — направление излучения звука направленного источника.
- lConeOutsideVolume — громкость звука на границе конуса слышимости направленного источника.
- flMinDistance — минимальное расстояние между источником и слушателем.
- flMaxDistance — максимальное расстояние между источником и слушателем.
- dwMode — режим пространственной обработки источника. Имена констант режимов имеют префикс DS3DMODE_:
NORMAL |
Обычный режим, независимый источник (по умолчанию). Пространственные параметры источника задаются абсолютными величинами |
---|---|
HEADRELATIVE |
Связанный источник. Пространственные параметры источника задаются относительно головы слушателя |
DISABLE |
Источник не участвует в моделировании распространения звука, считается расположенным в центре головы слушателя, а звучание подается непосредственно на излучатели |
DS3DLISTENER — описатель слушателя
Описывает параметры слушателя пространственного звука.
DWORD dwSize; D3DVECTOR vPosition; D3DVECTOR vVelocity; D3DVECTOR vOrientFront; D3DVECTOR vOrientTop; D3DVALUE flDistanceFactor; D3DVALUE flRolloffFactor; D3DVALUE flDopplerFactor;
- dwSize — размер структуры в байтах. Устанавливается приложением.
- vPosition — координаты слушателя в пространстве.
- vVelocity — скорость перемещения слушателя в пространстве.
- vOrientFront — направление макушки слушателя.
- vOrientTop — направление лица слушателя.
- flDistanceFactor — масштабный коэффициент расстояния.
- flRolloffFactor — масштабный коэффициент затухания.
- flDopplerFactor — масштабный коэффициент эффекта Доплера.
Первичные и производные объекты
Объекты устройства (IDirectSound) и звукового буфера (IDirectSoundBuffer) являются основными — в том смысле, что создаются «с нуля». Объекты слушателя (IDirectSound3DListener) и пространственного источника (IDirectSound3DBuffer) являются производными, поскольку их интерфейсы запрашиваются у основного объекта буфера. Несмотря на то что идеологически объект слушателя является расширением первичного буфера, а объект пространственного источника — расширением вторичного буфера, для этих объектов не реализовано объектно-ориентированное наследование. По этой причине наборы методов нигде не пересекаются; например: управление форматом, запуском и остановкой выполняется только через объект IDirectSoundBuffer, а управление координатами, скоростью и т.п. — только через объект IDirectSound3DBuffer.