情况如下:
用户看起来很高兴。
我们目前使用队列以有序的方式处理声音,以防止声音重叠。我们目前只在调用SoundAdded事件时从队列中播放声音。这是我们在向队列添加声音时引发的自定义事件。目前,每次调用该事件只会播放一个声音。我们遇到了这样的问题:在播放某些声音之后,它们将“锁定”队列,防止进一步的声音被处理。我们通过始终“解锁”队列来解决这个问题,即使声音没有播放也是如此。但是,这仍然让我们遇到队列备份声音的问题。
我能想到解决此问题的唯一方法是添加一个循环,以便在仍有声音等待播放时继续尝试播放声音。目前,主要的线程是处理声音,我可能需要将声音处理移动到一个单独的线程,但我不确定处理声音的最佳方法是什么。
所以...我的问题......是否有一个好的声音库,我们可以使用它包括一个声音结束的事件。或者......创造这样的东西最好的方法是什么?
答案 0 :(得分:2)
我不知道是否已经有一个.NET库可以让你这样做,但我认为你可以很容易地从Windows API P / Invoke PlaySound并用它来播放你的声音。只要您没有指定SND_ASYNC标志,它就应该阻止,直到声音完成播放,此时您可以播放下一个声音。正如您所提到的,您肯定希望在不同的主题中执行此操作。
答案 1 :(得分:2)
扩展Jon的答案:在.NET 2.0及更高版本中,您可以将My.Computer.Audio.Play与AudioPlayMode.WaitToComplete选项一起使用。
编辑:要在C#上下文中使用此功能,请参阅Microsoft的How to: Use the My Namespace (C# Programming Guide)。
答案 2 :(得分:0)
如果您同步播放声音(在您管理的新主题上),您将知道它们何时完成。
但你似乎有两个问题;一个是知道声音何时结束,另一个是队列建立。如果您有可以自定义的声音,如果您的用户选择非常长的录音(例如10秒+)作为声音,您的应用将如何受到影响?
我建议您采用与在处理过程中在UI上显示文件名相同的方法。也就是说,您显示最新的文件名,而不是每一个文件名(否则文件名队列会增长,而您的UI会滞后)。如果可以的话,您应该在事件发生时播放声音(允许重叠声音),或者如果声音不是队列中最新的声音,您应该放弃(不播放)声音。