c++ - 为什么我不能使用 IAudioEndpointVolume::SetMasterVolumeLevelScalar 为 USB/Firewire 音频接口(interface)设置主音量

标签 c++ windows audio audacity wasapi

我正在尝试修复围绕 portmixer 的 Audacity 错误。输出/输入级别可以使用 mac 版本的 portmixer 设置,但在 Windows 中并不总是如此。我正在调试 portmixer 的窗口代码,试图让它在那里工作。

使用 IAudioEndpointVolume::SetMasterVolumeLevelScalar 设置主音量对于板载声音效果很好,但是使用专业的外部 USB 或火线接口(interface),如 RME Fireface 400,输出音量不会改变,尽管它反射(reflect)在 Window 的声音控制面板中对于那个设备,也在系统混音器中。

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

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

许多设备上的输入和输出都存在这种行为。

这可能是 Windows 的错误吗?

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

最佳答案

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

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

关于c++ - 为什么我不能使用 IAudioEndpointVolume::SetMasterVolumeLevelScalar 为 USB/Firewire 音频接口(interface)设置主音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4362526/

相关文章:

c++ - 这种在 DLL 中初始化数组的设计有什么问题吗?

c++ - std::string 和 stdarg.h

c# - 当其他控件获得焦点时隐藏表单

windows - 如何使用 Powershell wget 输出完整的网页特定内容?

ubuntu - 安装CUDA 8.0后在Ubuntu 17.04中没有声音

C++,mpi : easiest way to create random data

c++ - 我们如何在常量成员函数中调用 "delete this; "?

c++ - 如何同步 2 个或更多监视文件夹

audio - 适用于Windows平台的最佳技术?

Android - 当设备插入音频插孔时播放声音