2014-05-12 57 views
1

PlaySound完美地工作,如果我需要一個嘟嘟聲。下面舉例說明我的代碼片段:如何多次使用播放功能?

PlaySound(TEXT("C:\\Test1.wav"), NULL, SND_ASYNC); 

我的問題是,如何使用這個函數兩次或兩次以上,因爲它只能播放一次,不管我放在一起的重複量。我也試過這個:

PlaySound(TEXT("C:\\Test1.wav"), NULL,SND_FILENAME|SND_LOOP|SND_ASYNC); 

它在連續循環中發出嘟嘟聲。如何玩這個兩次或三次等?

使用循環無助於

+0

當你在(外部)循環中使用它時,是否嘗試將'SND_ASYNC'更改爲'SND_SYNC'?即使這種變化起作用,但它並不理想,因爲它會阻止。 – jedwards

+0

@timCastelijns我剛剛嘗試過。它仍然只玩一次。 – user133442

回答

0

問題是SND_ASYNC標誌。它表示您希望立即返回此通話並在後臺播放聲音。

如果你在循環中這樣做,因爲它會在聲音仍在播放的情況下返回,它將與下一個呼叫重疊並且什麼也不做,因爲IIRC,應用程序只能同時對PlaySound進行一次呼叫。

解決的方法是用SND_SYNC替換SND_ASYNC(或將其刪除,因爲它是默認值)。如果你需要這個呼叫是異步的,你可以創建一個線程併發出你想要播放的聲音。該線程將同步播放,但您的其他線程不會注意到。

+0

和tim Casterlijins,它工作。之後,我也不得不刪除getch()命令,而在上面的代碼中我沒有提到。多謝你們 – user133442

1

該API有兩個選項。播放同步或異步。

如果您玩同步,那麼您的線程將阻塞,直到聲音播放完畢。你可以把它放在一個循環中並隨意多次調用,但是當你播放聲音時你的線程會被阻塞。

如果你玩異步,那麼你的線程不會阻塞,但你沒有任何可靠的方法來控制重複次數。

我看到兩種解決方案:從原始創建一個新的聲音,添加正確的重複次數並播放一次,或創建後臺線程播放指定次數的聲音 - 在此背景下線程可以安全地使用上面描述的同步播放方法。