一、使用PlaySound()函数
该函数的原型的是:
BOOL PlaySound(
LPCSTR pszSound,
HMODULE hmod,
DWORD fdwSound
)
其中,参数pszSound指定要播放文件的文件名,若该参数为NULL,则停止正在播放的声音;
参数hmod说明资源的句柄;
参数fdwSound则指定该命令的标志,也就是说明播放WAV文件的方式,可以取以下值:
标志 | 说明 |
SND_ASYNC | 异步播放声音 |
SND_SYNC | 同步播放声音(默认) |
SND_NODEFAULT | 若pszSound指定的文件找不到,不使用默认声音 |
SND_MEMORY | pszSound指向的一个内存文件 |
SND_LOOP | 循环播放声音,直到下一次调用PlaySound()且pszSound参数为NULL,此标志要与SND_ASYNC一起使用 |
SND_NOSTOP | 不停止当前正在播放的任何声音 |
SND_RESOURCE | 表示pszSound是一个资源的标识符,而hmod则是包含这个资源的一个实例 |
SND_FILENAME | 表示pszSound是一个文件名 |
SND_ALIAS_ID | 表示pszSound预定义的声音标识符 |
SND_ALIAS | pszSound参数是在注册表或win.ini中定义的一个系统事件,不可与SND_FILENAME或 SND_RESOURCE同时使用。 |
SND_NOWAIT | 如果设备正忙,则立即返回而不播放指定的声音 |
例:
//播放call2.wav
PlaySound("call2.wav",NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
//关闭声音
PlaySound(NULL,NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
补充添加路径:路径上的wav文件
CString filePath;
CFileDialog inDlg(TRUE, NULL, NULL, NULL, _T("wav Files(*.wav)|*.wav"), NULL);
inDlg.GetOFN().lpstrInitialDir = _T("E:\\myData");
if (inDlg.DoModal() == IDOK)
{
filePath = inDlg.GetPathName();
}
else
{
return;
}
PlaySound(filePath,NULL,SND_FILENAME|SND_ASYNC);
二、使用sndPlaySound()函数
该函数的原型的是:
BOOL sndPlaySound(
LPCSTR lpszSound,
UINT fuSound
)
其中,参数lpszSound指定要播放的文件名,若为NULL,则停止正在播放的声音
参数fuSound指定播放的方式,可取以下值:
SND_ASYNC,SND_SYNC,SND_LOOP,SND_MEMORY,SND_DODEFAULT,SND_NOSTOP
各个标志的含义同上。
例:
//播放call1.wav
sndPlaySound("call1.wav",SND_ASYNC | SND_LOOP);
//关闭声音
sndPlaySound(NULL,SND_ASYNC | SND_LOOP);
以上两个函数使用简洁、方便,但有两个缺陷,即:
(1) 整个声音必须放入可用的物理内存中,因此,当文件大小小于100K时使用这两个函数,而在大
于100K时,一般使用MCI方式
(2) 该声音用的必须是已安装的音频驱动程序之一所支持的数据格式。
三、使用MCI命令
使用MCI命令实际上也就是利用以下几个相关的API函数完成播放声音的功能:
mciSendCommand() //向MCI设备发送命令消息
mciSendString() //向MCI设备发送命令字符串
mciGetErrorString() //获取MCI函数的返回值的文本描述信息
1. mciSendCommand()函数
函数原型:
MCIERROR mciSendCommand(
MCIDEVICEID IDDevice,
UINT uMsg,
DWORD fdwCommand,
DWORD_PTR dwParam
);
其中,参数IDDevice是接收命令消息的MCI设备的标识,该参数不与命令消息MCI_OPEN同时使用
参数uMsg是命令消息。具体信息可参考MSDN。
参数fdwCommand用来设置命令消息的标志
参数dwParam指向一个包含命令消息参数的结构体
若函数执行成功返回值为0,否则为错误代码。错误信息可用mciGetErrorString()函数得到。
例:
/******************************
打开音频设备
*******************************/
MCI_OPEN_PARMS mciOpenParms;
DWORD dwResult;
mciOpenParms.lpstrDeviceType=(LPSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
dwResult=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_WAIT,(DWORD)(LPVOID)&mciOpenParms);
/******************************
关闭音频设备
*******************************/
mciSendCommand(m_nDeviceID,MCI_CLOSE,NULL,NULL);
/****************************
播放WAV文件
****************************/
MCI_OPEN_PARMS mciOpenParms;
memset(&mciOpenParms,0,sizeof(MCI_OPEN_PARMS));
//设置要播放的WAV文件名
mciOpenParms.lpstrElementName=pFileName;
//打开WAV文件
DWORD dwResult=mciSendCommand(m_nDeviceID,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);
2. mciSendString()函数
函数原型:
MCIERROR mciSendString(
LPCTSTR lpszCommand,
LPTSTR lpszReturnString,
UINT cchReturn,
HANDLE hwndCallback
);
其中,参数lpszCommand是一个以'\0'结尾的命令字符串,相关字符串与mciSendCommand()函数中参数uMsg的消息相对应,详见
MSDN
参数lpszReturnString指向一个用来存储返回信息的缓冲区。若不需要返回信息,可设为NULL
参数cchReturn是用来存储返回信息的lpszReturnString的字节数
若在命令字符串中指定了"notify"(通告),则参数hwndCallback指向一个回调窗口。
返回值与mciSendCommand()函数相似
3. mciGetErrorString()函数
函数原型:
BOOL mciGetErrorString(
DWORD fdwError,
LPTSTR lpszErrorText,
UINT cchErrorText
);
其中,参数fdwError是mciSendCommand()函数或mciSendString()函数返回的错误码
参数lpszErrorText指向一个缓冲区,该缓冲区接收一个以'\0'结尾的错误描述字符串
参数cchErrorText用来存储返回信息的lpszErrorText的字节数
例:
char szErrorMsg[MAXERRORLENGTH];
//获取错误描述信息
if(!mciGetErrorString(dwError,szErrorMsg,sizeof(szErrorMsg)))
strcpy(szErrorMsg,"Unknown Error!");
另外,需要注意的是:要包含一个头文件"Mmsystem.h",在链接的时候也要使用一个库文件"Winmm.lib"