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

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

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

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


Эмуляция – образная вещь. Конечно же, если звуковая не поддерживает стереозвучание, то его и не будет. Просто программа будет думать, что оно есть, и сможет выпендриваться на два канала, хотя реально из колонок будет идти звук моно.

Но в некоторых случаях эмуляция позволяет заставить железо работать так, как оно изначально не умеет. Например, если звуковая не поддерживает аппаратное MIDI, то DirectSound позволяет сделать это программно. Правда, такая эмуляция достигается довольно большой нагрузкой на проц. А кто говорил, что все будет прекрасно? Нечего использовать звук, встроенный в чипсет, простой Creative сейчас стоит не так уж и дорого, а по возможностям превосходит его в несколько раз.

В Direct Sound есть методы определения тех возможностей, которые звуковая карта поддерживает аппаратно. Это очень удобно при создании игр. Например, если на компьютере установлена простейшая звуковая карта, то нет смысла заставлять ее работать с 3D эффектами, потому что они будут обрабатываться программно. А это грозит лишними нагрузками на процессор, и он уже не сможет в полной мере заниматься просчетом графики. Поэтому при загрузке игры или демки лучше проверить аппаратную поддержку нужных эффектов. Для многих лучше пожертвовать звуком, чем графикой, потому что играть на тормозах просто нереально.

Если запустить программу диагностики DirectX, то на закладке «Музыка» можно увидеть, какие возможности поддерживаются аппаратно, а какие реализуются эмуляцией.

Как проще кодить?

Чтобы не заморачиваться с кодингом Direct Sound, для простых программ можно поступить умнее – использовать через COM компонент Media Player. Он работает как раз через Direct Sound и достаточно наворочен. Проинсталлировав плеер как ActiveX, легко можно будет работать как с аудио, так и с видео. По сути, ты получишь в свое распоряжение тот самый “Windows Media Player”, со всеми его достоинствами, недостатками, сказками, легендами и тостами.

Конечно, этот вариант слишком прост для нас, поскольку присутствует ограничение открытыми интерфейсами, и многое остается недоступным. Поэтому лучше чуть попотеть и написать собственный плеер, который будет намного мощнее.

Кодинг

Чтобы сократить количество кода в статье, я написал пару модулей, которые можно будет взять вместе с исходником на диске:

- PlaySnd.pas для работы с Direct Sound;

- ReadWav.pas для чтения WAV файла.

Посмотрим, как ими пользоваться. Создадим новый проект в Delphi, и в раздел uses добавим модуль PlaySnd. По событию OnCreate для формы мы будем инициализировать звуковую систему. Для этого достаточно вызвать функцию InitDirectSound(Handle). Код этой функции можно увидеть в листинге 1, но писать его в наш проект не надо, потому что он уже описан в модуле PlaySnd.

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

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