2011-12-16 70 views
0

我有一個ArrayList,其中包含許多聲音文件作爲元素。一個foreach循環迭代這個集合,並播放每個音符。如何播放存儲在ArrayList中的所有音樂文件

問題是,當程序運行時,只有最後一個音符播放,但是在調試時,它會遍歷所有元素並且每個元素都被播放。

聲音被表示爲我的'MusicNote'類的對象。我無法理解問題是什麼,因爲在調試時,它完美地工作。

回答

3

根據http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspxplayer.Play()啓動一個新的線程,這意味着它返回播放完畢文件前長...

使用player.PlaySync()代替 - 無論是在你的主線程或(因爲它阻止)在一個單獨的線。

備註:在調試多線程程序時,有時表現方式會有所不同 - 特別是,當你通過...

+0

謝謝,這是問題! – 2011-12-16 08:36:50

1

它似乎是因爲在循環的每次迭代中,您在設置文件之前有機會玩遊戲。只有最後一次迭代纔有機會加載和播放。

如果你想同時播放剪輯,我想你需要在多個線程中執行此操作,其中每個線程播放剪輯。

如果你想連續播放它,我會考慮建立一個播放列表,然後加載它。

2

我已經通過了一些舊代碼挖,我已經實現了它像這樣(在WP7)

你可以嘗試致電:

player.PlaySync(); 

的問題是,SoundPlayer.Play()是異步,所以它不會阻止您的foreach

+0

謝謝,這是問題! – 2011-12-16 08:37:07

0

您需要初始化輸出以防止跳過開始的開銷。我不確定如何在外部遊戲引擎環境下做到這一點。也許你可以添加一個假的筆記來適應固定長度或錯誤長度的差距。

我希望這有助於!我知道這不是一個很好的答案,但你不能責怪一個人嘗試正確的;)

P.S. 看看傑森的播放列表的想法,很不錯

0

noteList有多少項目? 「什麼時候調試」是什麼意思? 「當程序運行時」是什麼意思?

此外,Play()是異步的,所以我猜所有的聲音是同時播放的,所以似乎只有一個播放。您可以撥打PlaySync()。它會阻止,所以你可能想要在一個單獨的線程。

+0

謝謝,這是問題! – 2011-12-16 08:37:00

0

什麼是註釋?你在用什麼玩?他們是什麼類型的文件?

很可能是您打電話播放,它開始播放第一個音符,但它不會阻止轉到下一個音符,並且第一個音符被取消,等到最後一個音符被允許完成是因爲沒有任何事情發生之後在劇本結束後等待,看看是否有問題,如果是,那麼你需要找到一種方法來等待音符完成,然後再進入下一個。

相關問題