Windows音频服务的层次关系参见图12-2。

12.2.1 MessageBeep
函数原型为:
BOOL MessageBeep(
UINT uType // sound type
);
该函数调用后马上返回,若成功返回TRUE,否则返回FALSE。其中,参数uType为声音类型,其可取值见表12-2:
===============================================
uType值 || 声音
===============================================
0xFFFFFFFF(-1) ||用计算机喇叭发出标准嘟声
===============================================
MB_ICONASTERISK || 系统星号
===============================================
MB_ICONEXCLAMATION || 系统感叹号
===============================================
MB_ICONHAND || 系统手
===============================================
MB_ICONQUESTION || 系统问号
===============================================
MB_OK || 系统缺省
===============================================
这些系统事件的声音,可用控制面板中声音与音频设备程序来设置和指定,保存在注册表中。老版本的Windows将这些设置信息保存在win.ini文件的Sounds段中。如:
[Sounds]
SystemAsterisk=chord.wav, Asterisk
SystemExclamation=chord.wav, Exclamation
SystemHand=chord.wav, Critical Stop
SystemQuestion=chord.wav, Question
SystemDefault=ding.wav, Default Beep
SystemStart=data.wav, Windows Start
SystemExit=c:\windows/glass.wav, Windows Exit
若系统没有安装音频设备,则会使用计算机本身的小喇叭来发声;否则,会调用声卡来播放对应的波形文件。
可以用SDK函数waveOutGetNumDevs来判断系统是否安装了音频设备,其原型为:
UINT waveOutGetNumDevs(VOID); // 返回系统中安装的音频设备数
如
if (waveOutGetNumDevs() == 0) {MessageBox(L"No audio device!", L"Error" ); return;}
12.2.2 sndPlaySound
函数原型为:
BOOL sndPlaySound(
LPCSTR lpszSound,
UINT fuSound
);
其中,lpszSound可为注册系统声音的表项,也可为盘中的波形文件,为NULL则停止播放正在播放的任何声音。fuSound为标志参数(无符号整数),可取值为表12-3中所列诸符号常量的或:
表12-3 sndPlaySound函数中的fuSound参数
=============================================================
fuSound值 ||对应数值 ||含义
=============================================================
SND_ASYNC ||0x01 ||异步播放,调用后立即返回(最常用)
=============================================================
SND_LOOP ||0x08 ||循环播放,必须与SND_ASYNC标志同用
=============================================================
SND_MEMORY ||0x04 ||lpszSound指向内存中波形声音映像(可以动态生产声音)
=============================================================
SND_NODEFAULT ||0x02 ||找不到指定声音时,不播放缺省的声音
=============================================================
SND_NOSTOP ||0x10 ||如果有声音正在播放,则不播放指定的声音而直接返回
=============================================================
SND_SYNC ||0x00 ||同步播放,直到声音播完后调用才返回(缺省值)
=============================================================
为了结束异步或循环播放,可以用lpszSound=NULL来调用sndPlaySound函数。
如:
sndPlaySound(L"SystemAsterisk", SND_ASYNC);
sndPlaySound(strWaveFile, SND_LOOP | SND_ASYNC);
sndPlaySound(NULL, 0);
又如:
void CMTestDlg::OnSndplayPlay() {
char filters[] = L"波形音频文件(*.wav)|*.wav|所有文件(*.*)|*.*||";
CFileDialog fDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filters);
if (fDlg.DoModal() == IDOK) {
CString strWavFile = fDlg.GetPathName();
UINT flags = 0;
if (IsDlgButtonChecked(IDC_SNDPLAY_ASYNC)) flags |= SND_ASYNC;
if (IsDlgButtonChecked(IDC_SNDPLAY_LOOP)) flags |= SND_LOOP;
if (IsDlgButtonChecked(IDC_SNDPLAY_NOSTOP)) flags |= SND_NOSTOP;
sndPlaySound(strWavFile, flags);
}
}
void CMTestDlg::OnSndplayStop() {
sndPlaySound(NULL, 0);
}
注意:对波形文件,系统先在当前目录中查找,若没有,再到标准的搜索路径中去查找。若没有找到指定的系统声音或波形文件,则播放系统缺省声音;若没有定义系统缺省声音,则不播放任何声音并返回FALSE。
另外,为了使包含sndPlaySound、PlaySound或MCI函数的程序能够编译通过,必须包含多媒体头文件:
#include
并在项目属性中添加对多媒体库winmm.lib的链接。
12.2.3 PlaySound
sndPlaySound是为了与Win16兼容而保留的老函数,而PlaySound是Win32引进的新函数,它的功能更强大,sndPlaySound只不过是它的子集。其函数原型为:
BOOL PlaySound(
LPCSTR pszSound,
HMODULE hmod,
DWORD fdwSound
);
其中参数
pszSound——含义与fdwSound的设置有关。
若fdwSound标志设置为SND_ALIAS、SND_FILENAME或SND_RESOURCE,则pszSound为系统事件的别 名、文件名或资源ID
若fdwSound标志没有设置这些值,则先在注册表或win.ini中寻找串为pszSound的声音,若没有,则视其为文件名
若pszSound=NULL,则停止播放正在播放的任何声音(同sndPlaySound)。若要停止非波形格式的声音,必须设置fdwSound的标志SND_PURGE
hmod
若设置了fdwSound的标志SND_RESOURCE,则hmod为包含pszSound所指定资源的可执行文件的句柄
若没有设置fdwSound的标志SND_RESOURCE,则hmod必须为NULL
fdwSound——似sndPlaySound的fuSound为标志参数,它除了可取fuSound可取的6个值外,还可以取表12-4中所列的值。
表12-4 PlaySound函数中的fdwSound参数的部分值
=========================================================
fdwSound值 ||对应数值 ||含义
===========================================================
SND_NOWAIT ||0x002000 ||若设备忙,则不等待(不播放声音,立即返回)
============================================================
SND_ ALIAS ||0x010000 ||pszSound为注册项的别名
===========================================================
SND_ ALIAS_ID ||0x110000 ||别名是一个预定义的ID
=============================================================
SND_ FILENAME ||0x020000 ||pszSound为文件名
==========================================================
SND_ RESOURCE ||0x040004 ||pszSound为资源名或原子(atom)
===============================================================
SND_ PURGE ||0x40 ||清除任务的非静止事件
===============================================================
SND_ APPLICATION ||0x80 ||使用应用程序指定关联程序来播放声音
=================================================================
例如:
PlaySound(L"c:\\sounds\\sample.wav", NULL, SND_ASYNC);
若定义了波形资源:
IDR_SAMPLE WAVE "res\\sample.wav"
则可用下面的语句来播放:
PlaySound(MAKEINTRESOURCE(IDR_SAMPLE),
AfxGetInstanceHandle(), SND_ RESOURCE);
也可以用PlaySound来播放系统声音,如
PlaySound(L"SystemHand", NULL, SND_ASYNC);
没有评论:
发表评论