如何 select "line in" 音频输入和设置输入 "volume" 电平

How to select "line in" audio input and set input "volume" level

我真的很想看到一个独占模式音频应用程序的明确示例,它在特定输入级别(音量)从线路输入(而不是麦克风)获取输入,并以绝对最小值实现这一点. (首选 C++,但有总比没有好)

这听起来应该很简单,但要找出其中的难点却令人沮丧。

例如,Microsoft 的 Device Topologies 文档使它听起来像是您拥有简单的通用音频硬件(就像在大多数台式电脑上一样)并且您只想设置音量、静音或 select 频道,那么您就无需担心设备拓扑,因为设备拓扑 API 适用于更复杂的设备。

那太棒了,但它没有说明如何做,而是提出了其他问题:对于似乎总是提供扬声器输出、线路输入和麦克风输入的普通台式 PC 音频是否有标准?由于这样的标准,线路输入和麦克风是否总是混合或多路复用?此 Device Topologies 文档中的图表表示多路复用;我有旧的 mixerXXX() 代码,我正在尝试升级,该代码指示混合。

此外,关于 Endpoint Volume Controls 的进一步阅读表明使用 IAudioEndpointVolume 界面可能是可行的,但 Win 7.1 SDK 中的音频示例没有给出 IAudioEndpointVolume 的示例输入设备。有关个别 IAudioEndpointVolume 函数的文档表明支持输入和输出 ("audio stream that enters or leaves the audio endpoint device"),但这些函数中的 none 似乎支持多路复用,并再次表明线路输入和麦克风信号的混合。

与旧的 waveXXX()mixerXXX() API 相比,它们复杂、令人困惑,有时甚至在事情发生变化时甚至无法工作,新的 Core Audio API(通常简称为 WASAPI ) 仍然复杂和令人困惑,但旨在预测一个不断变化的网络世界。因此,在这个层面上,这是重大进步。但是仍然有一个巨大的多样化音频世界,为所有人创建所有示例是不切实际的。

如果您想要一个最小的示例,请先下载 Windows SDK,查看音频样本(可能是 CaptureSharedEventDrivenCaptureSharedTimerDriven)并开始删除一些在您的上下文中无关紧要的事情。重构剩下的部分将是一个很好的练习,以确保您了解正在发生的事情以及您有哪些选择。例如,如果您确实需要独占捕获(是吗?),则需要相应地更改 IAudioClient::Initialize() 参数。

要设置输入音量级别,请查看 EndpointVolume 示例。您会发现这个示例和提到的其他示例都是从选择端点设备开始的。之后,您激活 IAudioEndpointVolume 界面,并使用它设置所需的音量,这样代码将很容易识别并复制到您的重构示例中。

然而,出于神秘的原因,在某些硬件(至少是我的)上,线路输入不会被 IMMDeviceEnumerator 实例枚举为音频端点,除非有东西物理插入线路输入插孔... 而无论插入或未插入什么,都会找到麦克风输入。这强调了 Windows 音频的复杂性和混淆性,并导致 .