Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In Windows 7 implementeren platform-API's op hoog niveau die gebruikmaken van Core Audio-API's, zoals Media Foundation, DirectSound en Wave-API's, de functie voor streamroutering door de stroom over te schakelen van een bestaand apparaat naar een nieuw standaardaudio-eindpunt. Mediatoepassingen die deze API's gebruiken, maken gebruik van het gedrag van streamroutering zonder wijzigingen in de bron. Directe WASAPI-clients kunnen de meldingen gebruiken die worden verzonden door Core Audio-onderdelen en de functie voor streamroutering implementeren.
Directe WASAPI-clients (mediatoepassingen die rechtstreeks GEBRUIKMAKEN van WASAPI) ontvangen nieuwe apparaat- en audiosessiemeldingen die worden verzonden door Core Audio-onderdelen. Het gedrag van de streamrouteringsfunctie wordt gedefinieerd door de manier waarop de toepassing deze meldingen verwerkt.
MMDevice-API en de audiosessie verzenden meldingen over apparaatstatuswijzigingen en sessiewijzigingen in WASAPI-clients in de vorm van callbacks. Om deze meldingen te ontvangen, moet de client de implementatie van IMMNotificationClient en IAudioSessionEventsregistreren. Zie Relevante meldingen voor streamrouteringvoor meer informatie.
In het scenario van de USB-headset die wordt beschreven in Stream Routing, speelt een toepassing een audiostream af en gebruikt MMDeviceAPI en WASAPI om de stream weer te geven op het standaardweergaveapparaat, Speaker. Wanneer het standaardapparaat wordt gewijzigd, ontvangt de toepassing een melding IMMNotificationClient. De toepassing ontvangt ook IAudioSessionEvents meldingen die aangeven dat de gebruiker het audio-eindpuntapparaat heeft verwijderd of dat de streamindeling is gewijzigd voor het apparaat waarmee de audiosessie is verbonden. Na ontvangst van de meldingen stopt de toepassing met streamen naar het luidsprekereindpunt en opent de stream opnieuw voor rendering op het huidige standaardeindpunt, de headset.
Als reactie op dergelijke meldingen kan de client de stream opnieuw openen op het nieuwe standaardapparaat in de nieuwe indeling die door de gebruiker is geselecteerd.
Stroombeheer
De volgende lijst bevat een overzicht van de stappen die een WASAPI-client moet uitvoeren om de functionaliteit voor stroomwisselingen te bieden.
Wacht op de relevante IMMNotificationClient melding. Als het apparaat het standaardapparaat is, wordt de melding IMMNotificationClient::OnDefaultDeviceChanged ontvangen.
Als er een nieuw apparaat beschikbaar is, haalt u een verwijzing op naar het eindpunt van het nieuwe apparaat. Roep IMMDeviceEnumerator::GetDefaultAudioEndpoint aan voor het nieuwe standaardapparaat. Als het nieuwe apparaat niet het standaardapparaat is, kunt u het apparaat ophalen door IMMDeviceEnumerator::GetDeviceaan te roepen. Zie Het apparaateindpunt ophalen voor streamrouteringvoor meer informatie.
Wacht op de IAudioSessionEvents::OnSessionDisconnected met de redenwaarde.
Notitie
Omdat al deze bewerkingen asychronisch zijn, kan de volgorde waarin de toepassing meldingen over apparaatwijziging en sessie-verbinding ontvangt, niet worden voorspeld. De toepassing moet de verwerking van meldingen implementeren om deze meldingen in elke volgorde te ontvangen. Normaal gesproken ontvangt de toepassing echter AudioSessionDisconnect waarde voordat de standaardmelding voor apparaatwijziging wordt weergegeven.
Evalueer de redenwaarde en bepaal of de stream moet worden overgedragen naar een ander audio-eindpunt of dat de stream opnieuw moet worden geïnitialiseerd met een nieuwe indeling.
Stop het streamen naar het oude standaardapparaat als de reden aangeeft dat de stream opnieuw moet worden gerouteerd naar het nieuwe standaardapparaat.
Voer positietoewijzingsberekeningen uit.
Open de stream op het nieuwe apparaat en draag alle statusinformatie over.
Streaming hervatten op het nieuwe standaardapparaat.
Het vertrek van het oude standaardapparaat afhandelen.
Om de stroomwisselbewerking naadloos te laten verlopen, moet deze zo snel mogelijk worden uitgevoerd. Dit is afhankelijk van de prestaties van de onderdelen die betrokken zijn bij het opnieuw starten van de stream op het nieuwe apparaat.
Overwegingen voor positietoewijzing
Wanneer de toepassing IMMNotificationClient en IAudioSessionEvents meldingen krijgt, kunnen de bestaande streams worden doorgestuurd naar het nieuwe standaardapparaat. Wanneer een bestaande audiostream wordt onderbroken en geopend op het nieuwe apparaat, moet de rendering op het nieuwe apparaat beginnen op de positie waarop de stream is gestopt op het oude apparaat. Hiervoor moet de toepassing de laatst bekende apparaatpositie hebben om de beginpositie op het nieuwe apparaat te berekenen. Deze positie kan bijvoorbeeld worden gebruikt als de delta-offset voor volgende positietoewijzing. Wanneer de stream wordt weergegeven, kan de positie van het nieuwe apparaat opnieuw worden toegewezen aan de positie van het apparaat in de cache.
De volgende stappen geven een overzicht van het proces voor het maken van een naadloze stroomovergang.
- Sla de laatste apparaatpositie van de stream op het oude apparaat in de cache op.
- Stop de stream op het oude apparaat.
- Voer berekeningen opnieuw toe om de nieuwe positie op te halen.
- Start met het weergeven van de stream op het nieuwe apparaat.
- Laat de oude stream los.
Tijdens de overgang moet de toepassing ervoor zorgen dat de klok niet wordt gesynchroniseerd, wat resulteert in out-of-sync audio- en videostreams. Dit kan gebeuren als de videovoorbeelden blijven renderen terwijl de audiostream naar het nieuwe apparaat wordt gerouteerd. De toepassing moet de klokpositie voor de berekening voor opnieuw toewijzen in de cache opslaan en ervoor zorgen dat de videovoorbeelden pas worden weergegeven nadat de audiostream opnieuw is geopend op het nieuwe apparaat, zodat wanneer de clip weer wordt weergegeven, de audio en de videostreams worden gesynchroniseerd. In sommige gevallen, waarbij de presentatietijd voor het weergeven van de videoframes is gebaseerd op de audioklok, is het voldoende om de audiostream te stoppen totdat de stream is overgeschakeld en geen andere implementatie van positietoewijzing voor de videostream nodig is voor audiovideosynchronisatie.
Als tijdens het renderen IAudioRenderClient::GetBuffer een fout retourneert omdat het oude apparaat is verloren, hoeft de toepassing de oude stream niet te stoppen omdat de streamingbewerking al is beëindigd. Zie Herstellen van een Invalid-Device Foutvoor informatie over het afhandelen van deze fout.
Verwante onderwerpen