如何select“line in”audioinput并设置input“音量”级别

我真的很想看到一个独占模式的audio应用程序的一个明确的例子,它从input线(而不是麦克风)的input在一定的input电平(音量),并做到这一点绝对最低限度。 (C ++首选,但任何事情都比没有好)

这听起来应该很简单,但是要弄清楚如何一直非常困难。

例如,微软的设备拓扑结构文档使得听起来就好像你拥有简单的通用audio硬件(就像大多数桌面电脑一样),而你只想设置音量,静音或者select频道,那么你就不用担心设备拓扑,因为设备拓扑API用于更复杂的设备。

那太棒了,但是它并没有提到如何提出其他问题:有没有标准的普通台式电脑audio,似乎总是提供扬声器,线路和麦克风? 由于这样的标准,线路input和麦克风总是混合还是复用? 此设备拓扑文档中的图表示复用; 我有旧的mixerXXX()代码我试图升级,表明混合。

此外,有关端点音量控制的进一步阅读表明,这可能是使用IAudioEndpointVolume接口可以实现的,但Win 7.1 SDK中的audio示例没有提供具有input设备的IAudioEndpointVolume示例。 有关各个IAudioEndpointVolumefunction的文档说明支持input和输出(“进入或离开audio端点设备的audiostream”),但这些function似乎都不支持多路复用,并且再次指示线路input和话筒信号的混合。

与旧的waveXXX()mixerXXX() API相比,这些API复杂,混乱,有时甚至在事情发生变化时甚至无法工作,新的Core Audio API(通常称为WASAPI)仍然复杂且令人困惑,预测一个变化和网络化的世界。 所以在这个层面上,这是重大的进步。 但是在这个世界上仍然存在着一个巨大的多样化的音频世界,为所有人创造所有的例子是不切实际的。

如果您想要一个最简单的例子,请先下载Windows SDK,查看音频示例(可能是CaptureSharedEventDrivenCaptureSharedTimerDriven ),然后开始删除一些在您的上下文中无关紧要的内容。 重构仍然是一个很好的练习,以确保你了解正在发生什么,以及你有什么选择。 例如,如果你真的需要独占捕获(你呢?),你将需要相应地改变IAudioClient::Initialize()参数。

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

但是,出于神秘的原因,在某些硬件(至少我的)线路输入将不被IMMDeviceEnumerator实例列为音频端点,除非有物理插入线路输入插孔…而麦克风输入将发现不管是什么或不插入它。 这强调了Windows音频的复杂性和混乱性,并导致了这样的问题 。