如何判断输入/输出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
相关产品推荐
相关产品推荐

