Naudio:如何在不停止所有其他声音的情况下正确删除AsioOut播放的几首声音中的一首?

时间:2018-03-27 10:18:06

标签: naudio asio

我正在使用AsioOut,因为需要尽可能减少延迟。由于我一次只能运行1个AsioOut,因此我使用MixingWaveProvider32同时播放多个声音。我遇到的问题是我不知道如何在不暂停所有其他声音的情况下正确删除1个声音。

我可以轻松地将IWaveProvider(我的情况下为AudioFileReader)添加到MixingWaveProvider32,只需将其添加为输入流即可,但如果我尝试以同样的方式将其删除音频开始出现故障(我认为它循环了最后一个可用的缓冲区)。我可以通过在交换声音之前停止AsioOut来防止这种情况,但这会带来两个问题:

  1. 所有其他声音也会停止
  2. 如果我试图移除的声音已经完成,那么我会在AsioOut.Stop()上进行软锁定(该方法永远不会完成)。
  3. 如何在不遇到这些问题的情况下正确删除1个声音?

2 个答案:

答案 0 :(得分:0)

我怀疑这是MixingWaveProvider32中的一个错误,因为WaveBufferArray.Clear的组合可能无法清除足够的缓冲区,导致您描述的故障声音。

我建议您尝试使用MixingSampleProvider,这是MixingWaveProvider32

的继承者

答案 1 :(得分:0)

我自己找到了一个解决方案:将所有声音通过WaveChannel32运行,然后将其放入MixingWaveProvider32我可以随时添加和删除声音,而无需停止AsioOut任何音频故障。