共用方式為


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 的互操作性