带NAudio的音频中继器

带NAudio的音频中继器,audio,audio-streaming,naudio,Audio,Audio Streaming,Naudio,我正在实现一个程序,从输入设备读取音频流,并使用NAudio将其发送到输出设备。为此,我使用WaveIn及其DataAvailable事件从输入流获取数据。要编写数据,我将使用WaveOut,这也意味着我需要使用IWaveProvider的一些实现。使用队列来实现我的需求似乎非常简单。除了一件事:当队列为空并且调用了Read()方法时会发生什么?我在文档中没有找到任何关于这方面的信息。我想我有以下几种选择: 该方法应该阻塞,直到有一些数据可用 该方法立即返回0,表示当前没有可用数据 用零填充缓冲

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

  • 该方法应该阻塞,直到有一些数据可用
  • 该方法立即返回0,表示当前没有可用数据
  • 用零填充缓冲区
  • 我曾考虑使用选项1或2,但后来我发现
    BufferedWaveProvider
    (和
    WaveInProvider
    ,它在内部使用
    BufferedWaveProvider
    )使用选项3。由此,我推断方案3是首选方案


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

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

    从Read方法返回0意味着“这是音频数据的结束”,因此返回0将导致播放停止

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

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