Сергей
Никифоров
DirectX7: Введение
в DirectSound
Ну зачем тебе сдался этот DirectSound? У
тебя же есть Windows API-функции и MCI32.OCX. Ааа!
3D-сурроунда захотелось или несколько звуков
одновременно воспроизводить? Ну тогда ладно -
слушай дальше. Для начала нам нужны
библиотеки DirectX версии 7(не SDK) или выше.
Взять можно с сайта Microsoft. Ну что? Достал DirectX?
Настроение хорошее? Ну тогда вперед, как
говорится: "За работу, начальник!".
Создадим новый проект (Standard EXE). Подключим DirectX
к проекту: "Project - References - DirectX 7 for Visual Basic Type
library". Полный путь на всякий случай:
"C:\WINDOWS\SYSTEM\dx7vb.dll".
Вот мы и сделали первый шаг. Теперь объявим в General
Declarations формы:
Dim dx as New DirectX7 'объявляем
об использовании DirectX7
Dim ds As DirectSound 'объект
DirectSound
Теперь мы создадим несколько звуковых буферов:
для того чтобы воспроизвести одновременно три
звука нам надо создать три буфера и т.д. Мы
объявим два:
Dim dsbuffer1 As DirectSoundBuffer
Dim dsbuffer2 As DirectSoundBuffer
Будем инициализировать? Я не слышу! Громче!
Совсем другое дело :) Для
инициализации создадим небольшой Sub InitSound:
Sub InitSound()
On Local Error Resume Next 'чтобы не вылетал
Set ds = dx.DirectSoundCreate("") 'включаем DirectSound
If Err.Number <> 0 Then
Здеся ставим код, который
должен выполняться, если у человека DirectX-а
нету или он старый.
End If
ds.SetCooperativeLevel Form1.hWnd, DSSCL_NORMAL 'устанавливаем
режим работы, проигрываем на Form1 и с NORMAL priority.
!! В
большинстве случаев можно обойтись DSSCL_NORMAL.
Другие понадобятся только для супер сложных
задач. В частности, DSSCL_WRITEPRIMARY будет не
лишним при одновременной записи и
воспроизведении. А то будет заикаться!!
Dim bufferDesc As DSBUFFERDESC 'необходимые переменные
для
Dim waveFormat As WAVEFORMATEX 'организации простого
wave-буфера
bufferDesc.lFlags = DSBCAPS_CTRLPAN 'ставим флажок буферу,
что будем баловаться с PAN-звуком, т.е. с плавным
звуком.
Стоит замолвить словечко и о других
членах DSBCAPS. Попробуйте поставить
вместо CTRLPAN CTRL3D. Однако такие навороты будут излишними,
т.к. обычно у пользователей две колонки. А иногда
одна... наушники... вообще звука нет. Так что, как говорил
Козьма Прутков: "Нельзя объять необъятное.",
да я и не буду рассказывать про все и посоветую
вам самим сходить в "Object Browser" и
поискать в DxVBLib "DSBCAPS". Тут дело
опыта.
Загрузим-ка в буферы данные:
Set dsbuffer1 = ds.CreateSoundBufferFromFile("Shoot.wav", bufferDesc,
waveFormat)
If Err.Number <> 0 Then
Что делать, если файл не
существует или повреждён.
End If
Set dsbuffer2 =
ds.CreateSoundBufferFromFile("Hit.wav", bufferDesc, waveFormat)
If Err.Number <> 0 Then
Аналогичный код обработчика
ошибок.
End If
End Sub
Ну вот - мы готовы к пробному
воспроизведению звука через DirectSound. Вы не устали?
Сходите на кухню - покушайте супчик... Приятного
аппетита! Ну а с другой частью аудитории мы
пойдём дальше. А дальше мы создадим
небольшой Sub:
Sub PlayPanned(Buffer As DirectSoundBuffer, Position As
Integer) 'Buffer - заданные выше файлы для
воспроизведения, Position - позиция в колонках.
Благодаря смене этого параметра можно сделать
эффект звука из одной колонки в другую.
Buffer.SetPan Position
!! Position
может быть и с "-" и с "+",
зависит это от позиции в колонках. Т.е. идеальным
балансом будет 0 !!
Buffer.Play 0 'Воспроизводим звук. Параметр 0
говорит о том, что звук будет воспроизводиться
один раз. Если поставить параметр 1, то звук будет
постоянно повторяться.
End Sub
Ну вот вроде бы и всё. Ааа! Использование?
Очень просто: PlayPanned dsbuffer1, 0. Надеюсь, что
не утомил вас и научил чему-то полезному.
|