0

Windows でダイレクト サウンド デバイスを列挙し、特定のチャネルの出力に使用される実際のデバイスをシリアル化する必要があります。これは、ダイレクト サウンド デバイスの GUID を保存することで正常に行われるようです。ただし、別のコンピューターに存在する場合は、同じハードウェアに接続する必要があります。GUID を使用してみましたが、まったく同じオーディオ デバイスが接続されている別のコンピューターでは異なります。

私がバインドしているのはオーディオ ハードウェアであるため、役割ではなく、Windows デバイス マネージャーに示されているように、デバイス インターフェイス パスを使用する必要があると思いますが、直接アクセスする方法はないようです。サウンド オブジェクトをデバイス マネージャ パスに追加します。

このマッピングを行うことは可能ですか?

4

1 に答える 1

0

ここに例があります: http://www.chrisnet.net/code.htmCLSID_DirectSoundPrivateはインターフェイスの使用方法を示しています。 、この例以外では説明されていない複数の呼び出しを含むひどいインターフェースを持っています。

この例を取り上げたGetところ、プロパティ セットでメソッドを呼び出そうとすると、スタック違反が発生しました。

IKsPropertySetdirect show は同じインターフェイスを同じ GUID で定義しているが、異なる vtable を使用している#include dshow.hことが判明しましstrmif.hdsound.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 に答える