Программирование звука в DirectSound
Страница 19. Интерфейс IDirectSound


Интерфейс IDirectSound

Обслуживает объекты устройств воспроизведения. Содержит следующие методы: 

Initialize

Инициализация устройства

SetCooperativeLevel

Установка уровня взаимодействия с аппаратурой

CreateSoundBuffer

Создание звукового буфера

DuplicateSoundBuffer

Создание копии объекта буфера

GetCaps

Запрос возможностей и параметров устройства

Compact

Уплотнение внутренней памяти звукового адаптера

GetSpeakerConfig

Запрос конфигурации звукоизлучателей

SetSpeakerConfig

Установка конфигурации звукоизлучателей

Initialize - инициализация устройства

HRESULT IDirectSound::Initialize (
   LPCGUID GUID
);
  • GUID - идентификатор устройства либо нулевое значение для выбора стандартного устройства.

Метод используется для объектов, созданных не специальной функциями Create, а стандартным для COM методом CoCreateInstance. Функции Create возвращают инициализированный объект, в то время как CoCreateInstance - объект-заготовку, который не связан с конкретным устройством.

SetCooperativeLevel - установка уровня взаимодействия

HRESULT IDirectSound::SetCooperativeLevel (
   HWND Win,
   DWORD Level
);
  • Win - ключ окна (window handle), по положению которого определяется состояние приложения. Когда окно становится текущим (foreground), приложение также считается текущим, и наоборот. Если приложение использует DirectDraw, то в методах установки уровня DirectDraw и DirectSound должно использоваться одно и то же окно.
  • Level - запрашиваемый уровень взаимодействия. Имена констант кодов уровней имеют префикс DSSCL_:;

NORMAL

Обычный уровень. Формат первичного буфера фиксирован. Когда приложение является текущим, звучат только его собственные источники, а также источники других приложений, помеченные флагом DSBCAPS_GLOBALFOCUS

PRIORITY

Приоритетный уровень. Подобен обычному, но допускаются смена формата первичного буфера и уплотнение памяти адаптера. Когда приложение становится текущим, подсистема переключает формат выводимого через адаптер звука

EXCLUSIVE

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

WRITEPRIMARY

Уровень доступа к первичному буферу. Разрешается прямой доступ к первичному буферу, однако запрещается использование вторичных буферов. Установка уровня допускается только для устройств, имеющих драйвер DirectSound (флаг DSCAPS_EMULDRIVER в свойствах устройства не установлен)

CreateSoundBuffer - создание звукового буфера

HRESULT IDirectSound::CreateSoundBuffer (
   LPCDSBUFFERDESC BufferDesc,
   LPDIRECTSOUNDBUFFER *Buffer,
   IUnknown *Outer
);
  • BufferDesc - указатель заполненного описателя создаваемого буфера (структура DSBUFFERDESC);
  • Buffer - указатель переменной, в которую будет занесен указатель созданного объекта буфера;
  • Outer - указатель объекта <наружного> интерфейса IUnknown. Не используется, должен иметь нулевое значение.

Метод создает звуковой - первичный или вторичный буфер, в зависимости от состояния флага DSBCAPS_PRIMARYBUFFER. При создании буфера должны быть указаны способы управления (флаги DSBCAPS_CTRLxxx), которые будут использоваться при проигрывании буфера.

Если заданы флаги DSBCAPS_LOCHARDWARE, DSBCAPS_LOCSOFTWARE, подсистема сразу же пытается разместить буфер в памяти определенного типа. Если задан флаг DSBCAPS_LOCDEFER, размещение буфера откладывается до запуска его звучания.

DuplicateSoundBuffer - создание копии объекта буфера

HRESULT IDirectSound::DuplicateSoundBuffer (
   LPDIRECTSOUNDBUFFER Original,
   LPLPDIRECTSOUNDBUFFER Duplicate
);
  • Original - указатель копируемого объекта;
  • Duplicate - указатель переменной, в которую заносится указатель объекта-копии.

Метод служит для создания копии объекта, описывающего звуковой буфер, и используется для создания источников, разделяющих между собой один звуковой фрагмент. Оба объекта ссылаются на один и тот же участок памяти, и изначально их параметры полностью совпадают. Впоследствии приложение может изменять параметры каждого из объектов, что дает соответственное изменение звучания. Например, если это звук автомобиля, то методом копирования объектов можно создать звучания нескольких одинаковых автомобилей, различающихся громкостью, высотой, положением в пространстве и т.п., не затрачивая дополнительную память для самой звуковой оцифровки.

GetCaps - запрос параметров и состояния устройства

HRESULT IDirectSound::GetCaps (
   DSCAPS *Caps
);
  • Caps - указатель структуры DSCAPS, которая будет заполнена параметрами устройства. Перед обращением к методу должно быть установлено поле dwSize, определяющее версию интерфейса.

GetSpeakerConfig - запрос конфигурации звукоизлучателей

HRESULT IDirectSound::GetSpeakerConfig (
   DWORD *Config
);
  • Config - адрес переменной, в которую будет занесен код текущей конфигурации звукоизлучателей для данного устройства. Имена констант значений кодов имеют префикс DSSPEAKER_:;

MONO

Одиночный громкоговоритель

STEREO

Стереофонические громкоговорители; (стандартно)

HEADPHONE

Наушники

QUAD

Квадрафонические громкоговорители

SURROUND

Громкоговорители, включенные по системе Surround

5POINT1

Громкоговорители Surround с добавлением общего низкочастотного (subwoofer)

В конфигурации STEREO добавляется код расположения громкоговорителей. Имена значений кодов имеют префикс DSSPEAKER_GEOMETRY_

MIN

Под углом в 5°

NARROW

Под углом в 10°

WIDE

Под углом в 20°

MAX

Под углом в 180°

Для выделения из двойного слова кодов конфигурации и расположения используются макросы DSSPEAKER_CONFIG и DSSPEAKER_GEOMETRY.

SetSpeakerConfig - установка конфигурации звукоизлучателей

HRESULT IDirectSound::SetSpeakerConfig (
   DWORD Config
);
  • Config - набор флагов, описывающих конфигурацию.

Метод устанавливает новую конфигурацию звукоизлучателей, которая будет учитываться при создании результирующей звуковой картины.

Для объединения кодов конфигурации и расположения используется макрос DSSPEAKER_COMBINED (Config, Geometry).

Compact - уплотнение внутренней памяти адаптера

HRESULT IDirectSound::Compact ();

Метод выполняет уплотнение внутренней памяти адаптера, устраняя фрагментацию и собирая все неиспользуемые фрагменты в один непрерывный участок.

Для использования метода приложение должно иметь уровень взаимодействия не ниже приоритетного.

 
« Предыдущая статья   Следующая статья »