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. |