Freigeben über


Geräterollen für DirectSound-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 DirectSound-API bietet keine Möglichkeit für eine Anwendung, das Audioendpunktgerät auszuwählen, das der Benutzer einer bestimmten Geräterolle zugewiesen hat. In Windows Vista können die kernigen Audio-APIs jedoch in Verbindung mit einer DirectSound-Anwendung verwendet werden, um die Geräteauswahl basierend auf der Geräterolle zu aktivieren. Mithilfe der Kern-Audio-APIs kann die Anwendung das Audioendpunktgerät identifizieren, das einer bestimmten Rolle zugewiesen ist, die DirectSound-Geräte-GUID für das Endpunktgerät abrufen und die DirectSoundCreate- oder DirectSoundCaptureCreate-Funktion aufrufen, um eine IDirectSound- oder IDirectSoundCapture-Schnittstelle instance zu erstellen, die das Endpunktgerät kapselt. Weitere Informationen zu DirectSound finden Sie in der Dokumentation zum Windows SDK.

Das folgende Codebeispiel zeigt, wie Sie die DirectSound-Geräte-GUID für das Rendering- oder Erfassungsgerät abrufen, das derzeit einer bestimmten Geräterolle zugewiesen ist:

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

Im vorherigen Codebeispiel akzeptiert die GetDirectSoundGuid-Funktion eine Datenflussrichtung (eRender oder eCapture) und eine Geräterolle (eConsole, eMultimedia oder eCommunications) als Eingabeparameter. Der dritte Parameter ist ein Zeiger, über den die Funktion eine Geräte-GUID schreibt, die die Anwendung als Eingabeparameter für die DirectSoundCreate - oder DirectSoundCaptureCreate-Funktion bereitstellen kann.

Im vorherigen Codebeispiel wird die DirectSound-Geräte-GUID wie folgt abgerufen:

  • Erstellen einer IMMDevice-Schnittstelle instance, die das Audioendpunktgerät darstellt, das über die angegebene Datenflussrichtung und Geräterolle verfügt.
  • Öffnen des Eigenschaftenspeichers des Audioendpunktgeräts.
  • Abrufen der PKEY_AudioEndpoint_GUID Eigenschaft aus dem Eigenschaftenspeicher. Der Eigenschaftswert ist eine Zeichenfolgendarstellung der DirectSound-Geräte-GUID für das Audioendpunktgerät.
  • Aufrufen der CLSIDFromString-Funktion , um die Zeichenfolgendarstellung der Geräte-GUID in eine GUID-Struktur zu konvertieren. Weitere Informationen zu CLSIDFromString finden Sie in der Dokumentation zum Windows SDK.

Nach dem Abrufen einer Geräte-GUID aus der GetDirectSoundGuid-Funktion kann die Anwendung DirectSoundCreate oder DirectSoundCaptureCreate mit dieser GUID aufrufen, um das DirectSound-Rendering- oder Aufnahmegerät zu erstellen, das das Audioendpunktgerät kapselt. Wenn DirectSound ein Gerät auf diese Weise erstellt, weist es immer den Audiodatenstrom des Geräts der Standardsitzung zu – der prozessspezifischen Audiositzung, die durch den Sitzungs-GUID-Wert GUID_NULL identifiziert wird.

Wenn die Anwendung DirectSound zum Zuweisen des Datenstroms zu einer prozessübergreifenden Audiositzung oder zu einer Sitzung mit einer Nicht-NULL-Sitzungs-GUID erfordert, sollte die IMMDevice::Activate-Methode aufgerufen werden, um ein IDirectSound- oder IDirectSoundCapture-Objekt zu erstellen, anstatt die im vorherigen Codebeispiel gezeigte Technik zu verwenden. Ein Codebeispiel, das zeigt, wie sie mit der Activate-Methode eine prozessübergreifende Audiositzung oder eine Sitzungs-GUID ohne NULL für einen Stream angeben, finden Sie unter Geräterollen für DirectShow-Anwendungen. Das Codebeispiel in diesem Abschnitt zeigt, wie sie einen DirectShow-Filter erstellen, aber mit geringfügigen Änderungen kann der Code angepasst werden, um ein DirectSound-Gerät zu erstellen.

Die GetDirectSoundGuid-Funktion im vorherigen Codebeispiel ruft die CoCreateInstance-Funktion auf, um einen Enumerator für die Audioendpunktgeräte im System zu erstellen. Wenn das aufrufende Programm zuvor entweder die Funktion CoInitialize oder CoInitializeEx aufgerufen hat, um die COM-Bibliothek zu initialisieren, schlägt der CoCreateInstance-Aufruf fehl. Weitere Informationen zu CoCreateInstance, CoInitialize und CoInitializeEx finden Sie in der Dokumentation zum Windows SDK.

Interoperabilität mit Legacy-Audio-APIs