You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断输入/输出IMMDevice实例是否属于同一物理声卡?

判断两个IMMDevice实例是否源自同一物理声卡的方法

要判断两个IMMDevice实例是否属于同一物理声卡,核心是获取它们关联的物理设备唯一标识符并进行比对,具体步骤如下:

  • 对每个IMMDevice实例,调用IMMDevice::OpenPropertyStore(STGM_READ, &pProps)获取只读属性存储对象IPropertyStore。
  • 从属性存储中读取PKEY_AudioEndpoint_PhysicalDeviceId属性,该属性的GUID标识为{0F87369F-0C51-4091-8D71-59D615642C5D},属性索引为2。这个属性的值是PROPVARIANT类型,实际存储的是代表物理声卡的唯一ID字符串(VT_LPWSTR类型)。
  • 比对两个IMMDevice实例获取到的物理设备ID字符串,若完全一致,则二者属于同一物理声卡。

代码示例(C++)

#include <mmdeviceapi.h>
#include <propkey.h>
#include <propvarutil.h>

bool IsSamePhysicalAudioDevice(IMMDevice* pDevice1, IMMDevice* pDevice2)
{
    if (!pDevice1 || !pDevice2) return false;

    IPropertyStore* pProps1 = nullptr;
    IPropertyStore* pProps2 = nullptr;
    PROPVARIANT pvId1 = {0}, pvId2 = {0};
    bool result = false;

    // 打开第一个设备的属性存储
    HRESULT hr = pDevice1->OpenPropertyStore(STGM_READ, &pProps1);
    if (FAILED(hr)) goto Cleanup;

    // 打开第二个设备的属性存储
    hr = pDevice2->OpenPropertyStore(STGM_READ, &pProps2);
    if (FAILED(hr)) goto Cleanup;

    // 获取物理设备ID
    hr = pProps1->GetValue(PKEY_AudioEndpoint_PhysicalDeviceId, &pvId1);
    if (FAILED(hr)) goto Cleanup;

    hr = pProps2->GetValue(PKEY_AudioEndpoint_PhysicalDeviceId, &pvId2);
    if (FAILED(hr)) goto Cleanup;

    // 比对ID字符串
    if (pvId1.vt == VT_LPWSTR && pvId2.vt == VT_LPWSTR)
    {
        result = wcscmp(pvId1.pwszVal, pvId2.pwszVal) == 0;
    }

Cleanup:
    PropVariantClear(&pvId1);
    PropVariantClear(&pvId2);
    if (pProps1) pProps1->Release();
    if (pProps2) pProps2->Release();
    return result;
}

注意事项:

  • 必须调用PropVariantClear释放PROPVARIANT资源,避免内存泄漏。
  • 编译时需链接mmdevapi.lib和propsys.lib相关库。
  • 针对较旧Windows版本(不支持PKEY_AudioEndpoint_PhysicalDeviceId),可通过IMMDevice::GetId获取端点ID,再调用SetupDiGetDeviceInterfaceDetail解析出物理设备实例ID进行比对,但该方法流程更繁琐。

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:10:02