Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #44, ИЮЛЬ 2004 г.

Direct Sound в объятиях программиста

Фленов Михаил

Спецвыпуск Xakep, номер #044, стр. 044-014-4


procedure TForm1.PlayButtonClick(Sender: TObject);

begin

if FileExists(Edit1.Text) then

begin

LoadWaveFile(Handle, pChar(Edit1.Text));

if not PlayBuffer(false) then

Application.MessageBox('Да здравствуют глюки!', 'Ошибочка вышла');

end;

end;

Сначала мы проверяем, существует ли файл. Если путь указан верно, и файл найден, то загружаем его функцией LoadWaveFile. Что в ней происходит, лучше и не знать, потому что в ней я наделал кучу злых выкрутасов, разобраться с которыми сложно :). Конечно, если ты знаком с форматом файла WAV, то проблем с разбором кода не возникнет.

Во время загрузки буфер заполняется звуковыми данными, и нам остается только воспроизвести их. Для этого используем функцию PlayBuffer. В качестве параметра ей нужно указать false для однократного проигрыша и true – для бесконечного.

Внешний вид функции PlayBuffer можно увидеть в листинге 2. В ней сначала идет проверка на существование буфера, проверяется входной параметр, и запускается метод Play интерфейса звукового буфера.

Чтобы остановить воспроизведение, нужно вызвать функцию StopBuffer. У нее только один логический параметр - если в нем указать false, то позиция воспроизведения останется на месте, иначе перейдет в ноль (начало файла). Следовательно, чтобы сделать паузу, достаточно вызвать StopBuffer с параметром false. Сама функция выглядит следующим образом:

procedure StopBuffer(resetPos: boolean);

begin

if not Assigned(DSBuffer) then

exit;

DSBuffer.Stop;

if resetPos then

DSBuffer.SetCurrentPosition(0);

end;

Удачи, наш ласковый мишка

После работы с DirectSound его необходимо выгрузить. Для этого достаточно вызвать функцию FreeDirectSound, которая в моем модуле выглядит следующим образом:

procedure FreeDirectSound;

begin

if Assigned(WaveSoundRead) then

WaveSoundRead.Free;

if Assigned(DSBuffer) then

DSBuffer := NIL;

if Assigned(DS) then

DS := NIL;

end;

Вначале проверяем, если были загружены какие-то данные, то освобождаем объект WaveSoundRead. Этот объект создавался при загрузке файла незаметно для нас. Для уничтожения самого Direct Sound достаточно обнулить переменные интерфейсов, которые мы создавали, только в обратном порядке. Последним создавался буфер (переменная DSBuffer), поэтому обнуляем ее. А самым первым создавался интерфейс Direct Sound (переменная DS), поэтому он имеет право быть уничтоженным последним.

Конфигурация колонок

В нашем примере использовались настройки колонок по умолчанию. Но ты можешь указать собственные значения. Для этого используется функция SetSpeakerConfig интерфейса IDirectSound, которой достаточно передать одну из следующих констант:

- DSSPEAKER_HEADPHONE для наушников;

- DSSPEAKER_MONO звук моно;

- DSSPEAKER_STEREO для стерео;

- DSSPEAKER_QUAD для четырех колонок;

- DSSPEAKER_SURROUND для наиболее качественного звука surround.

Обрати внимание, что настройки касаются всего окружения, и будут влиять на все буферы. А вот устанавливать громкость можно для каждого буфера в отдельности. Для этого у интерфейса IDirectSoundBuffer есть методы GetVolume и SetVolume. Для первой функции в качестве единственного параметра нужно указать переменную, в которой нам возвратят текущую громкость. В функции SetVolume нужно указать изменение громкости. Например, если хочешь сделать звук тише на 10 дБ, нужно передать значение -10.

Назад на стр. 044-014-3  Содержание  Вперед на стр. 044-014-5