0

我有一个 ArrayList,其中包含许多声音文件作为元素。一个 foreach 循环迭代这个集合,并播放每个音符。

问题是当程序运行时,只播放最后一个音符,但在调试时,它会遍历所有元素并播放每个元素。

声音被表示为我的“MusicNote”类的一个对象。我无法理解问题是什么,因为在调试时,它工作得很好。

4

6 回答 6

3

根据http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspx player.Play()启动了一个新线程,这意味着它在播放文件完成之前很久就返回了......

改为使用player.PlaySync()- 在您的主线程中或(因为它是阻塞的)在单独的线程上。

备注:在调试多线程程序时,有时行为会有所不同——尤其是。当你通过...

于 2011-12-16T08:31:07.580 回答
2

我已经挖掘了一些旧代码,并像这样实现了它(在 WP7 中)

您可以尝试致电:

player.PlaySync();

问题是 SoundPlayer.Play() 是异步的,所以它不会阻止你的 foreach

于 2011-12-16T08:30:05.667 回答
1

似乎原因是因为在循环的每次迭代中,您都在设置文件之前它有机会播放。只有最后的迭代才有机会加载和播放。

如果您想同时播放剪辑,我认为您需要在每个线程播放剪辑的多个线程中执行此操作。

如果你想按顺序播放,我会考虑建立一个播放列表,然后加载它。

于 2011-12-16T08:29:54.053 回答
0

您需要初始化输出以防止开销跳过开始。我不确定如何通过外部游戏引擎环境来做到这一点。也许您可以添加一个假笔记以适应固定长度或错误长度的间隙。

我希望这有帮助!我知道这不是一个很好的答案,但你不能责怪一个人尝试正确;)

PS看看 jasons 的播放列表创意,很不错

于 2011-12-16T08:30:32.540 回答
0

有多少项目noteList?“调试时”是什么意思?“程序运行时”是什么意思?

此外,Play()是异步的,所以我猜所有的声音都是同时播放的,所以好像只播放了一个。你可以打电话PlaySync()代替。但是它会阻塞,因此您可能希望在单独的线程上执行此操作。

于 2011-12-16T08:30:56.070 回答
0

什么是笔记?你用什么玩的?它们是什么类型的文件?

很可能是您调用 play,它开始播放第一个音符,但它不阻塞转到下一个音符,第一个音符被取消,依此类推,直到最后一个音符被允许完成,因为什么都没有在它之后。在播放后等待,看看是否有问题,如果是,那么你需要找到一种方法来等待音符完成,然后再进行下一个。

于 2011-12-16T08:31:58.960 回答