1

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

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

谢谢,艾伦

4

1 回答 1

0

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

于 2015-01-20T23:47:13.553 回答