Freigeben über


Geräterollen für DirectShow-Anwendungen

Anmerkung

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 stellt keine Möglichkeit bereit, eine Anwendung zum Auswählen des Audioendpunktgeräts, das einer bestimmten Geräterollezugewiesen ist. In Windows Vista können die wichtigsten Audio-APIs jedoch in Verbindung mit einer DirectShow-Anwendung verwendet werden, um die Geräteauswahl basierend auf der Geräterolle zu aktivieren. Mit Hilfe der wichtigsten Audio-APIs kann die Anwendung:

  • 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- Schnittstelleninstanz schreibt. Darüber hinaus wird im Beispiel gezeigt, wie Sie die IMMDevice::Activate-Methode verwenden, um den Audiodatenstrom in der IBaseFilter Instanz einer prozessübergreifenden Audiositzung mit einer anwendungsspezifischen Sitzungs-GUID (angegeben durch die guidAudioSessionId Konstante) zuzuweisen. Der dritte Parameter im Activate Aufruf 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 Audiodatenströme aller Instanzen dieselbe Sitzungs-GUID und gehören somit zur gleichen Sitzung.

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

Interoperabilität mit älteren Audio-APIs