Direct Sound в VB
DirectSound является одной из составных частей DirectX и нужен для работысо звуком. Понять его работу и как он облегчает жизнь программисту можно на примере.
Для начала нужно создать новый проект и добавить к нему библиотеку dx8vb.dll,затем создать новую форму и модуль. В нём, как обычно, пишем:
Option Explicit
Global DirectX As New DirectX8
Затем объявляем объект DirectSound и массив буферов. Буфер - этоместо, где храниться звук. Например, в игре используется 3 буфера: один с музыкой, и двадругих со звуковыми эффектами. Так вот над буферами очень удобно работать: можно менятьбаланс, громкость и звуковой файл каждого их них.
Global DirectSound As DirectSound8
Global SoundBuffer() As DirectSoundSecondaryBuffer8
Теперь надо создать процедуру, которая инициализируетDirectSound. Назовём её DXCreateSound.
Sub DXCreateSound(HWnd As Integer)
Set DirectSound = DirectX.DirectSoundCreate("")
DirectSound.SetCooperativeLevel HWnd, DSSCL_NORMAL
End Sub
Здесь всё просто. Сначала мы создаём объект DirectSound,а затем устанавливаем кооперативный левел так, что другие программы тожемогут использовать DirectSound. Далее напишем процедуру, которая удаляет DirectSound.
Sub DXDestroySound()
Set DirectSound = Nothing
End Sub
Создавать и удалять DS мы уже можем. Теперь хорошо бы написать процедурынепосредственно для работы со звуком. Сперва мы напишем процедуру для указания и определенияколичества звуковых буферов.
Sub DXSetSoundBuffers(Buffers As Integer)
ReDim Preserve SoundBuffer(Buffers)
End Sub
Function DXGetSoundBuffers() As Integer
DXGetSoundBuffers = UBound(SoundBuffer)
End Function
Здесь мы просто изменяем или определяем количество элементов в массиве.Теперь можно написать процедуры для загрузки и проигрывания файлов.
Sub DXLoadSound(Buffer As Integer, SoundFile As String, HZ As Integer, Bit As Integer, Channels As Integer)
Dim BufferDesc As DSBUFFERDESC
BufferDesc.lFlags = DSBCAPS_CTRLFREQUENCY Or DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME Or DSBCAPS_STATIC
BufferDesc.fxFormat.nFormatTag = 1 "WAVE_FORMAT_PCM
BufferDesc.fxFormat.nChannels = Channels
BufferDesc.fxFormat.lSamplesPerSec = HZ
BufferDesc.fxFormat.nBitsPerSample = Bit
BufferDesc.fxFormat.nBlockAlign = BufferDesc.fxFormat.nBitsPerSample / 8 * BufferDesc.fxFormat.nChannels
BufferDesc.fxFormat.lAvgBytesPerSec = BufferDesc.fxFormat.lSamplesPerSec * BufferDesc.fxFormat.nBlockAlign
Set SoundBuffer(Buffer) = DirectSound.CreateSoundBufferFromFile(SoundFile, BufferDesc)
End Sub
Sub DXPlaySound(BufferNum As Integer, PlayMode As Integer)
SoundBuffer(BufferNum).Play PlayMode
End Sub
Sub DXStopSound(BufferNum As Integer)
SoundBuffer(BufferNum).Stop
End Sub
В первой процедуре мы сначала объявляем переменную BufferDesc, которая содержитвсю информацию о текущем звуке. Потом меняем эти параметры в соответствии с указанными и создаёмновый буфер. В DXPlaySound мы вызываем метод Play у указанного буфера для проигрывания звука, при этоуказываем ему в качестве параметра номер буфера и способ проигрывания: 0 - проиграть один раз,1 - проигрывать бесконечно. В последней процедуре тоже самое, но вызывается метод Stop.
Теперь напишем процедуры для изменения баланса и громкости буферов.
Sub DXSetSoundBufferPan(Buffer As Integer, PanVolume As Integer)
Select Case PanVolume
Case 0
SoundBuffer(Buffer).SetPan -10000
Case 100
SoundBuffer(Buffer).SetPan 10000
Case Else
SoundBuffer(Buffer).SetPan (100 * PanVolume) - 5000
End Select
End Sub
Sub DXSetSoundBufferVolume(Buffer As Integer, Volume As Integer)
SoundBuffer(Buffer).SetVolume (60 * Volume) - 6000
End Sub
Здесь кончается написание кода для модуля. Теперь приступим к форме. Создайте и расположите элементы управления примерно как на рисунке.
Поменяйте параметр Name у кнопок на "Play" с индексами от 0 до 3, уполос прокрутки громкости на "Vol", у полос прокрутки баланса на "Pan", у надписей,отображающих их состояние на "VolV" и "PanV" также с индексами 0-3. Теперь напишем коддля Form_Load и Form_Unload.
Private Sub Form_Load()
"Инициализируем DirectSound
DXCreateSound Me.HWnd
"Устанавливаем количество буферов
DXSetSoundBuffers 3
"Загружаем 4 звука в 4 буфера
DXLoadSound 0, App.Path & "/Sounds/bigwarning.wav", 11025, 8, 1
DXLoadSound 1, App.Path & "/Sounds/sparks.wav", 11025, 8, 1
DXLoadSound 2, App.Path & "/Sounds/dronemachine3.wav", 11025, 8, 1
DXLoadSound 3, App.Path & "/Sounds/labdrone1.wav", 11025, 8, 1
End Sub
Private Sub Form_Unload(Cancel As Integer)
"Уничтожаем DS
DXDestroySound
End Sub
Теперь код для кнопок.
Private Sub Play_Click(Index As Integer)
If Play(Index).FontBold = False Then
Play(Index).FontBold = True
DXPlaySound Index, 1
Else
Play(Index).FontBold = False
DXStopSound Index
End If
End Sub
Здесь мы определяем параметр FontBold у кнопки: если False, то звук не играет. Тогдапараметру FontBold присваивается значение True, и начинает играть звук. Если параметр FontBold True,то всё наоборот.
Private Sub Vol_Change(Index As Integer)
DXSetSoundBufferVolume Index, Vol(Index).Value
VolV(Index).Caption = Vol(Index).Value
End Sub
Private Sub Vol_Scroll(Index As Integer)
Vol_Change Index
End Sub
В процедуре Vol_Change мы меняем громкость буфера и отображаем текущее состояние.Во второй процедуре мы обращаемся к первой, чтобы изменять громкость во время перемещения полосы прокруткимышкой.
Private Sub Pan_Change(Index As Integer)
DXSetSoundBufferPan Index, Pan(Index).Value
PanV(Index).Caption = Pan(Index).Value - 50
End Sub
Private Sub Pan_Scroll(Index As Integer)
Pan_Change Index
End Sub
Здесь тоже самое, только с балансом.
Теперь программа должна работать. Сохраните её перед запуском на всякий случай (при некоторыхошибках VB вылетает) и посмотрите, что получилось. Во время работы программа должна выглядеть примерно так.
На этом всё.