Windows 如何选择";“中的行”;音频输入和设置输入“;卷;水平

Windows 如何选择";“中的行”;音频输入和设置输入“;卷;水平,windows,audio,Windows,Audio,我真的很想看到一个明确的独家模式音频应用程序的例子,它以一定的输入电平(音量)从线路输入(而不是麦克风)获取输入,并尽最大努力实现这一点。(C++优先,但有总比没有好) 这听起来应该很简单,但要弄清楚到底有多困难却令人沮丧 例如,Microsoft提供的文档使您的声音听起来像是,如果您有简单的通用音频硬件(如大多数桌面PC),并且您只想设置音量、静音或选择频道,那么您就不需要担心设备拓扑,因为设备拓扑API适用于更复杂的设备 这将是非常棒的,但它没有说明如何,并提出了其他问题:是否有一个通用的桌

我真的很想看到一个明确的独家模式音频应用程序的例子,它以一定的输入电平(音量)从线路输入(而不是麦克风)获取输入,并尽最大努力实现这一点。(C++优先,但有总比没有好)

这听起来应该很简单,但要弄清楚到底有多困难却令人沮丧

例如,Microsoft提供的文档使您的声音听起来像是,如果您有简单的通用音频硬件(如大多数桌面PC),并且您只想设置音量、静音或选择频道,那么您就不需要担心设备拓扑,因为设备拓扑API适用于更复杂的设备

这将是非常棒的,但它没有说明如何,并提出了其他问题:是否有一个通用的桌面PC音频标准,似乎总是提供扬声器输出、线路输入和麦克风输入?作为这样一个标准的结果,线路输入和麦克风是否总是混合或多路复用?本文件中的图表表示多路复用;我有一个旧的
mixerXXX()
代码,我正在尝试升级它,它指示混合


此外,进一步阅读关于的内容表明,使用
IAudioEndpointVolume
接口可以实现这一点,但Win 7.1 SDK中的音频示例没有给出带有输入设备的
IAudioEndpointVolume
示例。有关单个
IAudioEndpointVolume
功能的文档表明支持输入和输出(“进入或离开音频端点设备的音频流”),但这些功能似乎都不支持多路复用,并且再次表明了线路输入和麦克风信号的混合。

与旧的
waveXXX()不同
mixerXXX()
API是复杂的、令人困惑的,有时甚至在事情发生变化时都不起作用,新的核心音频API(通常称为WASAPI)仍然是复杂的、令人困惑的,但其设计是为了预测一个不断变化的网络世界。因此,在这一层面上,这是一个重大进展。但是仍然有一个巨大的多样化的音频世界,为所有人创建所有的示例是不切实际的

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

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

然而,出于神秘的原因,在某些硬件上(至少是我的硬件上),
IMMDeviceEnumerator
实例不会将line in枚举为音频端点,除非在jack的line in中实际插入了某些内容。。。然而,无论插入或未插入什么,都会找到麦克风输入。这突出了Windows音频的复杂性和混乱性,并导致了错误