MFC中播放WAV文件的方法

来源:互联网 发布:nba2k14 for mac版 编辑:程序博客网 时间:2024/05/01 08:51

一、使用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);


二、使用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"

原创粉丝点击