带有NAudio的音频中继器

时间:2011-07-20 10:29:46

标签: audio audio-streaming naudio

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

  1. 该方法应该阻止,直到某些数据可用。
  2. 该方法立即返回0,表示当前没有数据可用。
  3. 用零填充缓冲区。
  4. 我在考虑使用选项1或2,但之后我发现使用选项3的BufferedWaveProvider(和WaveInProvider,内部使用BufferedWaveProvider)。从那时我推断出选项3是首选。

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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