Проигрывание Wave-файлов под MFC
1. Введение
В этой главе мы создадим программу, проигрывающую
WAVE-файлы. Для начала создадим проект mysound в диалоговом режиме с
использованием MFC. В начало файла mysoundDlg.cpp надо написать #include
, но это не всё, а теперь самое главное( если это не сделать,
то будет ошибка при линковании ) :
1. Выберите Project -> Settings... --> C/C++ --> Code
Generation и поставте Multithreaded DLL
2. Выберите Project -> Settings... -->
Link --> General и поставте в поле Object/Library modules библиотеку winmm.lib( это очень важно, проверте !!! )
2. Проигрывание Wave-файла в виде ресурса
Первым делом надо создать ресурс, для этого в файле
mysound.rc2 надо вписать строчку IDSOUND_CORRECT sound rescorrect.wav, где
IDSOUND_CORRECT - индефикатор ресурса, sound - тип ресурса( название можно
менять ), rescorrect.wav - файл ресурса. После этого в файле Resource.h надо
зарегистрировать ресурс: #define IDSOUND_CORRECT 130. Число 130 не должно
совпадать с другими числами.
Как только ресурс зарегистрирован можно написать в
файле mysoundDlg.cpp функции проигрывания этого ресурса :
static void
PlayResource(LPCTSTR lpszSound) { HRSRC hRes; // resource handle to wave file
HGLOBAL hData; BOOL bOk = FALSE; if ((hRes =
::FindResource(AfxGetResourceHandle(), lpszSound, _T("sound"))) !=
NULL &&
(hData = ::LoadResource
(AfxGetResourceHandle(), hRes)) != NULL)
{
// found the
resource, play it bOk = sndPlaySound((LPCTSTR)::LockResource(hData),
SND_MEMORY|SND_SYNC|SND_NODEFAULT); FreeResource(hData); } if (!bOk)
{ AfxMessageBox("ERROR !!! Can not play the sound.
nNot find sound board !!!"); } } inline static void PlayResource(UINT
nIDS) {
PlayResource(MAKEINTRESOURCE(nIDS)); }
В фунции
::FindResource(AfxGetResourceHandle(), lpszSound, _T("sound")) третий параметр - тип ресурса, который был описан выше.
Теперь можно проиграть ресурс : PlayResource(
IDSOUND_CORRECT );
3. Проигрывание Wave-файла с диска
Для проигрывания WAVE-файла с диска можно использовать
функцию :
BOOL
sndPlaySound( LPCTSTR
lpszSoundName;
UINT fuOptions;
); Параметры функции:
lpszSoundName
Имя файла. Если этот параметр
NULL,
то проигрывание файла останавливается. fuOptions
Специальные опции для проигрывания музыки.
Они могут быть следующими:
Значение Описание
SND_SYNC Музыка играется синхронно, и функция
не возвращает указатель пока не будет конца файла.
SND_ASYNC Музыка играется асинхронно, и функция
возвращает указатель сразу после начала
проигрывания файла. Чтобы остановить проигрывание,
надо вызвать функцию SndPlaySound с параметром
lpszSoundName установленным в NULL.
SND_NODEFAULT Если файл не найден, то функция
возвращает указатель сразу и не
проигрывает стандартный звуковой эффект Windows.
SND_MEMORY Этот параметр нужен для проигрывания
Wave-файла в виде ресурса( из памяти ).
SND_LOOP Этот параметр нужен для проигрывания
Wave-файла в
циклическом режиме. Также
при этом вы должны
использовать влаг SND_ASYNC.
Чтобы
остановить проигрывание, надо вызвать
функцию
SndPlaySound с параметром
lpszSoundName установленным в NULL.
SND_NOSTOP Если музыка уже проигрывается,
то функция
возврвщает FALSE.
Возвращаемое
значение: Если музыка проигрывается
правильно, то
функция возврвщает TRUE, иначе FALSE.
Пример
использования: B
OOL bOk =
sndPlaySound( "test.wav", SND_SYNC);
if (!bOk) {
AfxMessageBox
("Error ! Can not play the sound.
!!!"); }
Список литературы
Для подготовки данной работы были использованы
материалы с сайта http://www.realcoding.net/