2016-06-08 69 views
1

我用Win Forms Application在C#中製作了一種俄羅斯方塊遊戲。 我希望程序能夠在遊戲過程中循環播放一個.wav文件,而另一個短的.wav文件只是偶爾與「主」聲音平行。在WindowForms應用程序中播放兩個(或更多).wav聲音

SoundPlayer sp; 
SoundPlayer sp2; 

然後在FormLoad事件:

我在開始時宣佈

private void Form1_Load(object sender, EventArgs e) 
{ 
    ... 
    sp2 = new SoundPlayer(".../tetris.wav"); 
    sp2.PlayLooping(); 
    ... 
} 

然後儘可能塊的行消失,我想火炸彈聲:

sp = new SoundPlayer(".../bomb.wav"); 
sp.Play(); 

問題是:當第二個聲音被觸發時,第一個(主)聲音停止。我認爲這是一個線程問題,但我不知道如何解決這個問題。

謝謝菲利普

+0

您可以使用[async/await](http://www.dotnetperls。com/async)或更舊的替代方法是[backgroundworker](http://www.dotnetperls.com/backgroundworker)。 – Arman

+0

@ user3283415我的答案是否解決了您的問題? –

+1

[同時播放2個聲音]可能的重複(http://stackoverflow.com/questions/4740262/playing-2-sounds-together-at-same-time) – DonBoitnott

回答

0

不,這不是一個線程問題! SoundPlayer同時只支持一種音頻播放。

如果需要多的聲音,那麼你必須使用以下技術之一:

WPF/MediaPlayer的= System.Windows.Media.MediaPlayer();打開,然後播放

的DirectX/DirectSound的

XNA/SoundEffect中

0

我一直在掙扎了同樣的問題.....

簡短的回答是你不能。系統將只允許一個通道進入任何給定過程中的聲音界面。因此,當你開始一個新的聲音時,前一個結束。

有大量使用Direct-X或Media-Player的解決方法。但是,我發現這兩種解決方案都不是簡單或強大的,因爲您依賴於用戶機器來安裝正確的東西。

但是,我發現了一個快速簡單的解決方案。

我在應用程序中添加了一個特殊的「鉤子」,這樣當我用合適的命令行參數運行它時,它所做的就是同步播放特定的聲音並退出。然後,我使用過程對象以適當的參數啓動應用程序的另一個實例..並且嘿presto ..多個聲音。

如果您的應用程序被配置爲自動成爲單個實例,則需要禁用該代碼並將其替換爲少量代碼以檢測另一個實例並退出。

另一種替代方法是在您的應用程序包中添加一個簡單的聲音部分。

我知道它聽起來不太「純」,但實際上,你真正想要用你的代碼做的是開始一個臨時的後臺進程來播放聲音。如果這個過程是一個Windows本地函數或你自己創建的,那並不重要。

相關問題