如何选择" line in"音频输入和设置输入"音量"水平

时间:2015-03-11 02:26:46

标签: windows audio

我真的很想看到一个独占模式音频应用程序的明确示例,该应用程序在某个输入级别(音量)从线路输入(非麦克风)输入,并且实现此目的的绝对最小值。 (C ++首选,但任何东西都比没有好)

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

例如,来自Microsoft的Device Topologies文档听起来就像是你有简单的常见音频硬件(比如在大多数台式机上)并且你只想设置音量,静音或选择频道,然后你赢了不需要担心设备拓扑,因为Device Topologies API适用于更复杂的设备。

那将是非常棒的,但它没有说出如何,并提出其他问题:是否有一个常见的桌面PC音频标准似乎总是提供扬声器输出,线路输入和麦克风?由于这样的标准,线路输入和麦克风是否总是混合或多路复用?此Device Topologies文档中的图表表示多路复用;我有旧的mixerXXX()代码我试图升级,表示混合。

此外,有关Endpoint Volume Controls的进一步阅读表明,使用IAudioEndpointVolume界面可能是可行的,但Win 7.1 SDK中的音频示例未提供带有输入设备的IAudioEndpointVolume示例。单个IAudioEndpointVolume函数的文档表明支持输入和输出(“进入或离开音频端点设备的音频流”),但这些功能似乎都不支持多路复用,并再次表明线路输入和麦克风的混合信号。

1 个答案:

答案 0 :(得分:0)

与旧的waveXXX()mixerXXX() API相比,旧的{1}}和CaptureSharedEventDriven API复杂,令人困惑,有时甚至在事情发生变化时甚至无法工作,新的Core Audio API(通常称为WASAPI) )仍然是复杂和令人困惑的,但旨在预测一个变化和网络化的世界。所以在这个层面上它取得了重大进展。但是那里仍然有一个多元化的音频世界,为所有人创造所有例子是不切实际的。

如果你想要一个最小的例子,首先下载Windows SDK,看看音频样本(可能是CaptureSharedTimerDrivenIAudioClient::Initialize())并开始删除一些无关紧要的事情。你的背景。重构遗留物将是一个很好的练习,以确保你了解正在发生的事情,以及你有什么选择。例如,如果您确实需要独占捕获(是吗?),则需要相应地更改EndpointVolume参数。

要设置输入音量级别,请查看IAudioEndpointVolume示例。您将发现此提及的其他示例从选择端点设备开始。之后,激活IMMDeviceEnumerator界面,并使用它设置所需的卷,以便代码易于识别并复制到您的重构示例。

但是,出于神秘的原因,在某些硬件上(至少我的),{{1}}实例不会将输入列为音频端点,除非有物理插入线路输入插孔的东西。然而,无论插入或不插入麦克风输入,都会找到麦克风输入。这强调了Windows音频的复杂性和混乱性,并导致了questions like this