Streamrouting
Streamrouting ist die Fähigkeit einer Medienanwendung, Datenströme zwischen Geräten mit minimaler Unterbrechung der Wiedergabe oder der Erfassungssitzung zu wechseln.
Ein Computer kann über mehrere Rendering- und Erfassungsgeräte verfügen. Das System listet diese Geräte in der Sound-Systemsteuerung auf. Aus dieser Liste kann ein Benutzer ein Gerät als Standardgerät für jede Rolle festlegen: Wiedergabe, Aufzeichnung oder die vier Kommunikationsrollen (Konsolenrendering, Konsolenerfassung, Kommunikationsrendering oder Kommunikationserfassung). Die Liste der Geräte kann dynamisch geändert werden, da einige dieser Geräte vorübergehend verfügbar sein können, z. B. ein USB-Headset. Wenn mehrere Geräte verfügbar sind, kann der Benutzer die Standardeinstellung auf ein anderes Gerät ändern. Der Benutzer kann auch das Format eines Geräts (Abtastrate, Bits pro Stichprobe und so weiter) auf der Registerkarte Erweitert für die Geräteeigenschaften ändern.
Stellen Sie sich ein Szenario vor, in dem ein Benutzer Speakers als Standardgerät für das Rendern von Audiostreams auswählt. Der Benutzer verbindet dann ein USB-Headset, wählt das Headset als neues Standardgerät aus und ändert die Abtastrate des Geräts von 44,1 kHz in 48 kHz. Der Benutzer möchte den Audiostream auf dem Headset mit der neuen Abtastrate mit minimaler Unterbrechung der Streamingsitzung wieder geben.
In diesem Szenario gibt es zwei Fälle, die die Medienanwendung verarbeiten muss:
- Der Stream muss mit minimaler Unterbrechung der Wiedergabe auf das neue Standardgerät übertragen werden.
- Das neue Gerät muss die Wiedergabe im neuen Format fortsetzen (d. h., der Benutzer kann mehr als die Abtastrate ändern).
In Windows Vista musste die Medienanwendung zur Unterstützung dieses Szenarios die Implementierung für das Streamrouting bereitstellen. Die Anwendung war dafür verantwortlich, vorhandene Streams zu beenden und die Streams auf dem neuen Gerät neu zu starten. Wenn der Benutzer das Standardgerät geändert hat oder das Mischungsformat geändert wurde, wurden alle zugeordneten Sitzungen geschlossen, und die Anwendung musste die Wiederherstellung verarbeiten.
In Windows 7 kann eine Anwendung einen Stream nahtlos von einem vorhandenen Standardgerät an einen neuen Standardaudioendpunkt übertragen. High-Level-Audio-API-Sätze wie Media Foundation, DirectSound und WAVE-APIs implementieren das Streamroutingfeature. Medienanwendungen, die diese API-Sätze verwenden, um einen Stream vom Standardgerät wieder- oder zu erfassen, verwenden die Standardimplementierung und müssen die Anwendung nicht ändern. Wenn Ihre Medienanwendung jedoch MMDeviceAPI oder WASAPI direkt verwendet, muss die Anwendung die Implementierung des Streamroutings bereitstellen.
Hinweis
MMDeviceAPI und WASAPI sind Kernaudio-API-Komponenten, mit denen eine Anwendung einen Stream auf einem Gerät rendern oder erfassen kann. MmDeviceAPI entdeckt das neue Audioendpunktgerät, und WASAPI verwaltet den Fluss von Audiodaten zwischen einer Medienanwendung und dem Audioendpunktgerät.
Um das Streamroutingfeature zu implementieren, muss die Anwendung auf die von MMDeviceAPI und WASAPI gesendeten Benachrichtigungen lauschen, wenn:
- Das Standardgerät wird vom Benutzer geändert.
- Das vorhandene Standardgerät wird entfernt, und ein neues Standardgerät wird hinzugefügt.
- Das Geräteformat wird geändert.
Durch die Verarbeitung dieser Benachrichtigungen kann eine Anwendung die erforderlichen Datenstromverwaltungsvorgänge ausführen, während der Stream auf das neue Standardgerät übertragen wird. Darüber hinaus kann die Anwendung vorhandene Streams rendern oder erfassen, indem sie das neue Format verwendet, das vom Benutzer angegeben wird, während eine Renderingsitzung aktiv ist.
Dieser Abschnitt enthält die folgenden Themen:
- Abrufen des Geräteendpunkts für das Streamrouting
- Relevante Benachrichtigungen für das Streamrouting
- Überlegungen zur Implementierung des Streamroutings
Die folgenden Beispiele, die im Windows SDK enthalten sind, veranschaulichen, wie eine Anwendung Streamroutingbenachrichtigungen verarbeiten kann.
- RenderSharedTimerDriven
- RenderSharedEventDriven
- RenderExclusiveTimerDriven
- RenderExclusiveEventDriven
- CaptureSharedTimerDriven
- CaptureSharedEventDriven