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