DirectSound 應用程式的裝置角色

注意

MMDevice API 支援裝置角色。 不過,Windows Vista 中的使用者介面不會實作此功能的支援。 未來版本的 Windows 可能會實作裝置角色的使用者介面支援。 如需詳細資訊,請參閱 Windows Vista 中的裝置角色。

 

DirectSound API 不會為應用程式提供方法,以選取使用者指派給特定裝置角色的音訊端點裝置。 不過,在 Windows Vista 中,核心音訊 API 可以與 DirectSound 應用程式搭配使用,以根據裝置角色啟用裝置選取。 在核心音訊 API 的説明下,應用程式可以識別指派給特定角色的音訊端點裝置、取得端點裝置的 DirectSound 裝置 GUID,以及呼叫 DirectSoundCreate 或 DirectSoundCaptureCreate 函式來建立封裝端點裝置的 IDirectSoundIDirectSoundCapture 介面實例。 如需 DirectSound 的詳細資訊,請參閱 Windows SDK 檔。

下列程式代碼範例示範如何取得目前指派給特定裝置角色之轉譯或擷取裝置的 DirectSound 裝置 GUID:

//-----------------------------------------------------------
// Get the DirectSound or DirectSoundCapture device GUID for
// an audio endpoint device. If flow = eRender, the function
// gets the DirectSound device GUID for the rendering device
// with the specified device role. If flow = eCapture, the
// function gets the DirectSoundCapture device GUID for the
// capture device with the specified device role.
//-----------------------------------------------------------
#define EXIT_ON_ERROR(hr)  \
              if (FAILED(hr)) { goto Exit; }
#define SAFE_RELEASE(punk)  \
              if ((punk) != NULL)  \
                { (punk)->Release(); (punk) = NULL; }

HRESULT GetDirectSoundGuid(EDataFlow flow, ERole role, GUID* pDevGuid)
{
    HRESULT hr = S_OK;
    IMMDeviceEnumerator *pEnumerator = NULL;
    IMMDevice *pDevice = NULL;
    IPropertyStore *pProps = NULL;

    PROPVARIANT var;
    PropVariantInit(&var);

    if (pDevGuid == NULL)
    {
        return E_POINTER;
    }

    // Get a device enumerator for the audio endpoint
    // devices in the system.
    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
                          NULL, CLSCTX_INPROC_SERVER,
                          __uuidof(IMMDeviceEnumerator),
                          (void**)&pEnumerator);
    EXIT_ON_ERROR(hr)

    // Get the endpoint device with the specified dataflow
    // direction (eRender or eCapture) and device role.
    hr = pEnumerator->GetDefaultAudioEndpoint(flow, role,
                                              &pDevice);
    EXIT_ON_ERROR(hr)

    hr = pDevice->OpenPropertyStore(STGM_READ, &pProps);
    EXIT_ON_ERROR(hr)

    // Get the DirectSound or DirectSoundCapture device GUID
    // (in WCHAR string format) for the endpoint device.
    hr = pProps->GetValue(PKEY_AudioEndpoint_GUID, &var);
    EXIT_ON_ERROR(hr)

    // Convert the WCHAR string to a GUID structure.
    hr = CLSIDFromString(var.pwszVal, pDevGuid);
    EXIT_ON_ERROR(hr)

Exit:
    PropVariantClear(&var);
    SAFE_RELEASE(pEnumerator);
    SAFE_RELEASE(pDevice);
    SAFE_RELEASE(pProps);
    return hr;
}

在上述程式代碼範例中,GetDirectSoundGuid 函式接受數據流方向 (eRender 或 eCapture) 和裝置角色 (eConsole、 eMultimedia 或 eCommunications) 作為輸入參數。 第三個參數是一個指標,函式會透過此指標寫入裝置 GUID,讓應用程式可作為 DirectSoundCreateDirectSoundCaptureCreate 函式的輸入參數。

上述程式代碼範例會透過下列方式取得 DirectSound 裝置 GUID:

  • 建立 IMMDevice 介面實例,代表具有指定數據流方向和裝置角色的音訊端點裝置。
  • 開啟音訊端點裝置的屬性存放區。
  • 從屬性存放區取得PKEY_AudioEndpoint_GUID屬性。 屬性值是音訊端點裝置 DirectSound 裝置 GUID 的字串表示法。
  • 呼叫 CLSIDFromString 函式,將裝置 GUID 的字串表示轉換成 GUID 結構。 如需 CLSIDFromString 的詳細資訊,請參閱 Windows SDK 檔。

從 GetDirectSoundGuid 函式取得裝置 GUID 之後,應用程式可以使用這個 GUID 呼叫 DirectSoundCreate 或 DirectSoundCaptureCreate,以建立封裝音頻端點裝置的 DirectSound 轉譯或擷取裝置。 當 DirectSound 以這種方式建立裝置時,它一律會將裝置的音訊數據流指派給預設會話,這是會話 GUID 值所識別的進程特定音訊會話GUID_NULL。

如果應用程式需要 DirectSound 將數據流指派給跨進程音訊會話,或指派給具有非 NULL 會話 GUID 的會話,它應該呼叫 IMMDevice::Activate 方法來建立 IDirectSound 或 IDirectSoundCapture 物件,而不是使用上述程式代碼範例所示的技術。 如需示範如何使用 Activate 方法來指定資料流的跨進程音訊會話或非 NULL 會話 GUID 的程式代碼範例,請參閱 DirectShow 應用程式的裝置角色。 該區段中的程式代碼範例示範如何建立 DirectShow 篩選,但是,透過次要修改,程式代碼可以調整為建立 DirectSound 裝置。

上述程式代碼範例中的 GetDirectSoundGuid 函式會呼叫 CoCreateInstance 函式,為系統中的音訊端點裝置建立列舉值。 除非先前呼叫 CoInitialize 或 CoInitializeEx 函式來初始化 COM 連結庫的呼叫程式,否則 CoCreateInstance 呼叫將會失敗。 如需 CoCreateInstance、CoInitialize 和 CoInitializeEx 的詳細資訊,請參閱 Windows SDK 檔。

與舊版音訊 API 的互操作性