Так же, как от DirectInput чаще всего требуется работа с клавиатурой,
DirectSound часто используется просто для воспроизведения *.wav файлов. Но в
отличие от элемента управления MMControl DirectSound имеет возможность
воспроизводить несколько файлов одновременно. В этой статье показано, как
инициализировать объект DirectSound, загрузить данные из звукового файла в
буффер DirectSound и воспроизвести звук из этого буффера.
Для начала создайте новый проект и подключите к нему библиотеку DirectX 8
for Visual Basic Type Library. Объявите следующие переменные уровня модуля
формы:
Dim dx As New DirectX8 'Объект DirectX
Dim ds As DirectSound8 'Объект DirectSound
'2 Буффера для воспроизведения звука
Dim dsBuffer1 As DirectSoundSecondaryBuffer8Dim dsBuffer2 As DirectSoundSecondaryBuffer8
Как видите, кроме объектов DirectX и DirectSound мы объявили 2 буффера для
воспроизведения звука. Максимальное количество одновременно воспроизводимых
файлов равно количеству буфферов DirectSound.
Инициализация и загрузка данных будет выполнятся функцией InitSound,
возвращающей True в случае успешной инициализации.
Public Function InitSound() As BooleanOn Local Error Resume Next Set ds = dx.DirectSoundCreate("")If ds Is Nothing Then Exit Function ds.SetCooperativeLevel Me.hWnd, DSSCL_NORMAL Dim BufferDesc As DSBUFFERDESCBufferDesc.lFlags = DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME Or DSBCAPS_CTRLFREQUENCY Set dsBuffer1 = ds.CreateSoundBufferFromFile(App.Path + "\Sound1.wav", BufferDesc)Set dsBuffer2 = ds.CreateSoundBufferFromFile(App.Path + "\Sound2.wav", BufferDesc) InitSound = TrueEnd Function
Объект DirectSound создаётся с
помощью метода DirectSoundCreate объекта DirectX. Единственный
параметр этого метода - строка GUID, идентифицирующая звуковое устройство. Если
значение этого параметра - пустая строка, используется устройство по умолчанию.
Затем с помощью метода SetCooperativeLevel объекта DirectSound с этим объектом
ассоциируется форма, а также устанавливается уровень приоритета этого объекта.
Константы DSSCL_NORMAL, DSSCL_PRIORITY и DSSCL_WRITEPRIMARY означают
соответственно нормальный, повышенный и самый высокий уровень приоритета. Для
большинства случаев хватает DSSCL_NORMAL.
В качестве первого параметра метода CreateSoundBufferFromFile объекта ds Вы
можете использовать строку, содержащую имя любого *.wav файла. При создании
буффера DirectSound используется структура BufferDesc. Член этой структуры
lFlags - это комбинация флагов из набора констант CONST_DSBCAPSFLAGS. Флаг
DSBCAPS_CTRLPAN означает, что буффер поддерживает контроль баланса,
DSBCAPS_CTRLVOLUME - контроль громкости, DSBCAPS_CTRLFREQUENCY - контроль
частоты.
Теперь напишем небольшую процедуру PlaySound, проигрывающую буффер,
указанный первым параметром с использованием баланса, громкости и частоты
указанных в последующих параметрах.
Public Sub PlaySound(ByRef psBuffer As DirectSoundSecondaryBuffer8, Pan As Integer, Volume As Integer, Frequency As Integer)psBuffer.SetPan PanpsBuffer.SetVolume VolumepsBuffer.SetFrequency FrequencypsBuffer.Play DSBPLAY_DEFAULTEnd Sub
Если использовать в качестве единственного параметра метода Play,
проигрывающего звук, константу DSBPLAY_DEFAULT, звук будет воспроизводится один
раз. При использовании же константы DSBPLAY_LOOPING звук будет воспроизводиться
постоянно.
Метод SetPan устанавливает громкость колонок относительно друг друга. При
значении DSBPAN_LEFT (-10000) параметра pan этого метода звучит только левая
колонка, DSBPAN_RIGHT (10000) - только правая, DSBPAN_CENTER (0) означает
идеальный баланс между двумя колонками. При значении, например, -8500 параметра
pan левая колонка звучит на полной громкости, громкость правой же колонки
уменьшена на 85 Дб.
Метод SetVolume устанавливает громкость воспроизводимого звука. Параметр
volume этого метода может принимать значения в диапазоне от -10000 до 0. При
этом 0 означает полную громкость, а -10000 - громкость, уменьшенную на 100 Дб,
что в большинстве случаев означает полную тишину.
Метод SetFrequency устанавливает частоту воспроизводимого звука в герцах.
Его параметр frequency может принимать значения в диапазоне от 100 до 100000.
Теперь, чтобы в этой программе воспроизвести звук из буффера dsBuffer1 можно
пользоваться, например, таким кодом:
PlaySound dsBuffer1, 0, 0, 30000
Создадим процедуру CleanUp, удаляющую созданные объекты, вызов которой
необходимо поместить в Form_Unload.
Public Sub CleanUp()Set dsBuffer1 = NothingSet dsBuffer2 = NothingSet ds = NothingEnd Sub