在编写windows程序时,很多时候要用到播放音乐的函数,而windows下就提供了一个函数PlaySound
首先说下这个函数的使用范围,PlaySound函数用于播放一个音频文件,且这个文件时wav格式(且只能是wav格式),如果你需要混音,比如同时播放两首音乐,那就超出了Playsound的能力,你需要用directsound的库
下面看一下百度百科中PlaySound函数的原型(http://baike.baidu.com/view/1014003.htm):
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);
pszSound就是你要播放的文件路径,fdwSound就是你要选择的播放模式
(1) PlaySound("ring.wav",NULL,SND_FILENAME|SND_SYNC);
(2) PlaySound("ring.wav",NULL,SND_FILENAME|SND_ASYNC |SND_LOOP);
以上是常用的两种播放形式,
(1)中是播放目录下的ring.wav文件,但是该函数阻塞,当ring.wav播放完毕才返回
(2)中的函数是循环播放,函数执行完立刻返回,也就是非阻塞式。
由上面可以看出SND_SYNC参数表示同步播放,也就是阻塞型。SND_ASYNC 表示异步播放,非阻塞。SND_LOOP表示循环播放但是它必须和SND_ASYNC参数同时使用,如果是循环播放必然是异步的。
在播放音频时,你可能会停止播放,PlaySound停止播放的办法就是播放另一音频,如果播放的音频为空,就会停止原来音频。如下:
PlaySound(0,0,SND_FILENAME);
这个方法很明显可以停止异步播放模式,形如(2),但是(1)中是阻塞式,如果在不影响其他其他工作时,使用(1)播放就要新开一个线程。这时如果你想在住线程中用PlaySound(0,0,SND_FILENAME);停止播放音频,就不会得到想要的结果。
主线程() 播放线程()
{ {
PlaySound(0,0,SND_FILENAME); PlaySound("ring.wav",NULL,SND_FILENAME|SND_SYNC);
} }
这时主线程调用PlaySound(0,0,SND_FILENAME);不会停止播放而是阻塞在PlaySound函数,当播放线程中音频播放完毕,主线程函数才会继续执行。
所以如果想用PlaySound(0,0,SND_FILENAME);停止播放另一线程的同步播放模式,不会得到想要的结果