我有一个ArrayList,其中包含许多声音文件作为元素。一个foreach循环迭代这个集合,并播放每个音符。如何播放存储在ArrayList中的所有音乐文件
问题是,当程序运行时,只有最后一个音符播放,但是在调试时,它会遍历所有元素并且每个元素都被播放。
声音被表示为我的'MusicNote'类的对象。我无法理解问题是什么,因为在调试时,它完美地工作。
我有一个ArrayList,其中包含许多声音文件作为元素。一个foreach循环迭代这个集合,并播放每个音符。如何播放存储在ArrayList中的所有音乐文件
问题是,当程序运行时,只有最后一个音符播放,但是在调试时,它会遍历所有元素并且每个元素都被播放。
声音被表示为我的'MusicNote'类的对象。我无法理解问题是什么,因为在调试时,它完美地工作。
根据http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspxplayer.Play()
启动一个新的线程,这意味着它返回播放完毕文件前长...
使用player.PlaySync()
代替 - 无论是在你的主线程或(因为它阻止)在一个单独的线。
备注:在调试多线程程序时,有时表现方式会有所不同 - 特别是,当你通过...
它似乎是因为在循环的每次迭代中,您在设置文件之前有机会玩游戏。只有最后一次迭代才有机会加载和播放。
如果你想同时播放剪辑,我想你需要在多个线程中执行此操作,其中每个线程播放剪辑。
如果你想连续播放它,我会考虑建立一个播放列表,然后加载它。
我已经通过了一些旧代码挖,我已经实现了它像这样(在WP7)
你可以尝试致电:
player.PlaySync();
的问题是,SoundPlayer.Play()是异步,所以它不会阻止您的foreach
谢谢,这是问题! – 2011-12-16 08:37:07
您需要初始化输出以防止跳过开始的开销。我不确定如何在外部游戏引擎环境下做到这一点。也许你可以添加一个假的笔记来适应固定长度或错误长度的差距。
我希望这有助于!我知道这不是一个很好的答案,但你不能责怪一个人尝试正确的;)
P.S. 看看杰森的播放列表的想法,很不错
noteList
有多少项目? “什么时候调试”是什么意思? “当程序运行时”是什么意思?
此外,Play()
是异步的,所以我猜所有的声音是同时播放的,所以似乎只有一个播放。您可以拨打PlaySync()
。它会阻止,所以你可能想要在一个单独的线程。
谢谢,这是问题! – 2011-12-16 08:37:00
什么是注释?你在用什么玩?他们是什么类型的文件?
很可能是您打电话播放,它开始播放第一个音符,但它不会阻止转到下一个音符,并且第一个音符被取消,等到最后一个音符被允许完成是因为没有任何事情发生之后在剧本结束后等待,看看是否有问题,如果是,那么你需要找到一种方法来等待音符完成,然后再进入下一个。
谢谢,这是问题! – 2011-12-16 08:36:50