为什么我无法使用IAudioEndpointVolume :: SetMasterVolumeLevelScalar为USB/Firewire音频接口设置主音量

Mic*_*nen 6 c++ windows audio audacity wasapi

我正在尝试修复一个围绕portmixer的Audacity错误.输出/输入级别可以使用mac版本的portmixer进行设置,但不能始终在Windows中进行设置.我正在调试portmixer的窗口代码,试图让它在那里工作.

使用IAudioEndpointVolume :: SetMasterVolumeLevelScalar设置主音量适用于板载声音,但使用专业外部USB或火线接口(如RME Fireface 400),输出音量不会改变,尽管它反映在该设备的Window声音控制面板中,还有系统调音台.

此外,在我们的程序之外,更改系统混音器的主滑块(在任务栏中)没有任何效果 - 声卡输出相同(完整)级别,而不管系统所处的级别如何.更改输出级别的唯一方法是使用硬件开发人员为卡提供的自定义应用程序.

IAudioEndpointVolume :: QueryHardwareSupport函数返回ENDPOINT_HARDWARE_SUPPORT_VOLUME,因此它应该能够执行此操作.

许多设备上的输入和输出都存在此行为.

这可能是Window的错误吗?

可以通过模拟(缩放)输出来解决这个问题,但这不是首选,因为它在功能上并不相同 - 更好的是让音频接口进行缩放(特别是如果它涉及前置放大器的输入).

sti*_*ijn 0

你所说的卡——比如RME——根本不支持通过软件设置主控或任何其他级别,并且你对此无能为力。这不是 Windows 错误。有人可能会说,返回 ENDPOINT_HARDWARE_SUPPORT_VOLUME 是一个错误,但这可能源于驱动程序级别,而不是 Windows 本身。

到目前为止,我发现的唯一解决方案是将调试器(或添加 dll 挂钩)连接到供应商提供的软件,并在设置供应商中的音量时查看DeviceIOControl它所做的调用(这些是用于与硬件通信的调用)软件。对每张卡做到这一点相当困难,但对几张专业卡来说可能值得这样做。特别是对于 Audacity,对于开源音频软件来说,它实际上并没有那么糟糕,所以我可以想象如果可以通过它来设置卡上的音量,有些人会非常高兴。(当时我们专门使用 RME Multiface,我花了相当多的时间来弄清楚 DeviceIOControl 调用,但最终这绝对是值得的,因为我可以为矩阵中的任何点设置以 dB 为单位的音量)