DirectShow 應用程式的裝置角色

注意

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

 

DirectShow API 不提供應用程式選取指派給特定裝置角色的音訊端點裝置的方法。 不過,在 Windows Vista 中,核心音訊 API 可以與 DirectShow 應用程式搭配使用,以根據裝置角色啟用裝置選取。 透過核心音訊 API 的協助,應用程式可以:

  • 識別使用者指派給特定裝置角色的音訊端點裝置。
  • 使用封裝音頻端點裝置的IBaseFilter 介面,建立 DirectShow 音訊轉譯篩選器
  • 建置包含篩選條件的 DirectShow 圖形。

如需 DirectShow 和 IBaseFilter 的詳細資訊,請參閱 Windows SDK 檔。

下列程式代碼範例示範如何建立 DirectShow 音訊轉譯篩選器,以封裝指派給特定裝置角色的轉譯端點裝置:

//-----------------------------------------------------------
// Create a DirectShow audio rendering filter that
// encapsulates the audio endpoint device that is currently
// assigned to the specified device role.
//-----------------------------------------------------------
#define EXIT_ON_ERROR(hres)  \
              if (FAILED(hres)) { goto Exit; }
#define SAFE_RELEASE(punk)  \
              if ((punk) != NULL)  \
                { (punk)->Release(); (punk) = NULL; }

// This application's audio session GUID
const GUID guidAudioSessionId = {
    0xb13ff52e, 0xa5cf, 0x4fca,
    {0x9f, 0xc3, 0x42, 0x26, 0x5b, 0x0b, 0x14, 0xfb}
};

HRESULT CreateAudioRenderer(ERole role, IBaseFilter** ppAudioRenderer)
{
    HRESULT hr = S_OK;
    IMMDeviceEnumerator *pEnumerator = NULL;
    IMMDevice *pDevice = NULL;

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

    // Activate the IBaseFilter interface on the
    // audio renderer with the specified role.
    hr = CoCreateInstance(CLSID_MMDeviceEnumerator,
                          NULL, CLSCTX_INPROC_SERVER,
                          __uuidof(IMMDeviceEnumerator),
                          (void**)&pEnumerator);
    EXIT_ON_ERROR(hr)

    hr = pEnumerator->GetDefaultAudioEndpoint(eRender, role,
                                              &pDevice);
    EXIT_ON_ERROR(hr)

    DIRECTX_AUDIO_ACTIVATION_PARAMS  daap;
    daap.cbDirectXAudioActivationParams = sizeof(daap);
    daap.guidAudioSession = guidAudioSessionId;
    daap.dwAudioStreamFlags = AUDCLNT_STREAMFLAGS_CROSSPROCESS;

    PROPVARIANT  var;
    PropVariantInit(&var);

    var.vt = VT_BLOB;
    var.blob.cbSize = sizeof(daap);
    var.blob.pBlobData = (BYTE*)&daap;

    hr = pDevice->Activate(__uuidof(IBaseFilter),
                           CLSCTX_ALL, &var,
                           (void**)ppAudioRenderer);
    EXIT_ON_ERROR(hr)

Exit:
    SAFE_RELEASE(pEnumerator);
    SAFE_RELEASE(pDevice);
    return hr;
}

在上述程式代碼範例中,CreateAudioRenderer 函式接受裝置角色(eConsole、eMultimedia 或 eCommunications)作為輸入參數。 第二個參數是指針,函式會透過該指標寫入IBaseFilter 介面實例的位址。 此外,此範例示範如何使用 IMMDevice::Activate 方法,將 IBaseFilter 實例中的音訊數據流指派給具有應用程式特定會話 GUID 的跨進程音訊會話(由 guidAudioSessionId 常數指定)。 Activate 呼叫中的第三個參數會指向包含會話 GUID 和跨進程旗標的結構。 如果使用者執行應用程式的多個實例,則來自所有實例的音訊串流會使用相同的會話 GUID,因此屬於相同的會話。

或者,呼叫端可以將 NULL 指定為 Activate 呼叫中的第三個參數,將數據流指派給預設會話,做為具有會話 GUID 值的進程特定會話GUID_NULL。 如需詳細資訊,請參閱 IMMDevice::Activate

與舊版音訊 API 的互操作性