【转】windows播放函数PlaySound

http://blog.csdn.net/qiuchenl/article/details/7774641

在编写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);停止播放另一线程的同步播放模式,不会得到想要的结果

原文地址:https://www.cnblogs.com/Lthis/p/4461010.html