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 个问题:
- 所有其他声音也会停止
- 如果我尝试删除的声音已经自行完成,那么我会在
AsioOut.Stop()
上进行软锁定(该方法永远不会完成)。
如何在不 运行解决这些问题的情况下正确删除 1 个声音?
我怀疑这是 MixingWaveProvider32
中的错误,因为 WaveBuffer
和 Array.Clear
的组合可能无法清除足够的缓冲区,从而导致您描述的故障声音。
我建议您尝试使用 MixingSampleProvider
,它是 MixingWaveProvider32
的继承者
我自己找到了一个解决方案:通过 运行 所有声音在将它们放入 MixingWaveProvider32
之前通过 WaveChannel32
我可以随时添加和删除声音而无需停止 AsioOut
没有任何音频故障。
我正在使用 AsioOut
因为需要尽可能减少延迟。因为我一次只能 运行 1 个 AsioOut,所以我使用 MixingWaveProvider32
同时播放多个声音。我遇到的问题 运行 是我不知道如何在不暂停所有其他声音的情况下正确删除 1 个声音。
我可以轻松地将新的 IWaveProvider
(在我的例子中是 AudioFileReader
)添加到 MixingWaveProvider32
,只需将其添加为输入流即可,但是如果我尝试将其删除同样,音频开始出现故障(我认为它正在循环最后一个可用缓冲区)。我可以通过在交换声音之前停止 AsioOut
来防止这种情况,但这会带来 2 个问题:
- 所有其他声音也会停止
- 如果我尝试删除的声音已经自行完成,那么我会在
AsioOut.Stop()
上进行软锁定(该方法永远不会完成)。
如何在不 运行解决这些问题的情况下正确删除 1 个声音?
我怀疑这是 MixingWaveProvider32
中的错误,因为 WaveBuffer
和 Array.Clear
的组合可能无法清除足够的缓冲区,从而导致您描述的故障声音。
我建议您尝试使用 MixingSampleProvider
,它是 MixingWaveProvider32
我自己找到了一个解决方案:通过 运行 所有声音在将它们放入 MixingWaveProvider32
之前通过 WaveChannel32
我可以随时添加和删除声音而无需停止 AsioOut
没有任何音频故障。