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

时间:2010-12-06 01:37:24

标签: 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的错误吗?

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

1 个答案:

答案 0 :(得分:0)

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

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