Geräterollen für DirectShow-Anwendungen

Hinweis

Die MMDevice-API unterstützt Geräterollen. Die Benutzeroberfläche in Windows Vista implementiert jedoch keine Unterstützung für dieses Feature. Die Unterstützung der Benutzeroberfläche für Geräterollen kann in einer zukünftigen Version von Windows implementiert werden. Weitere Informationen finden Sie unter Geräterollen in Windows Vista.

 

Die DirectShow-API bietet keine Möglichkeit für eine Anwendung, das Audioendpunktgerät auszuwählen, das einer bestimmten Geräterolle zugewiesen ist. In Windows Vista können die kernigen Audio-APIs jedoch in Verbindung mit einer DirectShow-Anwendung verwendet werden, um die Geräteauswahl basierend auf der Geräterolle zu aktivieren. Mithilfe der kernigen Audio-APIs kann die Anwendung Folgendes ausführen:

  • Identifizieren Sie das Audioendpunktgerät, das der Benutzer einer bestimmten Geräterolle zugewiesen hat.
  • Erstellen Sie einen DirectShow-Audiorenderingfilter mit einer IBaseFilter-Schnittstelle , die das Audioendpunktgerät kapselt.
  • Erstellen Sie ein DirectShow-Diagramm, das den Filter enthält.

Weitere Informationen zu DirectShow und IBaseFilter finden Sie in der Windows SDK-Dokumentation.

Das folgende Codebeispiel zeigt, wie Sie einen DirectShow-Audiorenderingfilter erstellen, der das Renderingendpunktgerät kapselt, das einer bestimmten Geräterolle zugewiesen ist:

//-----------------------------------------------------------
// 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;
}

Im vorherigen Codebeispiel akzeptiert die CreateAudioRenderer-Funktion eine Geräterolle (eConsole, eMultimedia oder eCommunications) als Eingabeparameter. Der zweite Parameter ist ein Zeiger, über den die Funktion die Adresse einer IBaseFilter-Schnittstelle schreibt, instance. Darüber hinaus zeigt das Beispiel, wie Sie die IMMDevice::Activate-Methode verwenden, um den Audiodatenstrom im IBaseFilter-instance einer prozessübergreifenden Audiositzung mit einer anwendungsspezifischen Sitzungs-GUID zuzuweisen (angegeben durch die GuidAudioSessionId-Konstante). Der dritte Parameter im Aktivierungsaufruf verweist auf eine Struktur, die die Sitzungs-GUID und das prozessübergreifende Flag enthält. Wenn der Benutzer mehrere Instanzen der Anwendung ausführt, verwenden die Audiostreams von allen Instanzen dieselbe Sitzungs-GUID und gehören somit zur gleichen Sitzung.

Alternativ kann der Aufrufer NULL als dritten Parameter im Aktivierungsaufruf angeben, um den Stream der Standardsitzung als prozessspezifische Sitzung mit sitzungsspezifischem GUID-Wert GUID_NULL zuzuweisen. Weitere Informationen finden Sie unter IMMDevice::Activate.

Interoperabilität mit Legacy-Audio-APIs