0

我需要枚举 Windows 上的直接声音设备,并序列化用于输出特定通道的实际设备。这似乎可以通过保存直接声音设备 GUID 来正常完成。但是,如果它存在于不同的计算机上,我需要连接到相同的硬件。我试过使用 GUID,但在插入完全相同的音频设备的不同计算机上是不同的。

我相信,因为它是我绑定的音频硬件,而不是一个角色,我应该使用设备接口路径,如 Windows 设备管理器中所示,但似乎没有办法从直接声音对象到设备管理器路径。

是否可以进行此映射?

4

1 回答 1

0

此处有一个示例:http: //www.chrisnet.net/code.htm,它显示了如何使用该CLSID_DirectSoundPrivate界面,这是非常重要的,如果您不知道要查找什么,几乎不可能通过 MSDN 找到, 并且有一个糟糕的接口,涉及多个调用,除此示例外,其他任何地方都没有解释。

我举了这个例子,最终在尝试调用Get属性集上的方法时遇到了堆栈冲突。

事实证明,direct showIKsPropertySet使用相同的 guid 但使用不同的 vtable 定义了相同的接口,如果您#include dshow.hstrmif.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
        ); 
于 2014-08-28T12:22:03.303 回答