NAudio:重用现有的AsioOut实例来播放文件队列是否安全?

时间:2015-01-20 03:36:54

标签: c# naudio asio

在查看NAudio AsioOut类时,似乎很明显,每次通过输出播放新文件时,实例都会被销毁并重新创建。如果实例已具有源流,则Init方法专门抛出InvalidOperationException。通常,在正常情况下配置和重新创建Asio输出不是问题,但是,在一种情况下我想避免这样做,因为我将输出发送到设置为Asio驱动程序的卷积器。每次初始化驱动程序时,都必须重新加载大型卷积滤波器,因此在播放无间隙音轨时,延迟很烦人。

为了避免延迟,我有一个想法是不存在AsioOut实例(如果它已经存在),并且队列中下一个文件的位深度和采样率与最后一个文件相同。问题是我必须在AsioOut类上调用Init来传递下一个要播放的文件,这将抛出上述异常。如果确保文件之间的位深度,采样率和输出通道数没有变化,更改Init方法以避免抛出异常是否安全?

谢谢, 艾伦

1 个答案:

答案 0 :(得分:0)

我正在回答我自己的问题。如果使用MixingSampleProvider并将ReadFully属性设置为true,则可以继续添加AudioFileReaders而无需重新初始化AsioOut实例,只要这些文件具有相同的采样率和位深度即可。 Mark Heath撰写了一篇博文,其中讨论了一个名为AutoDisposeFileReader的辅助类,它在这里非常有用。