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

Naudio: how to properly remove 1 out of several sounds played by an AsioOut without stopping all other sounds?

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

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

  1. 所有其他声音也会停止
  2. 如果我尝试删除的声音已经自行完成,那么我会在 AsioOut.Stop() 上进行软锁定(该方法永远不会完成)。

如何在不 运行解决这些问题的情况下正确删除 1 个声音?

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

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

的继承者

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