Überlegungen zur Implementierung des Streamroutings
In Windows 7 implementieren Plattform-APIs auf hoher Ebene, die Core Audio-APIs wie Media Foundation-, DirectSound- und Wave-APIs verwenden, das Streamroutingfeature, indem sie den Streamwechsel von einem vorhandenen Gerät zu einem neuen Standardaudioendpunkt behandeln. Medienanwendungen, die diese APIs verwenden, verwenden das Streamroutingverhalten ohne Änderungen an der Quelle. Direkte WASAPI-Clients können die von Core Audio-Komponenten gesendeten Benachrichtigungen verwenden und das Streamroutingfeature implementieren.
Direkte WASAPI-Clients (Medienanwendungen, die WASAPI direkt verwenden) erhalten neue Geräte- und Audiositzungsbenachrichtigungen, die von Core Audio-Komponenten gesendet werden. Das Verhalten der Streamroutingfunktion wird durch die Art und Weise definiert, wie die Anwendung diese Benachrichtigungen behandelt.
Die MMDevice-API und die Audiositzung senden Benachrichtigungen über Gerätestatusänderungen und Sitzungsänderungen an WASAPI-Clients in Form von Rückrufen. Um diese Benachrichtigungen zu erhalten, muss der Client seine Implementierung von IMMNotificationClient und IAudioSessionEvents registrieren. Weitere Informationen finden Sie unter Relevante Benachrichtigungen für das Streamrouting.
In dem unter Streamrouting beschriebenen USB-Headsetszenario gibt eine Anwendung einen Audiodatenstrom wieder und verwendet MMDeviceAPI und WASAPI, um den Stream auf dem Standardrenderinggerät, Speaker, zu rendern. Wenn das Standardgerät geändert wird, erhält die Anwendung eine IMMNotificationClient-Benachrichtigung. Die Anwendung empfängt außerdem IAudioSessionEvents-Benachrichtigungen, die darauf hinweisen, dass der Benutzer das Audioendpunktgerät entfernt hat oder dass sich das Streamformat für das Gerät geändert hat, mit dem die Audiositzung verbunden ist. Nach dem Empfang der Benachrichtigungen beendet die Anwendung das Streaming an den Sprecherendpunkt und öffnet den Stream erneut für das Rendering auf dem aktuellen Standardendpunkt, dem Headset.

Als Reaktion auf solche Benachrichtigungen kann der Client den Stream auf dem neuen Standardgerät in dem vom Benutzer ausgewählten neuen Format erneut öffnen.
Stream-Managment
In der folgenden Liste sind die Schritte zusammengefasst, die ein WASAPI-Client ausführen muss, um die Funktion zum Wechseln des Streams zu bieten.
Warten Sie auf die entsprechende IMMNotificationClient-Benachrichtigung. Wenn das Gerät das Standardgerät ist, wird die Benachrichtigung IMMNotificationClient::OnDefaultDeviceChanged empfangen.
Wenn ein neues Gerät verfügbar ist, erhalten Sie einen Verweis auf den Endpunkt des neuen Geräts. Rufen Sie IMMDeviceEnumerator::GetDefaultAudioEndpoint für das neue Standardgerät auf. Wenn das neue Gerät nicht das Standardgerät ist, können Sie das Gerät abrufen, indem Sie IMMDeviceEnumerator::GetDevice aufrufen. Weitere Informationen finden Sie unter Abrufen des Geräteendpunkts für das Streamrouting.
Warten Sie, bis IAudioSessionEvents::OnSessionDisconnected mit dem Grundwert verbunden ist.
Hinweis
Da alle diese Vorgänge achron sind, kann die Reihenfolge, in der die Anwendung Geräteänderungs- und Sitzungstrennungsbenachrichtigungen empfängt, nicht vorhergesagt werden. Die Anwendung muss die Benachrichtigungsverarbeitung implementieren, um diese Benachrichtigungen in beliebiger Reihenfolge zu empfangen. In der Regel empfängt die Anwendung jedoch den Wert AudioSessionDisconnect, bevor die Standardbenachrichtigung zur Geräteänderung angezeigt wird.
Werten Sie den Grundwert aus, und bestimmen Sie, ob der Stream an einen anderen Audioendpunkt übertragen oder mit einem neuen Format erneut initialisiert werden muss.
Beenden Sie das Streaming an das alte Standardgerät, wenn der Grund darauf hinweist, dass der Stream an das neue Standardgerät umgeroutet werden soll.
Führen Sie Positionszuordnungsberechnungen durch.
Öffnen Sie den Stream auf dem neuen Gerät, und übertragen Sie alle Zustandsinformationen.
Setzen Sie das Streaming auf dem neuen Standardgerät wieder auf.
Behandeln Sie den Abbruch des alten Standardgeräts.
Damit der Datenstromwechsel nahtlos angezeigt wird, muss er so schnell wie möglich erfolgen. Dies hängt von der Leistung der Komponenten ab, die an der erneuten Initiierung des Streams auf dem neuen Gerät beteiligt sind.
Überlegungen zur Positionszuordnung
Wenn die Anwendung IMMNotificationClient- und IAudioSessionEvents-Benachrichtigungen erhält, kann sie die vorhandenen Streams an das neue Standardgerät routen. Wenn ein vorhandener Audiostream unterbrochen und auf dem neuen Gerät geöffnet wird, muss das Rendering auf dem neuen Gerät an der Position beginnen, an der der Stream auf dem alten Gerät beendet wurde. Hierzu muss die Anwendung über die letzte bekannte Geräteposition verfügen, um die Startposition auf dem neuen Gerät zu berechnen. Diese Position kann beispielsweise als Deltaoffset für die nachfolgende Positionszuordnung verwendet werden. Wenn der Datenstrom gerendert wird, kann die neue Geräteposition der zwischengespeicherten Geräteposition neu zugeordnet werden.
In den folgenden Schritten wird der Prozess eines nahtlosen Datenstromübergangs zusammengefasst.
- Speichern Sie die letzte Geräteposition des Streams auf dem alten Gerät zwischen.
- Beenden Sie den Stream auf dem alten Gerät.
- Führen Sie Neuberechnungen durch, um die neue Position zu erhalten.
- Beginnen Sie mit dem Rendern des Streams auf dem neuen Gerät.
- Geben Sie den alten Stream frei.
Während des Übergangs muss die Anwendung sicherstellen, dass die Uhr nicht aus der Synchronisierung herauskommt, was zu nicht synchronisierten Audio- und Videostreams führt. Dies kann auftreten, wenn die Videobeispiele weiterhin gerendert werden, während der Audiostream an das neue Gerät geroutet wird. Die Anwendung muss die Uhrposition für die Neuberechnung zwischenspeichern und sicherstellen, dass die Videobeispiele erst gerendert werden, wenn der Audiostream auf dem neuen Gerät erneut geöffnet wird, sodass die Audio- und Videostreams synchronisiert werden, wenn der Clip wieder gerendert wird. In einigen Fällen, in denen die Präsentationszeit für das Rendern der Videoframes auf der Audiouhr basiert, ist es ausreichend, den Audiostream zu beenden, bis der Streamwechsel abgeschlossen ist und keine andere Implementierung der Positionszuordnung für den Videostream für die Audiovideosynchronisierung erforderlich ist.
Wenn IAudioRenderClient::GetBuffer während des Renderings einen Fehler zurückgibt, weil das alte Gerät verloren geht, muss die Anwendung den alten Stream nicht beenden, da der Streamingvorgang bereits beendet wurde. Informationen zur Behandlung dieses Fehlers finden Sie unter Wiederherstellen nach einem Invalid-Device Fehlers.