Freigeben über


Überlegungen zur Implementierung von Streamrouting

Implementieren Sie in Windows 7 Allgemeine Plattform-APIs, die Core-Audio-APIs wie Media Foundation, DirectSound und Wave-APIs verwenden, das Streamroutingfeature, indem Sie den Datenstromwechsel von einem vorhandenen Gerät zu einem neuen Standardaudioendpunkt behandeln. Medienanwendungen, die diese APIs verwenden, verwenden das Datenstromroutingverhalten 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) empfangen neue Geräte- und Audiositzungsbenachrichtigungen, die von Core Audio-Komponenten gesendet werden. Das Verhalten des Streamroutingfeatures wird durch die Behandlung dieser Benachrichtigungen durch die Anwendung definiert.

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 Relevant Notifications for Stream Routing.

Im in Stream Routingbeschriebenen USB-Headsetszenario wird eine Anwendung einen Audiodatenstrom wiedergegeben und verwendet MMDeviceAPI und WASAPI zum Rendern des Datenstroms auf dem Standardrendergerät, Lautsprecher. Wenn das Standardgerät geändert wird, empfängt die Anwendung eine IMMNotificationClient--Benachrichtigung. Die Anwendung empfängt auch IAudioSessionEvents Benachrichtigungen, die angeben, dass der Benutzer das Audioendpunktgerät entfernt hat oder dass das Streamformat für das Gerät geändert wurde, mit dem die Audiositzung verbunden ist. Beim Empfang der Benachrichtigungen beendet die Anwendung das Streaming an den Lautsprecherendpunkt und öffnet den Datenstrom zum Rendern auf dem aktuellen Standardendpunkt, dem Headset.

Diagramm des Datenflusses für Gerätebenachrichtigungen.

Als Reaktion auf solche Benachrichtigungen kann der Client den Datenstrom auf dem neuen Standardgerät im vom Benutzer ausgewählten neuen Format erneut öffnen.

Stream-Verwaltung

In der folgenden Liste sind die Schritte zusammengefasst, die ein WASAPI-Client ausführen muss, um die Streamwechselfunktion bereitzustellen.

  1. Warten Sie auf die relevante IMMNotificationClient--Benachrichtigung. Wenn das Gerät das Standardgerät ist, wird die IMMNotificationClient::OnDefaultDeviceChanged Benachrichtigung 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::GetDeviceaufrufen. Weitere Informationen finden Sie unter Abrufen des Device Endpoint for Stream Routing.

  3. Warten Sie auf die IAudioSessionEvents::OnSessionDisconnected mit dem Grundwert.

    Anmerkung

    Da alle diese Vorgänge asychron sind, kann die Reihenfolge, in der die Anwendung Geräteänderungs- und Sitzungstrennbenachrichtigungen 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 AudioSessionDisconnect Wert vor der Standardbenachrichtigung zur Geräteänderung.

     

  4. Bewerten Sie den Grundwert, und bestimmen Sie, ob der Datenstrom an einen anderen Audioendpunkt übertragen werden muss, oder ob der Datenstrom mit einem neuen Format neu initialisiert werden muss.

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

  6. Durchführen von Positionszuordnungsberechnungen.

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

  8. Fortsetzen des Streamings auf dem neuen Standardgerät.

  9. Behandeln Sie den Abflug des alten Standardgeräts.

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

Überlegungen zur Positionszuordnung

Wenn die Anwendung IMMNotificationClient und IAudioSessionEvents Benachrichtigungen abruft, 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 Datenstrom 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 z. B. als Delta-Offset für die nachfolgende Positionszuordnung verwendet werden. Wenn das Rendern des Datenstroms gestartet wird, kann die neue Geräteposition der zwischengespeicherten Geräteposition neu zugeordnet werden.

Die folgenden Schritte fassen den Prozess zusammen, mit dem ein nahtloser Datenstromübergang erfolgt.

  1. Speichern Sie die letzte Geräteposition des Datenstroms auf dem alten Gerät zwischen.
  2. Beenden Sie den Datenstrom auf dem alten Gerät.
  3. Führen Sie Neuzuordnungsberechnungen durch, um die neue Position abzurufen.
  4. Starten Sie das Rendern des Datenstroms auf dem neuen Gerät.
  5. Lassen Sie den alten Stream frei.

Während des Übergangs muss die Anwendung sicherstellen, dass die Uhr nicht mehr synchronisiert wird, was zu nicht synchronisierten Audio- und Videostreams 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 beim Fortsetzen des Renderns des Clips die Audio- und Videodatenströme synchronisiert werden. 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 beim Rendern IAudioRenderClient::GetBuffer einen Fehler zurückgibt, da das alte Gerät verloren geht, muss die Anwendung den alten Datenstrom nicht beenden, da der Streamingvorgang bereits beendet wurde. Informationen zum Behandeln dieses Fehlers finden Sie unter Wiederherstellen von einem Invalid-Device Error.

Über MMDevice-API-

über WASAPI-