Программирование объёмного звука в DirectSound3D

Источник:«КомпьютерПресс» #1, 2001
Дата публикации:2004
Twitter Facebook Vkontakte

Пропустить содержание


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{ D3DVALUEx; D3DVALUEdvX; }; union{ D3DVALUEy; D3DVALUEdvY; }; union{ D3DVALUEz; D3DVALUEdvZ; };

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— описатель источника звука

Описывает параметры источника пространственного звука.

DWORDdwSize; D3DVECTORvPosition; D3DVECTORvVelocity; DWORDdwInsideConeAngle; DWORDdwOutsideConeAngle; D3DVECTORvConeOrientation; LONGlConeOutsideVolume; D3DVALUEflMinDistance; D3DVALUEflMaxDistance; DWORDdwMode;
  • dwSize— размер структуры в байтах. Устанавливается приложением.
  • vPosition— текущие координаты источника звука.
  • vVelocity— скорость перемещения источника. Задается в разложенном виде, скоростями по каждой координате в отдельности
  • dwInsideConeAngle— угол внутреннего звукового конуса (конуса видимости).
  • dwOutsideConeAngle— угол наружного звукового конуса (конуса слышимости).
  • vConeOrientation— направление излучения звука направленного источника.
  • lConeOutsideVolume— громкость звука на границе конуса слышимости направленного источника.
  • flMinDistance— минимальное расстояние между источником и слушателем.
  • flMaxDistance— максимальное расстояние между источником и слушателем.
  • dwMode— режим пространственной обработки источника. Имена констант режимов имеют префикс DS3DMODE_:

NORMAL

Обычный режим, независимый источник (по умолчанию). Пространственные параметры источника задаются абсолютными величинами

HEADRELATIVE

Связанный источник. Пространственные параметры источника задаются относительно головы слушателя

DISABLE

Источник не участвует в моделировании распространения звука, считается расположенным в центре головы слушателя, а звучание подается непосредственно на излучатели

DS3DLISTENER— описатель слушателя

Описывает параметры слушателя пространственного звука.

DWORDdwSize; D3DVECTORvPosition; D3DVECTORvVelocity; D3DVECTORvOrientFront; D3DVECTORvOrientTop; D3DVALUEflDistanceFactor; D3DVALUEflRolloffFactor; D3DVALUEflDopplerFactor;
  • dwSize— размер структуры в байтах. Устанавливается приложением.
  • vPosition— координаты слушателя в пространстве.
  • vVelocity— скорость перемещения слушателя в пространстве.
  • vOrientFront— направление макушки слушателя.
  • vOrientTop— направление лица слушателя.
  • flDistanceFactor— масштабный коэффициент расстояния.
  • flRolloffFactor— масштабный коэффициент затухания.
  • flDopplerFactor— масштабный коэффициент эффекта Доплера.

Первичные и производные объекты

Объекты устройства (IDirectSound) и звукового буфера (IDirectSoundBuffer) являются основными— в том смысле, что создаются «с нуля». Объекты слушателя (IDirectSound3DListener) и пространственного источника (IDirectSound3DBuffer) являются производными, поскольку их интерфейсы запрашиваются у основного объекта буфера. Несмотря на то что идеологически объект слушателя является расширением первичного буфера, а объект пространственного источника— расширением вторичного буфера, для этих объектов не реализовано объектно-ориентированное наследование. По этой причине наборы методов нигде не пересекаются; например: управление форматом, запуском и остановкой выполняется только через объект IDirectSoundBuffer, а управление координатами, скоростью и т.п.— только через объект IDirectSound3DBuffer.

Набор интерфейсов подсистемы

Перечень интерфейсов DirectSound3D

IDirectSound3DBuffer

Источник пространственного звука

IDirectSound3DListener

Слушатель пространственного звука

Параметры методов интерфейсов

Методы группы SetXXX, предназначенные для установки параметров объектов, имеют параметр Apply, задающий условие применения установки. Параметр может иметь одно из двух значений:


  • DS3D_IMMEDIATE— немедленное применение. Все вычисления, необходимые для отражения сделанного изменения, выполняются сразу же. Рекомендуется для изменения одиночных параметров, когда между операциями изменения проходит какое-то время, и каждое отдельное изменение должно быть воспринято слушателем.
  • DS3D_DEFERRED— отложенное применение. Текущее значение параметра изменяется, однако фактический пересчет звукового пространства выполняется либо при вызове метода IDirectSound3DListener::CommitDeferredSettings, либо при выполнении любой установки с немедленным применением. Рекомендуется для изменения групп параметров, когда операции установки следуют подряд без пауз и когда слушателем должен быть воспринят лишь совокупный результат всех установок группы.

Поскольку параметр Apply для всех методов имеет одинаковое значение, его описание исключено из описаний отдельных методов.

Значения, возвращаемые методами интерфейсов

В дополнение к уже описанным кодам результата базовой подсистемы DirectSound метод IDirectSound::CreateSoundBuffer может возвращать код DS_NO_VIRTUALIZATION, если запрашивается создание буфера для источника пространственного звука (флаг CTRL3D). По смыслу этот код является только предупреждением, сообщающим об успешном создании буфера и о невозможности применения для него запрошенного алгоритма «виртуальной головы», не поддерживаемого подсистемой (например, в случае VxD-драйвера).

Для удобства при анализе кодов результата можно использовать макросы SUCCEEDED (Code) и FAILED (Code), выделяющие из кода завершения Code только признак успешности или ошибки.

Интерфейс IDirectSound3DBuffer

Управляет источником пространственного звука. Интерфейс запрашивается у объекта вторичного звукового буфера IDirectSoundBuffer, созданного с указанием флага CTRL3D. Для получения интерфейса используется метод QueryInterface с параметром IID_IDirectSound3DBuffer.

GetMaxDistance

Запрос максимального расстояния до источника

GetMinDistance

Запрос минимального расстояния до источника

SetMaxDistance

Установка максимального расстояния до источника

SetMinDistance

Установка минимального расстояния до источника

GetMode

Запрос режима пространственной обработки

SetMode

Установка режима пространственной обработки

GetPosition

Запрос координат источника

SetPosition

Установка координат источника

GetConeAngles

Запрос величин углов конусов видимости и слышимости

GetConeOrientation

Запрос направления конусов видимости и слышимости

GetConeOutsideVolume

Запрос громкости на границе конуса слышимости

SetConeAngles

Установка величин углов конусов видимости и слышимости

SetConeOrientation

Установка направления конусов видимости и слышимости

SetConeOutsideVolume

Установка громкости на границе конуса слышимости

GetVelocity

Запрос скорости перемещения источника

SetVelocity

Установка скорости перемещения источника

GetAllParameters

Одновременный запрос всех параметров источника

SetAllParameters

Одновременная установка всех параметров источника

GetMaxDistance— запрос максимального расстояния

HRESULTIDirectSound3DBuffer::GetMaxDistance( D3DVALUE*MaxDistance );
  • MaxDistance— указатель переменной, в которую возвращается текущее значение максимального расстояния между источником и слушателем.

GetMinDistance— запрос минимального расстояния

HRESULTIDirectSound3DBuffer::GetMinDistance( D3DVALUE*MinDistance );
  • MinDistance— указатель переменной, в которую возвращается текущее значение минимального расстояния между источником и слушателем.

SetMaxDistance— установка максимального расстояния

HRESULTIDirectSound3DBuffer::SetMaxDistance( D3DVALUEMaxDistance, DWORDApply );
  • MaxDistance— новое значение максимального расстояния между источником и слушателем. По умолчанию установлено значение DS3D_DEFAULTMAXDISTANCE, равное большому числовому значению, что фактически эквивалентно бесконечному расстоянию.

SetMinDistance— установка минимального расстояния

HRESULTIDirectSound3DBuffer::SetMinDistance( D3DVALUEMinDistance, DWORDApply );
  • MinDistance— новое значение минимального расстояния между источником и слушателем. По умолчанию установлено значение DS3D_DEFAULTMINDISTANCE, эквивалентное одной единице расстояния (по умолчанию— один метр).

GetMode — запрос режима пространственной обработки

HRESULTIDirectSound3DBuffer::GetMode( DWORD*Mode );
  • Mode— указатель переменной, в которую возвращается значение текущего режима пространственной обработки. Перечень возможных значений приведен в описании поля dwMode структуры DS3DBUFFER.

SetMode — установка режима пространственной обработки

HRESULTIDirectSound3DBuffer::SetMode( DWORDMode, DWORDApply );
  • Mode— новое значение режима пространственной обработки. Перечень возможных значений приведен в описании поля dwMode структуры DS3DBUFFER.

GetPosition — запрос текущих координат

HRESULTIDirectSound3DBuffer::GetPosition( D3DVECTOR*Position );
  • Position— указатель переменной, в которую будут занесены текущие координаты источника.

SetPosition — установка координат

HRESULTIDirectSound3DBuffer::SetPosition( D3DVALUEX, D3DVALUEY, D3DVALUEZ, DWORDApply );
  • X, Y, Z— новые координаты источника звука. Подсистема может корректировать координаты перед установкой, если существует опасность переполнения при вычислениях.

GetConeAngles — запрос ширины конусов

HRESULTIDirectSound3DBuffer::GetConeAngles( DWORD*InsideConeAngle, DWORD*OutsideConeAngle );
  • InsideConeAngle, OutsideConeAngle— указатели переменных, в которые заносятся текущие значения ширины конусов видимости и слышимости, в градусах.

GetConeOrientation — запрос направления источника

HRESULTIDirectSound3DBuffer::GetConeOrientation( D3DVECTOR*Orientation );
  • Orientation— указатель переменной, в которую будут занесены координаты вектора, указывающего направление источника (его конусов видимости и слышимости). Вектор направления лежит на биссектрисе конусов. Возвращается всегда вектор нормализованной длины (не более 1).

GetConeOutsideVolume— запрос громкости за пределами конусов

HRESULTIDirectSound3DBuffer::GetConeOutsideVolume( LONG*ConeOutsideVolume );
  • ConeOutsideVolume— указатель переменной, в которой возвращается текущий уровень громкости источника на границе конуса слышимости. Смысл значения раскрыт в описании метода SetConeOutsideVolume.

SetConeAngles— установка ширины конусов

HRESULTIDirectSound3DBuffer::SetConeAngles( DWORDInsideConeAngle, DWORDOutsideConeAngle, DWORDApply );
  • dwInsideConeAngle, OutsideConeAngle— новая ширина конусов видимости и слышимости источника, в градусах. Минимальная, максимальная и стандартная ширина углов представлена константами DS3D_MINCONEANGLE (0), DS3D_MAXCONEANGLE (360), DS3D_DEFAULTCONEANGLE (360).

SetConeOrientation— установка направления источника

HRESULTIDirectSound3DBuffer::SetConeOrientation( D3DVALUEX, D3DVALUEY, D3DVALUEZ, DWORDApply );
  • X, Y, Z— новые координаты вектора, указывающего направление источника (его конусов видимости и слышимости). Вектор направления лежит на биссектрисе конусов. Подсистема нормализует указанный вектор, чтобы его длина не превышала 1.

SetConeOutsideVolume— установка громкости за пределами конусов

HRESULTIDirectSound3DBuffer::SetConeOutsideVolume( LONGConeOutsideVolume, DWORDApply );
  • ConeOutsideVolume— новое значение уровня громкости за пределами конуса слышимости, в сотых долях децибела. Значение 0 дБ соответствует исходной (собственной) громкости звука в буфере.

В текущей реализации DirectSound3D возможно только ослабление звука (отрицательные значения), усиление не поддерживается. Значение должно находиться в диапазоне от DSBVOLUME_MAX (0 дБ) до DSBVOLUME_MIN (-100 дБ).

GetVelocity—запрос скорости перемещения

HRESULTIDirectSound3DBuffer::GetVelocity( D3DVECTOR*Velocity );
  • Velocity— указатель переменной, в которой возвращается вектор скорости (скорость по каждой из координат) перемещения источника в пространстве.

SetVelocity— установка скорости перемещения

HRESULTIDirectSound3DBuffer::SetVelocity( D3DVALUEX, D3DVALUEY, D3DVALUEX, DWORDApply );
  • X, Y, Z— новое значение вектора скорости. Подсистема может корректировать значение вектора в случае опасности переполнения при вычислениях.

GetAllParameters— запрос всех параметров источника

HRESULTIDirectSound3DBuffer::GetAllParameters( DS3DBUFFER*Desc );
  • Desc— указатель описателя параметров пространственного звукового буфера— структура DS3DBUFFER, в которую заносятся все доступные для управления параметры источника.

SetAllParameters— установка всех параметров источника

HRESULTIDirectSound3DBuffer::SetAllParameters( const DS3DBUFFER*Desc, DWORDApply );
  • Desc— указатель описателя параметров пространственного звукового буфера— структура DS3DBUFFER, из которой берутся новые параметры источника.

Интерфейс IDirectSound3DListener

Управляет слушателем пространственного звука. Интерфейс запрашивается у объекта первичного звукового буфера IDirectSoundBuffer, созданного с указанием флага CTRL3D. Для получения интерфейса используется метод QueryInterface с параметром IID_IDirectSound3DListener.

GetDistanceFactor

Запрос масштабного коэффициента расстояния

SetDistanceFactor

Установка масштабного коэффициента расстояния

GetDopplerFactor

Запрос коэффициента выраженности эффекта Доплера

SetDopplerFactor

Установка коэффициента выраженности эффекта Доплера

GetRolloffFactor

Запрос коэффициента выраженности эффекта затухания

SetRolloffFactor

Установка коэффициента выраженности эффекта затухания

GetOrientation

Запрос направления слушателя

SetOrientation

Установка направления слушателя

GetPosition

Запрос координат слушателя

SetPosition

Установка координат слушателя

GetVelocity

Запрос скорости перемещения слушателя

SetVelocity

Установка скорости перемещения слушателя

GetAllParameters

Одновременный запрос всех параметров

SetAllParameters

Одновременная установка всех параметров

CommitDeferredSettings

Фактическое применение отложенных установок

GetOrientation— запрос направления слушателя

HRESULTIDirectSound3DListener::GetOrientation( D3DVECTOR*Front, D3DVECTOR*Top );
  • Front, Top— указатели переменных, в которые возвращаются направления лица (front) и макушки (top) слушателя.

SetOrientation— установка направления слушателя

HRESULTIDirectSound3DListener::SetOrientation( D3DVALUExFront, D3DVALUEyFront, D3DVALUEzFront, D3DVALUExTop, D3DVALUEyTop, D3DVALUEzTop, DWORDApply );

  • xFront, yFront, zFront— компоненты координат вектора направления лица слушателя. По умолчанию лицо имеет такое направление: 0, 0, 1.
  • xTop, yTop, zTop— компоненты координат вектора направления макушки слушателя. По умолчанию макушка имеет направление: 0, 1, 0.

Если угол между векторами не является прямым, подсистема корректирует направление лица так, чтобы оно составляло прямой угол с направлением макушки.

GetPosition— запрос координат слушателя

HRESULTIDirectSound3DListener::GetPosition( D3DVECTOR*Position );
  • Position— указатель переменной, в которой возвращаются текущие координаты слушателя.

SetPosition— установка координат слушателя

HRESULTIDirectSound3DListener::SetPosition( D3DVALUEX, D3DVALUEY, D3DVALUEZ, DWORDApply );
  • X, Y, Z— новые координаты слушателя. Подсистема может корректировать значения координат для предотвращения переполнений при вычислениях.

GetDistanceFactor— запрос масштаба расстояния

HRESULTIDirectSound3DListener::GetDistanceFactor( D3DVALUE*DistanceFactor );
  • DistanceFactor— указатель переменной, в которую возвращается текущий масштаб расстояния.

SetDistanceFactor— установка масштаба расстояния

HRESULTIDirectSound3DListener::SetDistanceFactor( D3DVALUEDistanceFactor, DWORDApply );
  • DistanceFactor— новое значение масштаба расстояния. Значение должно лежать в диапазоне от DS3D_MINDISTANCEFACTOR ( FLT_MIN) до DS3D_MAXDISTANCEFACTOR ( FLT_MAX). По умолчанию установлено значение DS3D_DEFAULTDISTANCEFACTOR (1).

GetDopplerFactor— запрос коэффициента эффекта Доплера

HRESULTIDirectSound3DListener::GetDopplerFactor( D3DVALUE*DopplerFactor );
  • DopplerFactor— указатель переменной, в которой возвращается текущее значение коэффициента эффекта Доплера.

SetDopplerFactor— установка коэффициента эффекта Доплера

HRESULTIDirectSound3DListener::SetDopplerFactor( D3DVALUEDopplerFactor, DWORDApply );
  • DopplerFactor— новое значение коэффициента эффекта Доплера, которое должно быть в диапазоне DS3D_MINDOPPLERFACTOR (0) и DS3D_MAXDOPPLERFACTOR (10). По умолчанию установлено значение DS3D_DEFAULTDOPPLERFACTOR (1).

GetRolloffFactor— запрос коэффициента затухания

HRESULTIDirectSound3DListener::GetRolloffFactor( D3DVALUE*RolloffFactor );
  • RolloffFactor— указатель переменной, в которой возвращается текущее значение коэффициента затухания.

SetRolloffFactor— установка коэффициента затухания

HRESULTIDirectSound3DListener::SetRolloffFactor( D3DVALUERolloffFactor, DWORDApply );
  • RolloffFactor— новое значение коэффициента затухания. Это значение должно быть в диапазоне DS3D_MINROLLOFFFACTOR (0) и DS3D_MAXROLLOFFFACTOR (10). По умолчанию установлено значение DS3D_DEFAULTROLLOFFFACTOR (1).

GetVelocity— запрос скорости перемещения

HRESULTIDirectSound3DListener::GetVelocity( D3DVECTOR*Velocity );
  • Velocity— указатель переменной, в которой возвращается вектор скорости перемещения слушателя в пространстве.

SetVelocity— установка скорости перемещения

HRESULTIDirectSound3DListener::SetVelocity( D3DVALUEX, D3DVALUEY, D3DVALUEZ, DWORDApply );
  • X, Y, Z— компоненты нового вектора скорости перемещения слушателя. Подсистема может корректировать значение вектора для предотвращения переполнений при вычислениях. По умолчанию установлена нулевая скорость (0, 0, 0).

GetAllParameters— запрос всех параметров слушателя

HRESULTIDirectSound3DListener::GetAllParameters( DS3DLISTENER*Desc );
  • Desc— указатель описателя параметров слушателя (структура DS3DLISTENER), который будет заполнен текущими параметрами.

SetAllParameters— установка всех параметров слушателя

HRESULTIDirectSound3DListener::SetAllParameters( const DS3DLISTENER*Desc, DWORDApply );
  • Desc— указатель описателя параметров слушателя (структура DS3DLISTENER), содержащего новые параметры для установки.

CommitDeferredSettings— фактическое применение установок

HRESULTIDirectSound3DListener::CommitDeferredSettings();

Выполняет фактическое применение отложенных установок параметров— как для слушателя, так и для всех источников звука. В этот момент берутся все текущие параметры, а звуковая картина в пространстве пересчитывается с их использованием.

Оптимизация вывода звука в DirectSound3D

Оптимизация смены параметров звука

Поскольку каждая немедленно применяемая установка приводит к пересчету звуковой картины, то при выполнении нескольких установок подряд в немедленном режиме возникают существенные накладные расходы. Поэтому для смены нескольких параметров одновременно можно либо пользоваться парой методов GetAllParameters/ SetAllParameters, изменяя в промежутке между ними нужные значения в описателях, либо применять отложенные варианты установочных операций, завершая серию установок вызовом метода CommitDeferredSettings.

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

Использование трёхмерной обработки

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

Очерёдность создания источников звука

При наличии ресурсов аппаратной обработки DirectSound распределяет их в порядке создания источников звука (звуковых буферов). Поскольку программная эмуляция пространственного звучания требует гораздо больших вычислительных затрат, чем обычное смешивание стереозвука, то при использовании DirectSound3D этому вопросу следует уделять особое внимание. Наиболее динамичные и важные источники необходимо создавать в первую очередь— тогда при нехватке аппаратных ресурсов эмулятор будет обрабатывать в основном малоподвижные и второстепенные источники, что дает более эффективное соотношение затрат и качества звука.

Глушение источника на расстоянии

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



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