2011-07-20 47 views
2

我正在实现一个程序,用于从输入设备读取音频流并使用NAudio将其发送到输出设备。为此,我使用WaveIn及其DataAvailable事件从输入流中获取数据。要写数据,我即将使用WaveOut,这也意味着我需要使用一些IWaveProvider的实现。使用队列来实现我的需求似乎非常简单。除了一件事情:当队列为空并调用方法时会发生什么?在文档中我没有发现任何关于此的信息。选项我想我有:NAudio音频中继器

  1. 该方法应该阻塞,直到有些数据可用。
  2. 该方法立即返回0,表示当前没有数据可用。
  3. 用零填充缓冲区。

我想使用选项1或2,但后来我发现BufferedWaveProvider(和WaveInProvider,使用BufferedWaveProvider内部),其使用选项3.从这一点,我推断选项3是优选的一个。

问题是,我推断是否正确,应该使用选项3?如果我使用选项1或2会发生什么?这甚至会工作吗?

回答

3

当声卡需要更多数据播放时,会调用Read方法。阻塞通常不是一个好的选择,因为您可能位于驱动程序内部的线程上(如带有函数回调函数的ASIO或WaveOut),或者您可能位于GUI线程上(与带有Windows消息回调函数的WaveOut一样)。

从Read方法返回0表示“这是音频数据的结尾”,因此返回0会导致播放停止。

因此,选项三是不阻止您不应阻止的线程并允许播放继续的最佳选择。

如果您的Read方法的使用者是例如WaveFileWriter,则选项1会没事,(选项2可能取决于您如何确定何时停止写入WAV文件)。

+0

感谢您的信息。 – svick