确定声音在C#播放完毕的时间

时间:2009-01-07 23:01:10

标签: c# .net audio

情况如下:
用户看起来很高兴。

  • 播放提示音,因为他查找的项目有通知
  • 用户关闭通知 - 应用程序继续检索信息
  • 向用户发送'ding'告诉他们信息已完成检索
  • 应用程序开始向TextToSpeech发送某些属性
  • 应用程序遇到第二个通知,内部通知数据并发送另一个警报(texttospeech暂停,然后在警报完成后恢复)
  • 文字转语音结束,播放另一个'ding',让用户知道已经读完了所有内容

我们目前使用队列以有序的方式处理声音,以防止声音重叠。我们目前只在调用SoundAdded事件时从队列中播放声音。这是我们在向队列添加声音时引发的自定义事件。目前,每次调用该事件只会播放一个声音。我们遇到了这样的问题:在播放某些声音之后,它们将“锁定”队列,防止进一步的声音被处理。我们通过始终“解锁”队列来解决这个问题,即使声音没有播放也是如此。但是,这仍然让我们遇到队列备份声音的问题。

我能想到解决此问题的唯一方法是添加一个循环,以便在仍有声音等待播放时继续尝试播放声音。目前,主要的线程是处理声音,我可能需要将声音处理移动到一个单独的线程,但我不确定处理声音的最佳方法是什么。

所以...我的问题......是否有一个好的声音库,我们可以使用它包括一个声音结束的事件。或者......创造这样的东西最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

我不知道是否已经有一个.NET库可以让你这样做,但我认为你可以很容易地从Windows API P / Invoke PlaySound并用它来播放你的声音。只要您没有指定SND_ASYNC标志,它就应该阻止,直到声音完成播放,此时您可以播放下一个声音。正如您所提到的,您肯定希望在不同的主题中执行此操作。

答案 1 :(得分:2)

扩展Jon的答案:在.NET 2.0及更高版本中,您可以将My.Computer.Audio.PlayAudioPlayMode.WaitToComplete选项一起使用。

编辑:要在C#上下文中使用此功能,请参阅Microsoft的How to: Use the My Namespace (C# Programming Guide)

答案 2 :(得分:0)

如果您同步播放声音(在您管理的新主题上),您将知道它们何时完成。

但你似乎有两个问题;一个是知道声音何时结束,另一个是队列建立。如果您有可以自定义的声音,如果您的用户选择非常长的录音(例如10秒+)作为声音,您的应用将如何受到影响?

我建议您采用与在处理过程中在UI上显示文件名相同的方法。也就是说,您显示最新的文件名,而不是每一个文件名(否则文件名队列会增长,而您的UI会滞后)。如果可以的话,您应该在事件发生时播放声音(允许重叠声音),或者如果声音不是队列中最新的声音,您应该放弃(不播放)声音。