我需要枚举 Windows 上的直接声音设备,并序列化用于输出特定通道的实际设备。这似乎可以通过保存直接声音设备 GUID 来正常完成。但是,如果它存在于不同的计算机上,我需要连接到相同的硬件。我试过使用 GUID,但在插入完全相同的音频设备的不同计算机上是不同的。
我相信,因为它是我绑定的音频硬件,而不是一个角色,我应该使用设备接口路径,如 Windows 设备管理器中所示,但似乎没有办法从直接声音对象到设备管理器路径。
是否可以进行此映射?
我需要枚举 Windows 上的直接声音设备,并序列化用于输出特定通道的实际设备。这似乎可以通过保存直接声音设备 GUID 来正常完成。但是,如果它存在于不同的计算机上,我需要连接到相同的硬件。我试过使用 GUID,但在插入完全相同的音频设备的不同计算机上是不同的。
我相信,因为它是我绑定的音频硬件,而不是一个角色,我应该使用设备接口路径,如 Windows 设备管理器中所示,但似乎没有办法从直接声音对象到设备管理器路径。
是否可以进行此映射?
此处有一个示例:http: //www.chrisnet.net/code.htm,它显示了如何使用该CLSID_DirectSoundPrivate
界面,这是非常重要的,如果您不知道要查找什么,几乎不可能通过 MSDN 找到, 并且有一个糟糕的接口,涉及多个调用,除此示例外,其他任何地方都没有解释。
我举了这个例子,最终在尝试调用Get
属性集上的方法时遇到了堆栈冲突。
事实证明,direct showIKsPropertySet
使用相同的 guid 但使用不同的 vtable 定义了相同的接口,如果您#include
dshow.h
或strmif.h
之前使用dsound.h
. 不用说,我不为所动。
所需调用如下:
hr = pKsPropertySet->Get(DSPROPSETID_DirectSoundDevice,
DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION,
NULL,
0,
&sDirectSoundDeviceDescription,
sizeof(sDirectSoundDeviceDescription),
&ulBytesReturned
);
if (ulBytesReturned)
{
// On the first call it notifies us of the required amount of memory in order to receive the strings.
// Allocate the required memory, the strings will be pointed to the memory space directly after the struct.
psDirectSoundDeviceDescription = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_DATA)new BYTE[ulBytesReturned];
*psDirectSoundDeviceDescription = sDirectSoundDeviceDescription;
hr = pKsPropertySet->Get(DSPROPSETID_DirectSoundDevice,
DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION,
NULL,
0,
psDirectSoundDeviceDescription,
ulBytesReturned,
&ulBytesReturned
);