WaveBadFormat 调用 .Init() 非默认音频设备 Naudio 时

Posted

技术标签:

【中文标题】WaveBadFormat 调用 .Init() 非默认音频设备 Naudio 时【英文标题】:WaveBadFormat when calling .Init() non-default audio device Naudio 【发布时间】:2017-03-14 23:57:52 【问题描述】:

每当我尝试在未使用默认音频设备的 waveOut 上调用 .init() 时,我都会收到 WaveBadFormat 异常。如果我更改默认设备,我可以在没有戏剧的情况下打开 waveout。每种情况下的波形提供者都是使用 ieee 44.1k 2 通道波形格式的同一个混音器。

以下代码在应用程序启动时被调用。

MixingWaveProvider32 mixer = new MixingWaveProvider32();
WaveOut wavOut = new WaveOut();
wavOut.DesiredLatency=100;
wavOut.Init(mixer);

但如果用户选择不同的播放设备,则调用以下代码

wavOut.Stop();
wavOut.Dispose();
wavOut = new WaveOut();
wavOut.DeviceNumber = ((WaveCapabilities)comboBox2.SelectedItem).Index;
wavOut.Init(mixer);

并且 wavOut.Init(mixer) 会抛出错误的格式异常。

检查设备的非公开成员,他们的supportedWaveFormats 似乎没有任何区别,但我也不相信任何SupportedWaveFormat 可枚举选项与MixingWaveProvider32 使用的32 位ieee 波形格式匹配。

如果有人对为什么这对于默认设备(无论它可能是什么)不是问题但对于其他 waveOut 设备选项有任何想法,我将非常感激!

【问题讨论】:

【参考方案1】:

是的,有时WaveOut 设备驱动程序只接受某些格式。 NAudio 确实包含像 WaveFloatTo16Provider 这样的辅助类,您可以在您的情况下使用它来包装 MixingWaveProvider32,然后再将其传递给 WaveOut.Init 方法

【讨论】:

以上是关于WaveBadFormat 调用 .Init() 非默认音频设备 Naudio 时的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 在创建实例时不调用实例方法 __init__() 而是调用类提供的 __init__() ?

iOS:UIView子类init会调用[super init]然后调用超类中的方法,为啥会调用[subclass initWithFrame:xx]?

__init__() 应该调用父类的 __init__() 吗?

iOS既没有调用init也没有调用initWithCoder [关闭]

如何在uboot中找到由lowlevel_init()调用的s_init()的实现

C中的init()函数调用