|
DirectSound3Dявляется расширением базовой подсистемы DirectSound и предназначено для создания объёмной звуковой картины из отдельных источников звука. В отличие от «плоского» стереофонического звука, который получается в DirectSound, расширение DirectSound3D моделирует процесс распространения звука в пространстве и его восприятие слушателем с учетом основных физических законов и параметров среды. В результате слушатель даже в обычных стереонаушниках может четко различать, приходит звук спереди или сзади, сверху или снизу, близко или далеко находится источник и т.п. В DirectSound3D применяется концепция виртуального пространства— единая с подсистемой Direct3D, отвечающей за построение объёмных изображений, что позволяет использовать единые координаты для изображения и озвучивания объектов. Поскольку DirectSound3D является не самостоятельной подсистемой, а расширением базовой DirectSound, то онлайновая справочная система Microsoft по DirectSound3D является частью справочной системы по DirectSound. В этой статье мы расскажем о программировании DirectSound3D из пакета DirectX 7.0. Назначение и структура DirectSound3DРасширение DirectSound3D является производным базовой подсистемы DirectSound. Основным интерфейсом, через который происходит доступ к звуковому адаптеру, по-прежнему является IDirectSound, а параметры объёмного звучания управляются интерфейсами IDirectSound3DBuffer (описатель буфера источника объёмного звука) и IDirectSound3DListener (описатель слушателя объёмной звуковой картины). Ряд индивидуальных параметров задаётся для каждого источника в отдельности; общие для всего звукового пространства параметры считаются параметрами слушателя и задаются посредством его интерфейса. Построение объёмной звуковой картиныЗвуковая картина строится подсистемой DirectSound3D в трёхмерном пространстве, где присутствуют звуковые объекты двух видов:
Источники звука и слушатель являются объектами в трёхмерном звуковом пространстве. Каждый объект имеет следующие параметры:
Виртуальный источник звукаИсточник звука может быть точечным ( ненаправленным) и векторным ( направленным). По умолчанию источник считается точечным, то есть он излучает одинаково во всех направлениях. Для направленного источника задаются ориентация и параметры звучания в виде двух вложенных углов (конусов): внутренний (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):
Выраженность эффектовВ подсистеме возможна программная регулировка выраженности (яркости) пространственных эффектов— затухания на расстоянии (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 и имеющем отношение только к пространственному звуку:
DS3DBUFFER— описатель источника звукаОписывает параметры источника пространственного звука. DWORDdwSize; D3DVECTORvPosition; D3DVECTORvVelocity; DWORDdwInsideConeAngle; DWORDdwOutsideConeAngle; D3DVECTORvConeOrientation; LONGlConeOutsideVolume; D3DVALUEflMinDistance; D3DVALUEflMaxDistance; DWORDdwMode;
DS3DLISTENER— описатель слушателяОписывает параметры слушателя пространственного звука. DWORDdwSize; D3DVECTORvPosition; D3DVECTORvVelocity; D3DVECTORvOrientFront; D3DVECTORvOrientTop; D3DVALUEflDistanceFactor; D3DVALUEflRolloffFactor; D3DVALUEflDopplerFactor;
Первичные и производные объектыОбъекты устройства (IDirectSound) и звукового буфера (IDirectSoundBuffer) являются основными— в том смысле, что создаются «с нуля». Объекты слушателя (IDirectSound3DListener) и пространственного источника (IDirectSound3DBuffer) являются производными, поскольку их интерфейсы запрашиваются у основного объекта буфера. Несмотря на то что идеологически объект слушателя является расширением первичного буфера, а объект пространственного источника— расширением вторичного буфера, для этих объектов не реализовано объектно-ориентированное наследование. По этой причине наборы методов нигде не пересекаются; например: управление форматом, запуском и остановкой выполняется только через объект IDirectSoundBuffer, а управление координатами, скоростью и т.п.— только через объект IDirectSound3DBuffer. Набор интерфейсов подсистемыПеречень интерфейсов DirectSound3D
Параметры методов интерфейсовМетоды группы SetXXX, предназначенные для установки параметров объектов, имеют параметр Apply, задающий условие применения установки. Параметр может иметь одно из двух значений:
Поскольку параметр Apply для всех методов имеет одинаковое значение, его описание исключено из описаний отдельных методов. Значения, возвращаемые методами интерфейсовВ дополнение к уже описанным кодам результата базовой подсистемы DirectSound метод IDirectSound::CreateSoundBuffer может возвращать код DS_NO_VIRTUALIZATION, если запрашивается создание буфера для источника пространственного звука (флаг CTRL3D). По смыслу этот код является только предупреждением, сообщающим об успешном создании буфера и о невозможности применения для него запрошенного алгоритма «виртуальной головы», не поддерживаемого подсистемой (например, в случае VxD-драйвера). Для удобства при анализе кодов результата можно использовать макросы SUCCEEDED (Code) и FAILED (Code), выделяющие из кода завершения Code только признак успешности или ошибки. Интерфейс IDirectSound3DBufferУправляет источником пространственного звука. Интерфейс запрашивается у объекта вторичного звукового буфера IDirectSoundBuffer, созданного с указанием флага CTRL3D. Для получения интерфейса используется метод QueryInterface с параметром IID_IDirectSound3DBuffer.
GetMaxDistance— запрос максимального расстоянияHRESULTIDirectSound3DBuffer::GetMaxDistance( D3DVALUE*MaxDistance );
GetMinDistance— запрос минимального расстоянияHRESULTIDirectSound3DBuffer::GetMinDistance( D3DVALUE*MinDistance );
SetMaxDistance— установка максимального расстоянияHRESULTIDirectSound3DBuffer::SetMaxDistance( D3DVALUEMaxDistance, DWORDApply );
SetMinDistance— установка минимального расстоянияHRESULTIDirectSound3DBuffer::SetMinDistance( D3DVALUEMinDistance, DWORDApply );
GetMode — запрос режима пространственной обработкиHRESULTIDirectSound3DBuffer::GetMode( DWORD*Mode );
SetMode — установка режима пространственной обработкиHRESULTIDirectSound3DBuffer::SetMode( DWORDMode, DWORDApply );
GetPosition — запрос текущих координатHRESULTIDirectSound3DBuffer::GetPosition( D3DVECTOR*Position );
SetPosition — установка координатHRESULTIDirectSound3DBuffer::SetPosition( D3DVALUEX, D3DVALUEY, D3DVALUEZ, DWORDApply );
GetConeAngles — запрос ширины конусовHRESULTIDirectSound3DBuffer::GetConeAngles( DWORD*InsideConeAngle, DWORD*OutsideConeAngle );
GetConeOrientation — запрос направления источникаHRESULTIDirectSound3DBuffer::GetConeOrientation( D3DVECTOR*Orientation );
GetConeOutsideVolume— запрос громкости за пределами конусовHRESULTIDirectSound3DBuffer::GetConeOutsideVolume( LONG*ConeOutsideVolume );
SetConeAngles— установка ширины конусовHRESULTIDirectSound3DBuffer::SetConeAngles( DWORDInsideConeAngle, DWORDOutsideConeAngle, DWORDApply );
SetConeOrientation— установка направления источникаHRESULTIDirectSound3DBuffer::SetConeOrientation( D3DVALUEX, D3DVALUEY, D3DVALUEZ, DWORDApply );
SetConeOutsideVolume— установка громкости за пределами конусовHRESULTIDirectSound3DBuffer::SetConeOutsideVolume( LONGConeOutsideVolume, DWORDApply );
В текущей реализации DirectSound3D возможно только ослабление звука (отрицательные значения), усиление не поддерживается. Значение должно находиться в диапазоне от DSBVOLUME_MAX (0 дБ) до DSBVOLUME_MIN (-100 дБ). GetVelocity—запрос скорости перемещенияHRESULTIDirectSound3DBuffer::GetVelocity( D3DVECTOR*Velocity );
SetVelocity— установка скорости перемещенияHRESULTIDirectSound3DBuffer::SetVelocity( D3DVALUEX, D3DVALUEY, D3DVALUEX, DWORDApply );
GetAllParameters— запрос всех параметров источникаHRESULTIDirectSound3DBuffer::GetAllParameters( DS3DBUFFER*Desc );
SetAllParameters— установка всех параметров источникаHRESULTIDirectSound3DBuffer::SetAllParameters( const DS3DBUFFER*Desc, DWORDApply );
Интерфейс IDirectSound3DListenerУправляет слушателем пространственного звука. Интерфейс запрашивается у объекта первичного звукового буфера IDirectSoundBuffer, созданного с указанием флага CTRL3D. Для получения интерфейса используется метод QueryInterface с параметром IID_IDirectSound3DListener.
GetOrientation— запрос направления слушателяHRESULTIDirectSound3DListener::GetOrientation( D3DVECTOR*Front, D3DVECTOR*Top );
SetOrientation— установка направления слушателяHRESULTIDirectSound3DListener::SetOrientation( D3DVALUExFront, D3DVALUEyFront, D3DVALUEzFront, D3DVALUExTop, D3DVALUEyTop, D3DVALUEzTop, DWORDApply );
Если угол между векторами не является прямым, подсистема корректирует направление лица так, чтобы оно составляло прямой угол с направлением макушки. GetPosition— запрос координат слушателяHRESULTIDirectSound3DListener::GetPosition( D3DVECTOR*Position );
SetPosition— установка координат слушателяHRESULTIDirectSound3DListener::SetPosition( D3DVALUEX, D3DVALUEY, D3DVALUEZ, DWORDApply );
GetDistanceFactor— запрос масштаба расстоянияHRESULTIDirectSound3DListener::GetDistanceFactor( D3DVALUE*DistanceFactor );
SetDistanceFactor— установка масштаба расстоянияHRESULTIDirectSound3DListener::SetDistanceFactor( D3DVALUEDistanceFactor, DWORDApply );
GetDopplerFactor— запрос коэффициента эффекта ДоплераHRESULTIDirectSound3DListener::GetDopplerFactor( D3DVALUE*DopplerFactor );
SetDopplerFactor— установка коэффициента эффекта ДоплераHRESULTIDirectSound3DListener::SetDopplerFactor( D3DVALUEDopplerFactor, DWORDApply );
GetRolloffFactor— запрос коэффициента затуханияHRESULTIDirectSound3DListener::GetRolloffFactor( D3DVALUE*RolloffFactor );
SetRolloffFactor— установка коэффициента затуханияHRESULTIDirectSound3DListener::SetRolloffFactor( D3DVALUERolloffFactor, DWORDApply );
GetVelocity— запрос скорости перемещенияHRESULTIDirectSound3DListener::GetVelocity( D3DVECTOR*Velocity );
SetVelocity— установка скорости перемещенияHRESULTIDirectSound3DListener::SetVelocity( D3DVALUEX, D3DVALUEY, D3DVALUEZ, DWORDApply );
GetAllParameters— запрос всех параметров слушателяHRESULTIDirectSound3DListener::GetAllParameters( DS3DLISTENER*Desc );
SetAllParameters— установка всех параметров слушателяHRESULTIDirectSound3DListener::SetAllParameters( const DS3DLISTENER*Desc, DWORDApply );
CommitDeferredSettings— фактическое применение установокHRESULTIDirectSound3DListener::CommitDeferredSettings(); Выполняет фактическое применение отложенных установок параметров— как для слушателя, так и для всех источников звука. В этот момент берутся все текущие параметры, а звуковая картина в пространстве пересчитывается с их использованием. Оптимизация вывода звука в DirectSound3DОптимизация смены параметров звукаПоскольку каждая немедленно применяемая установка приводит к пересчету звуковой картины, то при выполнении нескольких установок подряд в немедленном режиме возникают существенные накладные расходы. Поэтому для смены нескольких параметров одновременно можно либо пользоваться парой методов GetAllParameters/ SetAllParameters, изменяя в промежутке между ними нужные значения в описателях, либо применять отложенные варианты установочных операций, завершая серию установок вызовом метода CommitDeferredSettings. Для тех установок, которые должны быть немедленно восприняты слушателем (перемещение источника или слушателя в пространстве и т.п.) рекомендуется выбирать разумные интервалы изменения, то есть не слишком часто, но и не очень скачкообразно. Обычно оптимальный интервал выбираются при отладке программы. Использование трёхмерной обработкиЕсли адаптер не поддерживает аппаратной пространственной обработки, то все вычисления выполняются подсистемой DirectSound3D, что требует значительных процессорных ресурсов. Если программу планируется использовать на компьютерах невысокой вычислительной мощности, то имеет смысл перед началом работы опрашивать DirectSound на предмет наличия аппаратной поддержки требуемых функций. При отсутствии поддержки можно, например, уменьшить количество источников звука, увеличить интервал (скачкообразность) изменения параметров, отключить моделирование эффектов Доплера и затухания и т.п. Очерёдность создания источников звукаПри наличии ресурсов аппаратной обработки DirectSound распределяет их в порядке создания источников звука (звуковых буферов). Поскольку программная эмуляция пространственного звучания требует гораздо больших вычислительных затрат, чем обычное смешивание стереозвука, то при использовании DirectSound3D этому вопросу следует уделять особое внимание. Наиболее динамичные и важные источники необходимо создавать в первую очередь— тогда при нехватке аппаратных ресурсов эмулятор будет обрабатывать в основном малоподвижные и второстепенные источники, что дает более эффективное соотношение затрат и качества звука. Глушение источника на расстоянииДля тех источников, звук которых должен полностью исчезать при достаточном удалении, рекомендуется указывать флаг MUTE3DATMAXDISTANCE и устанавливать соответствующее значение максимального расстояния. Тогда, при удалении источника и слушателя на указанное максимальное расстояние, звук будет не просто ослаблен ниже порога слышимости, а выключен совсем. При этом источник исключается из обработки, освобождая аппаратные каналы адаптера либо ресурсы процессора при эмуляции. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения. Идея и реализация: © Владимир Довыденков и Анатолий Камынин, 2004-2024 |
Социальные сети