Программирование объемного звука в 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.

В начало

В начало