Freigeben über


Geräterollen für DirectSound-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 DirectSound-API bietet keine Möglichkeit für eine Anwendung, das Audioendpunktgerät auszuwählen,, das der Benutzer einer bestimmten Geräterollezugewiesen hat. In Windows Vista können die wichtigsten Audio-APIs jedoch in Verbindung mit einer DirectSound-Anwendung verwendet werden, um die Geräteauswahl basierend auf der Geräterolle zu ermöglichen. Mit Hilfe der wichtigsten Audio-APIs die Anwendung kann 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 Schnittstelleninstanz zu erstellen, die das Endpunktgerät kapselt. Weitere Informationen zu DirectSound finden Sie in der Windows SDK-Dokumentation.

Das folgende Codebeispiel zeigt, wie Sie die DirectSound-Geräte-GUID für das Rendering- oder Aufnahmegerä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 abgerufen:

  • Erstellen einer IMMDevice Schnittstelleninstanz, 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 zum Konvertieren der Zeichenfolgendarstellung der Geräte-GUID in eine GUID-Struktur. Weitere Informationen zu CLSIDFromString-finden Sie in der Windows SDK-Dokumentation.

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 dem Audiodatenstrom des Geräts immer der Standardsitzung zu – der prozessspezifischen Audiositzung, die durch den Sitzungs-GUID-Wert GUID_NULL identifiziert wird.

Wenn die Anwendung DirectSound benötigt, um den Datenstrom einer prozessübergreifenden Audiositzung oder einer Sitzung mit einer nichtNULL- Sitzungs-GUID zuzuweisen, sollte die IMMDevice::Activate-Methode aufgerufen werden, um eine IDirectSound- oder IDirectSoundCapture--Objekt zu erstellen, anstatt die im vorherigen Codebeispiel gezeigte Technik zu verwenden. Ein Codebeispiel, in dem gezeigt wird, wie die Activate-Methode verwendet wird, um eine prozessübergreifende Audiositzung oder eine nichtNULL- Sitzungs-GUID für einen Datenstrom anzugeben, 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. Sofern das aufrufende Programm zuvor entweder die CoInitialize oder CoInitializeEx--Funktion 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 Windows SDK-Dokumentation.

Interoperabilität mit älteren Audio-APIs