MFC中播放WAV文件的方法

来源:互联网 发布:h3c 无线mac地址认证 编辑:程序博客网 时间:2024/05/01 13:24
 

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

原创粉丝点击