我正在实现一个程序,该程序从输入设备读取音频流,并使用NAudio将其发送到输出设备。为此,我使用WaveIn
及其DataAvailable
事件从输入流中获取数据。要编写数据,我即将使用WaveOut
,这也意味着我需要使用IWaveProvider
的一些实现。使用队列实现对我的需求似乎非常简单。除了一件事:当队列为空并且调用Read()
方法时会发生什么?我在文档中没有找到任何相关内容。选项我认为我有:
我在考虑使用选项1或2,但之后我发现使用选项3的BufferedWaveProvider
(和WaveInProvider
,内部使用BufferedWaveProvider
)。从那时我推断出选项3是首选。
问题是,我是否推断该权利,我应该使用选项3吗?如果我使用选项1或2会发生什么?这甚至会起作用吗?
答案 0 :(得分:3)
当声卡需要更多数据播放时,将调用Read方法。阻塞通常不是一个好的选择,因为你可能在驱动程序本身的一个线程上(如ASIO或带有函数回调的WaveOut),或者你可能在GUI线程上(与使用带有Windows消息回调的WaveOut一样)。
从Read方法返回0表示“这是音频数据的结尾”,因此返回0将导致播放停止。
因此,选项三是不阻止您不应阻止的线程并允许继续播放的最佳选择。
如果您的Read方法的使用者是例如WaveFileWriter,则选项1可以正常,(选项2可能取决于您何时停止写入WAV文件)。