Freigeben über


Überlegungen zur Implementierung des Streamroutings

In Windows 7 implementieren allgemeine Plattform-APIs, 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 die Streamroutingfunktion implementieren.

Direkte WASAPI-Clients (Medienanwendungen, die WASAPI direkt verwenden) empfangen neue Geräte- und Audiositzungsbenachrichtigungen, die von Core Audio-Komponenten gesendet werden. Das Verhalten des Streamroutingfeatures wird durch die Verarbeitung dieser Benachrichtigungen durch die Anwendung definiert.

Die MMDevice-API und die Audiositzung senden Benachrichtigungen über Gerätezustandsänderungen und Sitzungsänderungen in Form von Rückrufen an WASAPI-Clients. 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.

Im unter Streamrouting beschriebenen USB-Headsetszenario gibt eine Anwendung einen Audiodatenstrom ab und verwendet MMDeviceAPI und WASAPI, um den Stream auf dem Standardrenderinggerät Lautsprecher zu rendern. Wenn das Standardgerät geändert wird, erhält die Anwendung eine IMMNotificationClient-Benachrichtigung . Die Anwendung empfängt auch IAudioSessionEvents-Benachrichtigungen , die angeben, 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 zum Rendern auf dem aktuellen Standardendpunkt, dem Headset.

Diagramm des Datenflusses für Gerätebenachrichtigungen.

Als Reaktion auf solche Benachrichtigungen kann der Client den Stream auf dem neuen Standardgerät in dem vom Benutzer gewählten neuen Format erneut öffnen.

Stream-Verwaltung

In der folgenden Liste sind die Schritte zusammengefasst, die ein WASAPI-Client ausführen muss, um die Stream switching-Funktionalität bereitzustellen.

  1. Warten Sie auf die entsprechende IMMNotificationClient-Benachrichtigung . Wenn das Gerät das Standardgerät ist, wird die Benachrichtigung IMMNotificationClient::OnDefaultDeviceChanged empfangen.

  2. Wenn ein neues Gerät verfügbar ist, rufen Sie einen Verweis auf den Endpunkt des neuen Geräts ab. 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.

  3. Warten Sie, bis IAudioSessionEvents::OnSessionDisconnected mit dem Reason-Wert ist.

    Hinweis

    Da alle diese Vorgänge asynchron sind, kann die Reihenfolge, in der die Anwendung Benachrichtigungen zum Gerätewechsel und zum Trennen der Sitzung empfängt, nicht vorhergesagt werden. Die Anwendung muss die Benachrichtigungsverarbeitung implementieren, um diese Benachrichtigungen in beliebiger Reihenfolge zu erhalten. In der Regel empfängt die Anwendung jedoch den AudioSessionDisconnect-Wert vor der Standardbenachrichtigung zum Gerätewechsel.

     

  4. Werten Sie den Grundwert aus, und ermitteln Sie, ob der Stream an einen anderen Audioendpunkt übertragen werden muss oder der Stream mit einem neuen Format neu initialisiert werden muss.

  5. Beenden Sie das Streaming auf das alte Standardgerät, wenn der Grund angibt, dass der Stream an das neue Standardgerät umgeleitet werden soll.

  6. Führen Sie Positionszuordnungsberechnungen aus.

  7. Öffnen Sie den Stream auf dem neuen Gerät, und übertragen Sie alle Statusinformationen.

  8. Setzen Sie das Streaming auf dem neuen Standardgerät fort.

  9. Behandeln Des Verlassens des alten Standardgeräts.

Damit der Streamwechselvorgang nahtlos erscheint, muss er so schnell wie möglich durchgeführt werden. Dies hängt von der Leistung der Komponenten ab, die an der erneuten Initiierung des Datenstroms auf dem neuen Gerät beteiligt sind.

Überlegungen zur Positionszuordnung

Wenn die Anwendung IMMNotificationClient - und IAudioSessionEvents-Benachrichtigungen erhält, kann sie die vorhandenen Datenströme an das neue Standardgerät weiterleiten. Wenn ein vorhandener Audiodatenstrom 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. Dazu 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 Stream mit dem Rendern beginnt, kann die neue Geräteposition der zwischengespeicherten Geräteposition neu zugeordnet werden.

In den folgenden Schritten wird der Prozess für einen nahtlosen Streamübergang zusammengefasst.

  1. Speichern Sie die letzte Geräteposition des Datenstroms auf dem alten Gerät zwischen.
  2. Beenden Sie den Stream auf dem alten Gerät.
  3. Führen Sie Neuzuordnungsberechnungen aus, um die neue Position zu erhalten.
  4. Beginnen Sie mit dem Rendern des Datenstroms auf dem neuen Gerät.
  5. Geben Sie den alten Stream frei.

Während des Übergangs muss die Anwendung sicherstellen, dass die Uhr nicht aus der Synchronisierung kommt, was zu nicht synchronisierten Audio- und Videodatenströmen führt. Dies kann auftreten, wenn die Videobeispiele weiterhin gerendert werden, während der Audiodatenstrom an das neue Gerät weitergeleitet wird. Die Anwendung muss die Uhrposition für die Neuzuordnungsberechnung zwischenspeichern und sicherstellen, dass die Videobeispiele erst gerendert werden, wenn der Audiodatenstrom auf dem neuen Gerät erneut geöffnet wird, sodass die Audio- und Videodatenströme synchronisiert werden, wenn das Rendering des Clips fortgesetzt wird. In einigen Fällen, in denen die Präsentationszeit für das Rendern der Videoframes auf der Audiouhr basiert, reicht es aus, den Audiodatenstrom zu beenden, bis der Streamwechsel abgeschlossen ist und keine andere Positionszuordnungsimplementierung 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 Fehler.

Informationen zur MMDevice-API

Über WASAPI

Streamrouting