如何选择"line in"音频输入并设置输入"volume"电平



我真的很想看到一个专有模式音频应用程序的明确示例,该应用程序以一定的输入电平(音量)从线路输入(不是麦克风),并执行绝对最小值来实现这一点。(C++首选,但有总比没有好)

这听起来应该很简单,但找出方法却非常困难。

例如,Microsoft的设备拓扑文档听起来像是,如果你有简单的通用音频硬件(如在大多数台式电脑上),并且只想设置音量、静音或选择通道,则无需担心设备拓扑,因为设备拓扑 API 适用于更复杂的设备。

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

此外,进一步阅读有关终结点音量控件的信息表明,使用 IAudioEndpointVolume 接口可以做到这一点,但 Win 7.1 SDK 中的音频示例未提供输入设备IAudioEndpointVolume的示例。有关单个IAudioEndpointVolume函数的文档指示支持输入和输出("进入或离开音频终结点设备的音频流"),但这些函数似乎都不支持多路复用,并再次指示线路输入和麦克风信号的混合。

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

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

要设置输入音量级别,请查看EndpointVolume示例。您会发现,此示例和提到的其他示例从选择终结点设备开始。之后,激活IAudioEndpointVolume接口,并使用它来设置所需的音量,以便代码易于识别并复制到重构的示例中。

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

最新更新