我有一个 ArrayList,其中包含许多声音文件作为元素。一个 foreach 循环迭代这个集合,并播放每个音符。
问题是当程序运行时,只播放最后一个音符,但在调试时,它会遍历所有元素并播放每个元素。
声音被表示为我的“MusicNote”类的一个对象。我无法理解问题是什么,因为在调试时,它工作得很好。
我有一个 ArrayList,其中包含许多声音文件作为元素。一个 foreach 循环迭代这个集合,并播放每个音符。
问题是当程序运行时,只播放最后一个音符,但在调试时,它会遍历所有元素并播放每个元素。
声音被表示为我的“MusicNote”类的一个对象。我无法理解问题是什么,因为在调试时,它工作得很好。
根据http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspx player.Play()
启动了一个新线程,这意味着它在播放文件完成之前很久就返回了......
改为使用player.PlaySync()
- 在您的主线程中或(因为它是阻塞的)在单独的线程上。
备注:在调试多线程程序时,有时行为会有所不同——尤其是。当你通过...
我已经挖掘了一些旧代码,并像这样实现了它(在 WP7 中)
您可以尝试致电:
player.PlaySync();
问题是 SoundPlayer.Play() 是异步的,所以它不会阻止你的 foreach
似乎原因是因为在循环的每次迭代中,您都在设置文件之前它有机会播放。只有最后的迭代才有机会加载和播放。
如果您想同时播放剪辑,我认为您需要在每个线程播放剪辑的多个线程中执行此操作。
如果你想按顺序播放,我会考虑建立一个播放列表,然后加载它。
您需要初始化输出以防止开销跳过开始。我不确定如何通过外部游戏引擎环境来做到这一点。也许您可以添加一个假笔记以适应固定长度或错误长度的间隙。
我希望这有帮助!我知道这不是一个很好的答案,但你不能责怪一个人尝试正确;)
PS看看 jasons 的播放列表创意,很不错
有多少项目noteList
?“调试时”是什么意思?“程序运行时”是什么意思?
此外,Play()
是异步的,所以我猜所有的声音都是同时播放的,所以好像只播放了一个。你可以打电话PlaySync()
代替。但是它会阻塞,因此您可能希望在单独的线程上执行此操作。
什么是笔记?你用什么玩的?它们是什么类型的文件?
很可能是您调用 play,它开始播放第一个音符,但它不阻塞转到下一个音符,第一个音符被取消,依此类推,直到最后一个音符被允许完成,因为什么都没有在它之后。在播放后等待,看看是否有问题,如果是,那么你需要找到一种方法来等待音符完成,然后再进行下一个。