C++播放声音总结

C++播放声音总结

Dec 21, 2013
Coding
MFC, Windows, C++, Audio

程序中经常要用到声音,无论是简单的“滴答”,还是一小段乐谱,或者是一首CD。下面就总结一下目前我所知道的C++播放声音的方法。

1.播放系统消息声音 #

在平时使用Windows系统的时候,会经常遇到系统的提醒、警告、错误声音。这种使用MessageBeep实现。函数原型如下

BOOL WINAPI MessageBeep(
  _In_  UINT uType
);

MessageBeep: Plays a waveform sound. The waveform sound for each sound type is identified by an entry in the registry. 播放一个波形声音文件。这个波形声音对应的类型都是注册表中的一项。

使用方法如下

MessageBeep(MB_OK);
Sleep(3000);
MessageBeep(MB_ICONWARNING);
Sleep(3000);
MessageBeep(MB_ICONSTOP);
Sleep(3000);
MessageBeep(MB_ICONERROR);
Sleep(3000);
MessageBeep(MB_ICONEXCLAMATION);

2.播放wav格式声音 #

播放wav格式声音可以使用PlaySound函数,

BOOL PlaySound(
  LPCTSTR pszSound,
  HMODULE hmod,
  DWORD fdwSound
);

PlaySound: The PlaySound function plays a sound specified by the given file name, resource, or system event. 播放一个wav声音,或者是指定路径的wav文件,或者是一个资源,或者是一个系统事件对应的声音。

pszSound指定要播放的声音;fdwSound指定播放声音的类型和播放方式;hmod通常设为NULL,如果声音是资源文件,则设为包含资源文件的模块。

比如

#include <Mmsystem.h>
#pragma comment(lib,"Winmm.lib")

//播放指定路径wav文件
PlaySound(TEXT("recycle.wav"), NULL, SND_FILENAME);//系统声音,清空回收站的声音
PlaySound(TEXT("c:\\love.wav"), NULL, SND_FILENAME);//用户指定声音文件

//播放资源文件中的声音
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), GetModuleHandle(NULL),SND_RESOURCE);//资源中声音

//播放系统事件声音
PlaySound(TEXT("SystemStart"), NULL, SND_ALIAS);//开机声音

Windows的声音有许多,像recycle.wav就这C:\Windows\Media目录下(XP),系统事件如例程中的SystemStart也在该目录下(Windows XP 启动.wav)。这个目录下面还有其他的声音。

系统声音

3.利用MCI接口播放任意格式声音 #

MCI,Media Control Interface,媒体控制接口,是Windows系统提供给应用程序的媒体控制接口,很好很强大。关于MCI的更多使用,我将在以后专门讲解。这里指提供一个简单的例子。

#include <mmsystem.h> //导入声音头文件库
#pragma comment(lib,"winmm.lib")//导入声音的链接库

mciSendString("open C:/123.mp3" , NULL, 0, 0);
mciSendString("play C:/123.mp3 ", NULL, 0, 0);
4.强悍的MCIWndCreate()函数
MCIWndCreate()函数向系统注册一个MCIWnd 窗口类,并创建一个MCIWnd窗口,控制使用MCI设备。它不仅可以播放各种声音,还可以播放AVI文件

#include <Vfw.h>
//#pragma comment(lib,"Vfw32.lib")

int type=MCIWNDF_SHOWALL|MCIWNDF_SHOWNAME; //播放控制条显示方式
CString filename="C:/123.mp3"; //要播放的文件

//创建一个播放窗口
HWND m_hwndMCI=MCIWndCreate(m_hWnd,AfxGetInstanceHandle(),type,filename);

//开始播放
MCIWndPlay(m_hwndMCI);

/*if(m_hwndMCI!=NULL) {MCIWndDestroy(m_hwndMCI);}*///销毁MCIWND 窗口

MCIWnd播放工具条

5. Windows Media Player 控件 #

VC++6.0中,打开 project–>add to project–>Components and Controls –>Registered ActiveX Controls,找到Windows Media Player控件。

Insert这个控件后,我们project中会自动添加17个类,这些都是Windows Media Player 控制相关,同时我们UI设计时的tools bar 中会多出一个控件,那就 Windows Media Player ,拖到窗口上就能使用。

将Windows Media Player控件拖动到自己的对话框窗口,并把该控件关联成Control 类型的变量,如m_ctlWMPlayer,在需要播放音乐的地方,调用其成员函数SetUrl即可播放该文件,如

m_ctrWMPlayer.SetUrl("C:/123.mp3")

2013-5-25 22:11::00 更新

6. 播放蜂鸣 #

使用Beep函数播放不同频率的蜂鸣

BOOL WINAPI Beep(
 __in DWORD dwFreq, //频率
 __in DWORD dwDuration //持续时间
);

while(1)    Beep(5000,500);

该文2010-08-03 19:46首发于我的CSDN专栏。有改动。