在編寫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);停止播放另一線程的同步播放模式,不會得到想要的結果