Так же, как от 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 DirectSoundSecondaryBuffer8
Dim dsBuffer2 As DirectSoundSecondaryBuffer8
Как видите, кроме объектов DirectX и DirectSound мы объявили 2 буффера для
воспроизведения звука. Максимальное количество одновременно воспроизводимых
файлов равно количеству буфферов DirectSound.
Инициализация и загрузка данных будет выполнятся функцией InitSound,
возвращающей True в случае успешной инициализации.
Public Function InitSound() As Boolean
On Local Error Resume Next
Set ds = dx.DirectSoundCreate("")
If ds Is Nothing Then Exit Function
ds.SetCooperativeLevel Me.hWnd, DSSCL_NORMAL
Dim BufferDesc As DSBUFFERDESC
BufferDesc.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 = True
End 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 Pan
psBuffer.SetVolume Volume
psBuffer.SetFrequency Frequency
psBuffer.Play DSBPLAY_DEFAULT
End 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 = Nothing
Set dsBuffer2 = Nothing
Set ds = Nothing
End Sub