
- •Глава 1. Принципы разработки программ в современных ос ................................. 12
- •§ 1.1. Операционные системы для пэвм ................................................................. 12
- •§ 1.2. Основы программирования в ос Windows ..................................................... 26
- •§ 4.3. Организация памяти в ос Windows................................................................. 103
- •§ 8.5. Обмен информацией по технологии связывания и внедрение объектов ......210
- •Глава 1. Принципы разработки программ в современных ос
- •§ 1.1. Операционные системы для пэвм
- •§ 1.2. Основы программирования в ос Windows
- •§ 1.3. Принципы разработки динамических библиотек
- •Глава 2. Организация многозадачности в современных ос
- •§ 2.1. Общие принципы организации многозадачности
- •§ 2.2. Основы многозадачности в ос Windows
- •Глава 3. Прерывания и исключения
- •§ 3.1. Система обработки прерываний
- •§ 3.2. Общие принципы обработки исключений
- •Глава 4. Организация памяти в современных ос
- •§ 4.1. Общие принципы организации памяти
- •§ 4.2. Способы распределения памяти
- •§ 4.3. Организация памяти в ос Windows
- •§ 4.4. Интерфейсы api-функций для управления памятью в ос Windows
- •Глава 5. Организация ввода-вывода в современных ос
- •§ 5.1. Общие принципы организации ввода-вывода
- •§ 5.2. Общие принципы размещения данных на магнитных дисках
- •§ 5.3. Организация файлового ввода-вывода в ос Windows
- •Глава 6. Реестр ос windows
- •§ 6.1. Структура и особенности реестра Windows
- •Глава 7. Организация безопасности в ос windows
- •§ 7.1. Технологии безопасности, реализованные в Windows
- •§ 7.2. Создание структуры security_attributes
- •Глава 8. Технологии обмена информацией в ос windows
- •§ 8.1. Обмен информацией посредством буфера обмена Windows
- •§ 8.2. Обмен информацией посредством каналов
- •§ 8.3. Обмен информацией с использованием сокетов
- •§ 8.4. Обмен информацией по технологии динамического обмена данными
- •§ 8.5. Обмен информацией по технологии связывания и внедрение объектов
- •Глава 9. Технологии обработки мультимедиа
- •§ 9.1. Обзор мультимедийных устройств Windows
- •§ 9.2. Элементарные api-функции для обработки звука
- •§ 9.3. Технология обработки формата riff
§ 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, также изменяется от сообщения к сообще-
нию. Он всегда представляет собой структурированную переменную, содержащую либо
информацию, которая необходима устройству для выполнения команды, либо пустые
поля, которые будут заполнены устройством в результате выполнения команды.