【问题标题】:How to enumerate audio cards in win32?如何在win32中枚举声卡?
【发布时间】:2021-02-14 22:13:15
【问题描述】:

是否可以在 Win32 中获取声卡列表(不是端点)?

此信息在构建全双工音频流时非常有用,可确保输入和输出共享相同的硬件时钟。

到目前为止,我找到了PKEY_DeviceInterface_FriendlyName,它很接近,但在插入 2 个完全相同的声卡时可能无法使用。

我还找到了Enumerating audio adapters in WinAPI,虽然已接受答案中的 WMI 查询检索到我正在寻找的结果,但我认为没有简单的方法可以将这些结果与 WASAPI 端点设备 ID 相关联。

【问题讨论】:

  • PKEY_AudioEndpoint_GUID 可能会有所帮助,因为它将 WASAPI 端点 ID 映射到 DirectSound GUID,从而打开了更多功能来查询信息。 docs.microsoft.com/en-us/windows/win32/coreaudio/…
  • 这是否基本上让我从该 guid 创建 IDirectSound8,然后查询 DSCAPS/DSCCAPS (docs.microsoft.com/en-us/previous-versions/windows/desktop/…)?我在 DirectSound 中没有看到比 WASAPI 提供的更多信息,我是否遗漏了什么?
  • DSCAPS 看起来比您从 IMMDevice 获得的信息要多得多,但我仍然没有看到任何可以直接或直接或通过推理。只是想我会提到它,以防你已经熟悉在 DirectSound 中这样做。
  • 我明白了,谢谢。不幸的是,我在那里没有看到我需要的信息。
  • 顺便说一句,我可以使用设备拓扑 API。这是从单个端点设备 (IMMDevice::GetId()) 到包含硬件的完整拓扑的一个很好的示例:docs.microsoft.com/en-us/windows/win32/coreaudio/…。 GetHardwareDeviceTopology (IMMDevice in, IDeviceTopology out) 中的示例代码看起来很有前景。不幸的是,在我的系统上,这仍然会导致单个卡的 IDeviceTopology::GetDeviceId 有 3 个值。

标签: winapi wasapi


【解决方案1】:

原来我的前提是错误的。显然,仅仅因为多个端点驻留在同一个物理设备上并不意味着它们共享同一个时钟(尽管可能是这种情况)。见这里:https://portaudio.music.columbia.narkive.com/0qYpAMkP/understanding-multiple-streams 和这里:https://audiophilestyle.com/forums/topic/19715-hq-player/page/584/,所以这基本上违背了我的问题的目的。无论如何,谢谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 2014-08-22
    • 1970-01-01
    • 2013-05-28
    • 2018-10-22
    • 2015-04-26
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多