【问题标题】:Windows Audio Driver vs. WASAPIWindows 音频驱动程序与 WASAPI
【发布时间】:2021-02-27 14:27:42
【问题描述】:

我现在正在阅读有关驱动程序和核心音频 api 的微软文档。目前,我仍然很困惑要通过哪种方式来实现我所需要的。 我有一个独立的音频应用程序,使用 C++ 框架 JUCE 进行编码。而且我需要构建一个 Windows 解决方案,该解决方案将捕获将发送到音频端点设备的音频流,以将其用作我的音频应用程序的输入。

  • 此流必须具有未更改的音量:始终为 1.0(无论硬件音量是否已更改或静音)。
  • 我必须能够在不同的端点设备之间进行选择,例如,如果我有一个插入的外部声卡,我的音频应用程序应该能够拦截和复制流向该外部声卡的流,或者执行流向内置扬声器的流也是如此。
  • 这个想法是在输出流被硬件卷修改修改之前捕获它们,并将它们的副本路由到我的应用程序而不更改输出路由和行为。

Microsoft 文档非常齐全,但即使 WASAPI 提供了许多从音频端点设备捕获和流式传输的方法,我也不确定是否有可能获得未更改的音量,因为它总是会捕获确切的内容从扬声器中出来。 这就是为什么我不知道是否可以直接在我的音频应用程序中实现一个功能,该功能将使用 WASAPI 获得我想要的流,或者我是否必须编写一个适当的音频驱动程序来复制我想要的流应用程序能够使用这些流。

我参考的文档: Audio Drivers design guide Core Audio APIs / WASAPI

感谢您的帮助,

最好的,

马克西姆

【问题讨论】:

    标签: c++ windows audio driver wasapi


    【解决方案1】:

    有时音量控制是用软件实现的,有时它是用硬件实现的。您可以致电IAudioEndpointVolume::QueryHardwareSupport,查看您正在使用的音频端点的音量控制是在硬件还是软件中实现的。

    有时音频环回是用软件实现的,有时它是用硬件实现的。没有 API 可以判断是哪一个。

    如果音频环回是用软件实现的,而音量控制是用硬件实现的,那么你会得到你想要的数据。

    如果音频环回是用硬件实现的,或者音量控制是用软件实现的,那么你返回的音频数据已经应用了音量调节。

    您的应用程序如何处理它接收到的音频数据?音频环回数据的主要用例是回声消除,您通常希望在其中应用音量。

    【讨论】:

    • 感谢您的回答!音频数据用于显示声音指标,如分贝、频率分析仪和其他东西,如 LUFS 计算。这就是为什么我需要音量“不变”。我明白你的意思,在某些情况下它会按我需要的方式工作,而在另一些情况下则不然。使用 WASAPI 时,实现体积补偿是唯一的解决方案吗?
    • 您可以使用IAudioMeterInformation API 获取从计算机发出的声音的分贝数,但是没有一个好的方法可以对被静音的音频进行频率分析。您可以open a feature request in Feedback Hub 为您的应用创建这种方式。
    猜你喜欢
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2012-01-02
    • 2013-08-28
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多