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