Учись программированию на C++ Builder бесплатно!

Наиболее простой процедурой, управляющей звуком, является процедура Веер. Она не имеет параметров и воспроизводит стандартный звуковой сигнал, установленный в Windows, если компьютер имеет звуковую карту и стандартный сигнал задан (он устанавливается в программе Windows «Панель управления» после щелчка на пиктограмме Звук). Если звуковой карты нет или стандартный сигнал не установлен, звук воспроизводится через динамик компьютера просто в виде короткого щелчка.

Откройте новое приложение, перенесите на него кнопку, в обработчике щелчка которой напишите одно слово:

Веер();

Можете запустить приложение, щелкнуть на кнопке и прослушать стандартный звук Windows или просто щелчок, если стандартный звук не установлен.

Более серьезной процедурой является функция Windows API MessageBeep:

bool MessageBeep(int uType);

Параметр uType указывает воспроизводимый звук как идентификатор раздела [sounds] реестра, в котором записаны звуки, сопровождающие те или иные события в Windows. С помощью приложения Звук в «Панели управления» пользователь может удалить или установит соответствующие звуки.

Параметр uType может иметь следующие значения:

Значение Звук
MB_ICONASTERISK SystemAsterisk - звездочка.
MB_ICONEXCLAMATION SystemExclamation - восклицание.
MB_ICONHAND SystemHand - критическая ошибка.
MB_ICONQUESTION SystemQuestion - вопрос.
MB_OK SystemDefault - стандартный звук.

После запроса звука функция MessageBeep возвращает управление вызвавшей функции и воспроизводит звук асинхронно. Во время воспроизведения приложение может продолжать выполняться.

Если невозможно воспроизвести указанный в функции звук, делается попытка воспроизвести стандартный системный звук, установленный по умолчанию. Если и это невозможно, то воспроизводится стандартный сигнал через динамик.

При успешном выполнении возвращается ненулевое значение. При аварийном завершении возвращается нуль. Можете в своем тестовом приложении ввести еще одну кнопку и написать для нее обработчик:

MessageBeep(MB_OK);

Вы услышите тот же стандартный звук Windows, что и при выполнении процедуры Веер. Или услышите тот же тихий щелчок, если стандартный звук не установлен. Попробуйте установить различные звуки с помощью «Панели управления» и проверить MessageBeep при различных значениях ее параметра.

А теперь давайте займемся более серьезной функцией PlaySound, которая позволяет воспроизводить не только звуки событий Windows, но и любые волновые файлы. Это функция API Windows, параметры которой описаны в модуле mmsystem. Поэтому для использования этой функции в вашем приложении необходимо включить директиву #include <mmsystem.cpp>, поскольку автоматически С++Вuilder ее не включает.

Функция PlaySound определена следующим образом:

bool PlaySound(char *pszSound, HINST hmod, Int fdwSound);

Параметр pszSound представляет собой строку с нулевым символом в конце и определяет воспроизводимый звук. Параметр hmod используется, если звук берется из ресурса. А поскольку далее звуком из ресурса мы пользоваться не будем, то hmod всегда можно задавать равным 0.

Параметр fdwSound является множеством флагов, которые определяют режим воспроизведения и тип источника звука. Ниже приведены значения наиболее важные для воспроизведения произвольных волновых файлов:

Значение Описание
SND_ASYNC Звук воспроизводится асинхронно и функция PlaySound возвращается немедленно после начала воспроизведения. Чтобы прекратить асинхронное воспроизведение волнового файла, надо вызвать PlaySound с параметром pszSound,равным 0.
SND_LOOP Воспроизведение звука постоянно повторяется, пока не вызовется PlaySound с параметром pszSound,равным 0. Одновременно надо установить флаг SND_ASYNC асинхронного воспроизведения звука.
SND_NOSTOP Если заданный звук не может быть воспроизведен, поскольку ресурсы, необходимые для воспроизведения, заняты воспроизведением другого звука, функция PlaySound немедленно вернет false,не воспроизводя заданного звука. Если данный флаг не указан, функция PlaySound пытается остановить воспроизведение другого звука, чтобы устройство могло быть использовано для воспроизведения нового звука.
SND_NOWAIT Если драйвер занят, функция сразу вернется без воспроизведения заданного звука.
SND_PURGE Останавливается воспроизведение любых звуков, вызванных в данной задаче. Если pszSound не равен 0, останавливаются все экземпляры указанного звука. Если pszSound равен 0, то останавливаются все звуки, связанные с данной задачей.
SND_SYNC Синхронное воспроизведение звука события. Функция PlaySound возвращается только после окончания воспроизведения.

Звук, указанный параметром pszSound, должен помещаться в доступную память и должен подходить для установленного драйвера устройства воспроизведения волновых файлов. Функция PlaySound ищет файл звука в следующих каталогах: текущем, каталоге Windows, системном каталоге Windows, каталогах, перечисленных в переменной среды PATH, в списке каталогов, предоставляемых сетью. Если указанный звук не находится, функция PlaySound воспроизводит системный звук по умолчанию. Если функция не может найти и его, то воспроизведения не будет, а вернется значение false.

Пример №1


Оператор воспроизводит асинхронно и однократно стандартный звук Microsoft, который вы обычно можете слышать при открытии Windows. В процессе воспроизведения продолжается выполнение приложения.

PlaySound("С:\\Windows\\Media\\Звук Microsoft.wav",D,SND_ASYNC); 

Чтобы опробовать функцию PlaySound, введите в свое приложение диалог OpenDialog и кнопку со следующим обработчиком щелчка:

if(OpenDialog1->Execute())
PlaySound(OpenDialog1->FileName.c_str(),0,SND_ASYNC);

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

Пример №2


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

PlaySound("SystemStart",0,SND_ASYNC);

Пример №3


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

PlaySound("С:\\Wlndows\\Media\\Звук Microsoft.wav", 0, SND_ASYNC | SND_LOOP);

Если вы ввели в свое приложение подобный оператор (пусть даже и с очень приятной музыкой), вам надо предусмотреть еще и какую-нибудь кнопку, по которой воспроизведение прерывается заданием нового звука или выполнением оператора:

PlaySound(0,0,SND_PURGE);

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

Поделиться