VC实现wav录音文件的播放

来源:互联网 发布:sql if else 循环 编辑:程序博客网 时间:2024/04/27 03:27

因为只需在Windows上执行,先想到用MCI接口。试了一下,用mciSendCommand可以实现基本的播放wav文件的功能。但循环播放wav就麻烦了,必须向窗口传送MM_MCINOTIFY消息。

google了一下,才发现原来有更简单的方法——用sndPlaySound。一条语句sndPlaySound(filename, SND_ASYNC | SND_LOOP)就可以循环播放声音文件,完全满足我的要求。简单吧。

函数定义是:
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);

其中,lpszSound一般是wav文件的文件名,fuSound是参数。常见的fuSound参数有:
SND_ASYNC 异步播放,即程序不等播放结束就继续执行,播放背景声。
SND_SYNC 同步播放,即播放结束才继续执行
SND_LOOP 循环播放
SND_NODEFAULT 如果找不到指定文件,保持安静。如不指定此参数,则播放系统默认警告音。如没有默认警告音,则为失败。

执行成功返回TRUE,失败返回FALSE。

要停止播放只需再执行一遍lpszSound参数为NULL的sndPlaySound函数。

要求:
程序要加入Mmsystem.h,编译时链入Winmm.lib库。

限制:
sndPlaySound只能播放wav文件。
wav文件在播放前将被装入内存,所以不能太大。
只能同时播放一个声音。后一个声音会关闭前一个声音。

函数PlaySound是sndPlaySound的增强版,支持更多声音类型和fuSound参数,并可以播放内存和资源中的声音。

或者增加以下: 
#include <Mmsystem.h> 
#pragma comment(lib, "Winmm.lib") 

PlaySound(...)

第一种方法是直接播出声音文件,相应的代码为: 
PlaySound("c:\win95\media\The Microsoft Sound.wav", NULL, SND_FILENAME | SND_ASYNC); 
注意参数中的路径使用两个连续的反斜杠转义代表一个反斜杠。 

第二种方法是把声音文件加入到资源中,然后从资源中播放声音。Visual C++支持WAVE型资源,用户在资源视图中单击鼠标右键并选择Import命令,然后在文件选择对话框中选择The Microsoft Sound.wav文件,则该文件就会被加入到WAVE资源中。假定声音资源的ID为IDR_STARTWIN,则下面的调用同样会输出启动声音: 
PlaySound((LPCTSTR)IDR_STARTWIN, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC); 

第三种方法是用PlaySound播放系统声音,Windows启动的声音是由SystemStart定义的系统声音,因此可以用下面的方法播放启动声音: 
PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);


sndPlaySound不能直接播放声音资源。要用该函数播放WAVE文件,可按下面的方式调用: 
sndPlaySound(“MYSOUND.WAV”,SND_ASYNC);

注意:在win32 console程序的main函数调用时,需要加上屏幕的休眠方法

//////////////////////////////////////////////////////////////////////#include <stdio.h>#include <windows.h>#include <Mmsystem.h>#pragma comment(lib,"Winmm.lib")int main(int argc,char args[]){ sndPlaySound("c:\\shutdown.wav",SND_ASYNC); system("pause");   return 0;}


原创粉丝点击