Freigeben über


Implementieren eines benutzerdefinierten Audioendpunkt-Enumerators

Ab Windows Server 2008 R2 können Sie einen benutzerdefinierten Remoteaudioendpunkt-Enumerator als Teil eines Remotedesktopprotokollanbieters implementieren. Ein Remotedesktopprotokollanbieter kann einen benutzerdefinierten Audioendpunkt-Enumerator verwenden, um eine Sammlung von Audioendpunkten abzurufen, die über einen bestimmten Satz von Funktionen verfügen.

So implementieren Sie einen benutzerdefinierten Remoteaudioendpunkt-Enumerator

  1. Ihre benutzerdefinierte Endpunktumeratorlösung sollte vier Standard Objekttypen implementieren: Geräteumeratorobjekte, Gerätesammlungsobjekte, Geräteobjekte und Eigenschaftenspeicherobjekte.
Objekttyp Beschreibung
Geräteumeratorobjekt
Ein Geräteenumeratorobjekt stellt die Endpunkt-Enumeratorfunktionalität bereit. Es macht Methoden verfügbar, die einen Standardendpunkt zurückgeben, und angegebene Sammlungen von Endpunkten. Je nach den angegebenen Kriterien kann der Enumerator beispielsweise Kommunikationsendpunkte, Wiedergabeendpunkte oder Erfassungsendpunkte zurückgeben. Das Geräteenumeratorobjekt muss die IMMDeviceEnumerator-Schnittstelle implementieren.
Gerätesammlungsobjekt
Ein Gerätesammlungsobjekt stellt eine Auflistung von Audiogeräten dar. Sie muss die IMMDeviceCollection-Schnittstelle implementieren.
Geräteobjekt
Ein Geräteobjekt stellt ein bestimmtes Audiogerät dar. Es ermöglicht den Zugriff auf den Eigenschaftenspeicher des Audiogeräts und macht die auf dem Gerät verfügbaren Audiowiedergabe- und Aufnahmeschnittstellen verfügbar. Das Geräteobjekt muss die Schnittstellen IMMDevice und IMMEndpoint implementieren.
Eigenschaftsspeicherobjekt
Ein Eigenschaftenspeicherobjekt macht die Eigenschaften verfügbar, die einem Audiogerät zugeordnet sind. Einige dieser Eigenschaften werden vom System verwendet, aber Anwendungen können auch beliebige Eigenschaften mit dem Audioendpunkt speichern.
Alle Audiogeräte verfügen über die folgenden drei Eigenschaften:
Das Eigenschaftenspeicherobjekt muss die IPropertyStore-Schnittstelle implementieren.
  1. Der benutzerdefinierte Endpunkt-Enumerator muss in einer DLL implementiert werden, die in das Audiosystem und andere Anwendungen geladen werden kann. Die DLL muss signiert sein, damit sichere Prozesse sie laden können. Die DLL muss die GetTSAudioEndpointEnumeratorForSession-Funktion implementieren und exportieren, die als Einstiegspunkt zum benutzerdefinierten Endpunktumerator fungiert.

Der Remotedesktopdienstedienst ruft die QueryProperty-Methode auf und legt den QueryType-Parameter auf WTS_QUERY_AUDIOENUM_DLL fest, um den Namen des Enumeratorobjekts abzurufen.

Benutzerdefinierte Enumeratorobjekte verwenden COM-ähnliche Schnittstellen und einen COM-ähnlichen Verweiszählmechanismus, sind aber keine echten COM-Objekte. Der benutzerdefinierte Endpunkt-Enumerator muss in der Lage sein, mit Legacy-Audioschnittstellen zu arbeiten, die von Anwendungen verwendet werden, die COM nicht unterstützen. Aus diesem Grund darf sich der benutzerdefinierte Endpunkt-Enumerator nicht auf den Lebenszyklusverwaltungsmechanismus von COM verlassen. Consumer Ihres Audioendpunkt-Enumerators, z. B. MMDevAPI.dll, laden die benutzerdefinierte Endpunkt-Enumerator-DLL, wenn dies von Benutzeranwendungen erforderlich ist, und sie entladen den Enumerator nicht, während der Enumerator einen Verweis auf ein Geräteenumeratorobjekt, ein Gerätesammlungsobjekt, ein Geräteobjekt oder ein Eigenschaftsspeicherobjekt enthält. Für diese Consumer ist es jedoch nicht möglich, Verweise auf andere Objekttypen nachzuverfolgen, die dem benutzerdefinierten Endpunkt-Enumerator gehören. Entsprechend wird empfohlen, dass Ihr benutzerdefinierter Endpunkt-Enumerator keine Objekte erstellt, die diese vier Objekttypen überdauern könnten.

So implementieren Sie einen benutzerdefinierten Audioendpunkt

Um einen benutzerdefinierten Audiogeräte-Enumerator zu implementieren, müssen Sie einen benutzerdefinierten Audioendpunkt implementieren. Die Verknüpfung Ihrer benutzerdefinierten Audiogeräte erfolgt mithilfe der folgenden beiden Anweisungen:

  • IMMDevice::Activate(IAudioOutputEndpointRT)
  • IMMDevice::Activate(IAudioInputEndpointRT)

Wir erwarten nicht, dass Sie die vollständige Liste der IMMDevice::Activate-Schnittstellen in Ihrem benutzerdefinierten Audiogeräte-Enumerator implementieren. Stattdessen sollten Sie IAudioOutputEndpointRT und IAudioInputEndpointRT implementieren. Sie können optional einige weitere implementieren, z. B . IAudioEndpointVolume. Für jede Schnittstelle, die Sie nicht implementieren, sollten Sie E_NOINTERFACE zurückgeben (Sie müssen diesen spezifischen Fehlercode verwenden). Windows verwendet dann eine Bestandsimplementierung der Schnittstelle (z. B . IAudioClient2).

Weitere Referenzdokumentationen zum Implementieren und Registrieren von Audioendpunkten finden Sie unter IAudioInputEndpointRT. Ein Diagramm, das die Funktionsweise von WASAPI zeigt, finden Sie unter Audiokomponenten im Benutzermodus. Beachten Sie, dass die gesamte Audiowiedergabe im Benutzermodus ab Windows Server 2008 neu ist.

Erstellen eines Remotedesktopprotokollanbieters

GetTSAudioEndpointEnumeratorForSession

IMMDevice

IMMDeviceCollection

IMMDeviceEnumerator

IMMEndpoint

Ipropertystore