vc播放声音函数PlaySound和sndPlaySound的用法

来源:互联网 发布:淘宝网商品怎么打折 编辑:程序博客网 时间:2024/05/01 16:53

转自百度空间QQ:

 

vc播放声音函数PlaySound和sndPlaySound的用法 资料

PlaySound和sndPlaySound的用法

需要头文件
#include "Mmsystem.h"
#pragma comment(lib,"winmm.lib")
//循环播放
PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
//播放一次
//PlaySound((LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);
详情请查MSDN->PlaySound

因为只需在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);

函数sndPlaySound的功能与PlaySound类似,但少了一个参数。函数的声明为:

BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);

除了不能指定资源名字外,参数lpszSound与PlaySound的是一样的。参数fuSound是如何播放声音的标志,可以是SND_ASYNC、SND_LOOP、SND_MEMORY、SND_NODEFAULT、SND_NOSTOP和SND_SYNC的组合,这些标志的含义与PlaySound的一样。

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

三、播放标志以及含义:

SND_APPLICATION
用应用程序指定的关联来播放声音。

SND_ALIAS
pszSound参数指定了注册表或WIN.INI中的系统事件的别名。

SND_ALIAS_ID
pszSound参数指定了预定义的声音标识符。

SND_ASYNC
用异步方式播放声音,PlaySound函数在开始播放后立即返回。

SND_FILENAME
pszSound参数指定了WAVE文件名。

SND_LOOP
重复播放声音,必须与SND_ASYNC标志一块使用。

SND_MEMORY
播放载入到内存中的声音,此时pszSound是指向声音数据的指针。

SND_NODEFAULT
不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。

SND_NOSTOP
PlaySound不打断原来的声音播出并立即返回FALSE。

SND_NOWAIT
如果驱动程序正忙则函数就不播放声音并立即返回。
SND_PURGE
停止所有与调用任务有关的声音。若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。
SND_RESOURCE
pszSound参数是WAVE资源的标识符,这时要用到hmod参数。
SND_SYNC
同步播放声音,在播放完后PlaySound函数才返回。