Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Operatsionnye_sistemy.doc
Скачиваний:
151
Добавлен:
12.03.2015
Размер:
4.94 Mб
Скачать

§ 9.2. Элементарные api-функции для обработки звука

Программные средства обработки звука. По общепринятой договоренности фай-

лам звукозаписи присваивается расширение WAV. Для воспроизведения звука большин-

ство программ используют одну из трех простейших функций, которые лучше всего

подходят для работы с короткими WAV-файлами.

MessageBeep() - Воспроизводит системные звуки, занесенные в реестр в качестве сигна-

лов предупреждений и сигналов об ошибках.

SndPlaySound() - Воспроизводит звук непосредственно из WAV-файла или из буфера в

памяти.

PlaySound() - Новая функция Win32, которая во многом дублирует команду

sndPlaySound, но имеет два отличия: она не воспроизводит фрагменты, находящиеся в

памяти, но позволяет прослушивать звукозаписи, которые хранятся в ресурсах типа

WAVE.

Функция MessageBeep() принимает единственный параметр, указывающий один из

пяти системных звуков, сконфигурированных с помощью панели управления. Дополняя

каждый вызов функции MessageBox() функцией MessageBeep(), можно сопровождать

звуковыми сигналами все сообщения различного уровня важности. Например, если

функция MessageBox() отображает значок MB_ICONHAND, в качестве аргумента Mes-

227

sageBeep() также должен задаваться параметр MB_ICONHAND. Воспроизводимый звук

определяется записью SystemHand в системном реестре.

В табл. 9.2 приведен список допустимых значений параметра функции Message-

Beep(), а также соответствующих им записей в реестре.

Таблица 9.2

Значение параметра

0xFFFFFFFF

MB_ICONASTERISK

Запись в реестре

Стандартный сигнал, воспроизводимый через динамик

компьютера

SystemAsterisk

MB_ICONEXCLAMATION SystemExclamation

MB_ICONHAND

MB_ICONQUESTION

MB_OK

SystemHand

SystemQuestion

SystemDefault

С помощью панели управления или редактора реестра пользователь может связать

с этими сигналами любой WAV-файл. Подобно всем остальным функциям, связанным с

воспроизведением звуков, функция MessageBeep() требует наличия драйвера соответст-

вующего устройства. Обычный динамик персонального компьютера не является адек-

ватным мультимедийным устройством.

С помощью функции sndPlaySound() можно воспроизвести любой системный звук,

зафиксированный в реестре и сконфигурированный с помощью панели управления

(кроме пяти стандартных системных звуков могут использоваться дополнительные), или

воспроизвести непосредственно WAV-файл.

BOOL sndPlaySound( LPCTSTR lpszSoundName,

UINT uFlags );

// файл или запись реестра

// флаги семейства SND_

Первый параметр указывает на запись в реестре, например SystemStart или Sys-

temQuestion. Кроме того, он может содержать полный путь и имя WAV-файла. Функция

sndPlaySound() требует свободного объема памяти, достаточного для полной загрузки

всего файла звукозаписи. Она лучше всего работает со звуковыми файлами, размер ко-

торых не превышает 100 Кб.

В качестве второго параметра ожидается флаг, задающий параметры воспроизве-

дения звука. Ниже приведено несколько возможных значений этого параметра.

SND_MEMORY- Определяет первый параметр как указатель объекта, находящегося в

памяти, а не как имя файла или системный звук.

SND_SYNC - Завершает воспроизведение звука и после этого возвращает управление

программе.

SND_ASYNC- Возвращает управление программе немедленно и воспроизводит звук в

фоновом режиме.

SND_ASYNC | SND_LOOP - Возвращает управление программе немедленно и в фоно-

вом режиме воспроизводит звук до тех пор, пока программа не вызовет функцию

sndPlaySound() со значением NULL в качестве первого параметра.

SND_NODEFAULT - Запрещает воспроизведение каких-либо звуков, если невозможно

найти заданный файл. Обычно функция sndPlaySound() в таких случаях воспроизводит

стандартный системный звук SystemDefault.

Для воспроизведения звуков, скомпилированных в виде ресурсов, лучше всего

подходит функция PlaySound().

BOOL PlaySound( LPCTSTR lpszSoundName, // имя файла или ресурса

HANDLE hModule,

228

// источник звукового ресурса

DWORD dwFlags );

// опции воспроизведения

Функция интерпретирует первый параметр в соответствии с установленными фла-

гами.

SND_ALIAS - Воспроизводит звук, заданный в системном реестре. Первый параметр

представляет собой псевдоним, записанный в реестре, например SystemAsterisk или Sys-

temHand.

SND_FILENAME - Воспроизводит звук, записанный в WAV-файле, по аналогии с

функцией sndPlaySound(). Первый параметр указывает имя файла.

SND_RESOURCE - Воспроизводит звук, содержащийся в программном ресурсе. Пер-

вый параметр представляет собой идентификатор ресурса, который возвращается мак-

рокомандой MAKEINTRESOURCE.

Эти три флага являются взаимоисключающими. Кроме них функция PlaySound()

распознает некоторые флаги, определенные для sndPlaySound(), например

SND_NODEFAULT и SND_ASYNC. Флаг SND_MEMORY она не распознает.

Если в составе параметра dwFlags отсутствует флаг SND_RESOURCE, второй па-

раметр, hModule, игнорируется. В противном случае параметр hModule идентифицирует

программу, ресурсы которой включают звукозапись, указанную аргументом lpszSound-

Name. Данный дескриптор может быть получен с помощью функции GetModuleHandle(),

LoadLibrary() или GetWindowLong().

В Windows не определено ключевое слово WAVE, которое могло бы использовать-

ся в файлах ресурсов по аналогии с ключевыми словами ICON и BITMAP, но вы всегда

можете самостоятельно определить собственный тип ресурса [12].

<имя ресурса> WAVE <имя файла> // добавить звукозапись к ресурсам программы

Параметр <имя ресурса> представляет собой имя, используемое для нового ресур-

са, а параметр <имя файла> указывает на WAV-файл. Функция PlaySound() всегда

ищет ресурсы, тип которых определен как WAVE.

Функции PlaySound(), MessageBeep() и sndPlaySound() просты в использовании, но

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

и микшировать звуки, изменять уровень громкости, нужны дополнительные команды.

Основным средством мультимедийного программирования является MCI - интерфейс,

который описан ниже.

MCI-операции организованы в виде командных сообщений, которые передаются

устройствам. В общем случае операция начинается с открытия устройства; затем посы-

лается команда, например MCI_PLAY или MCI_STOP, которая заставляет устройство

начать воспроизведение, остановиться, начать запись, "перемотку" и т.д. Наконец, про-

исходит закрытие устройства.

Самой важной и многоцелевой среди MCI-функций является функция mciSend-

Command(). Она служит для передачи устройству одного из многочисленных сигналов.

MCIERROR mciSendCommand( MCIDEVICEID mciDeviceID,

// идентификатор устройства

HINT uMessage,

DWORD dwFlags,

dwParamBlock );

// номер сообщения

// флаги DWORD

// информационная структура

Первый параметр mciDeviceID, представляет собой адрес конкретного устройст-

ва. При открытии устройства команда mciSendCommand возвращает его идентификатор,

229

который сообщает Windows, куда должны быть адресованы сообщения, посылаемые по-

следующими командами.

Второй параметр uMessage, представляет собой константу, например:

MCI_OPEN- Открывает устройство (начало сеанса).

MCI_CLOSE- Закрывает устройство (конец сеанса).

MCI_SET- Изменяет установки устройства.

MCI_PLAY- Начинает воспроизведение.

MCI_STOP- Прерывает выполнение текущей операции.

MCI_RECORD- Начинает запись звука.

MCI_SAVE- Сохраняет записанный фрагмент в виде файла.

Третий параметр dwFlags, обычно представляет собой комбинацию нескольких

флагов, которые помогают Windows интерпретировать команду. Набор возможных фла-

гов изменяется в зависимости от конкретного сообщения, но некоторые из них являются

общими для всех сообщений. Например, функция mciSendCommand() обычно работает

асинхронно. Когда эта команда инициирует операцию с устройством, она не ожидает

завершения выполнения этой операции, а немедленно завершается, в то время как уст-

ройство продолжает выполнение операции в фоновом режиме. Если необходимо знать,

когда выполнение операции закончится, следует установить флаг MCI_NOTIFY, и под-

система WinMM передаст сообщение о завершении, что может быть необходимым при

закрытии устройства по завершению воспроизведения звука. Флаг MCI_WAIT иниции-

рует синхронную работу (по команде mciSendCommand() выполнение программы оста-

навливается до тех пор, пока устройство не завершит выполнение текущей задачи).

Последний параметр dwParamBlock, также изменяется от сообщения к сообще-

нию. Он всегда представляет собой структурированную переменную, содержащую либо

информацию, которая необходима устройству для выполнения команды, либо пустые

поля, которые будут заполнены устройством в результате выполнения команды.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]