15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

Сергей Никифоров

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. Надеюсь, что не утомил вас и научил чему-то полезному.

Ваш комментарий: