【问题标题】:How to select "line in" audio input and set input "volume" level如何选择“线路输入”音频输入并设置输入“音量”级别
【发布时间】:2015-03-11 02:26:45
【问题描述】:

我真的很想看到一个独占模式音频应用程序的明确示例,该应用程序在一定的输入电平(音量)下从线路输入(不是麦克风)获取输入,并尽最大努力实现这一目标。 (首选 C++,但有总比没有好)

这听起来应该很简单,但找出其中的原因却非常困难。

例如,来自 Microsoft 的 Device Topologies 文档听起来好像您拥有简单的通用音频硬件(如在大多数台式 PC 上)并且只想设置音量、静音或选择频道,那么您不会需要担心设备拓扑,因为设备拓扑 API 适用于更复杂的设备。

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

此外,进一步阅读有关Endpoint Volume Controls 的信息表明,使用IAudioEndpointVolume 接口可以做到这一点,但Win 7.1 SDK 中的音频示例没有提供IAudioEndpointVolume 与输入设备的示例。关于各个IAudioEndpointVolume 函数的文档表明支持输入和输出(“进入或离开音频端点设备的音频流”),但这些函数似乎都不支持多路复用,并且再次表明线路输入和麦克风信号的混合。

【问题讨论】:

    标签: windows audio


    【解决方案1】:

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

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

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

    但是,出于神秘的原因,在某些硬件(至少是我的)上,IMMDeviceEnumerator 实例不会将线路输入枚举为音频端点,除非有东西物理地插入线路输入插孔......而无论插入或未插入麦克风,都会找到麦克风输入。这突显了 Windows 音频的复杂性和令人困惑的性质,并导致questions like this

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2011-03-13
      • 2017-05-25
      • 1970-01-01
      • 2017-03-05
      • 2023-02-24
      相关资源
      最近更新 更多