Het herstel van een Invalid-Device-fout
Veel van de methoden in WASAPI retourneren foutcode AUDCLNT_E_DEVICE_INVALIDATED als het audio-eindpuntapparaat dat door de clienttoepassing wordt gebruikt, ongeldig wordt. Deze foutcode geeft aan dat het eindpuntapparaat is losgekoppeld of dat de audiohardware of bijbehorende hardwareresources opnieuw zijn geconfigureerd, uitgeschakeld, verwijderd of anderszins niet beschikbaar zijn gemaakt voor gebruik. Vaak kan de toepassing herstellen na deze fout.
Notitie
Zie Herstellen van een Invalid-Device Error (Spatial Sound) voor informatie over het herstellen van ongeldige apparaatfouten bij het gebruik van API's voor ruimtelijke audio (ISAC)
De strategie die een toepassing moet gebruiken om te herstellen van een AUDCLNT_E_DEVICE_INVALIDATED fout, is afhankelijk van welke van de volgende technieken de toepassing gebruikt om een audio-eindpuntapparaat te selecteren:
- Selecteer altijd het standaardapparaat voor audiorendering of -opname.
- Selecteer een specifiek audio-eindpuntapparaat.
In het laatste geval selecteert de toepassing automatisch een specifiek apparaat op basis van interne vereisten of kan de gebruiker expliciet een apparaat selecteren in een lijst met beschikbare apparaten.
Een toepassing die gebruikmaakt van het standaardapparaat kan als volgt proberen te herstellen van een AUDCLNT_E_DEVICE_INVALIDATED fout:
- Laat de IAudioClient interface en eventuele andere WASAPI-interfaces los die op het apparaat zijn verkregen.
- Roep de IMMDeviceEnumerator::GetDefaultAudioEndpoint methode aan om het huidige standaardaudioapparaat op te halen.
- Probeer IAudioClient- te activeren op het standaardaudioapparaat.
Door de voorgaande stappen te volgen, reageert de toepassing meestal op de juiste manier, ongeacht de oorzaak van de AUDCLNT_E_DEVICE_INVALIDATED fout. Als de herconfiguratie van het standaardapparaat de fout heeft veroorzaakt (bijvoorbeeld als de gebruiker de stroomindeling heeft gewijzigd die door het apparaat wordt gebruikt), kunnen deze stappen, als ze slagen, de toepassing inschakelen om hetzelfde apparaat te blijven gebruiken. Als de gebruiker het apparaat dat de toepassing gebruikte heeft uitgeschakeld of verwijderd en een ander apparaat beschikbaar is om de rol van het standaardapparaat aan te nemen, kan de toepassing doorgaan met het nieuwe standaardapparaat. In beide gevallen past de toepassing zich automatisch aan zonder tussenkomst van de gebruiker.
Een toepassing die een specifiek apparaat selecteert, kan als volgt proberen te herstellen van de AUDCLNT_E_DEVICE_INVALIDATED-fout:
- Laat de IAudioClient interface en eventuele andere WASAPI-interfaces los die op het apparaat zijn verkregen.
- Probeer een IAudioClient interface op hetzelfde apparaat te activeren.
- Als stap 2 mislukt, kan de toepassing de gebruiker als optie vragen een ander apparaat te selecteren.
Stap 2 kan slagen als het apparaat dat wordt gebruikt door de toepassing opnieuw is geconfigureerd, maar niet is uitgeschakeld of verwijderd. Als dit lukt, kan de toepassing met stap 2 automatisch hetzelfde apparaat blijven gebruiken zonder tussenkomst van de gebruiker. Stap 3 is geschikt als de toepassing de gebruiker toestaat expliciet een ander apparaat te selecteren nadat de gebruiker het eerder gebruikte apparaat heeft uitgeschakeld of verwijderd.
Een toepassing kan nauwkeuriger de oorzaak van een fout met een ongeldig apparaat bepalen door zich te registreren om een melding te ontvangen wanneer een sessie de verbinding met een apparaat verliest. Om deze melding in te schakelen, implementeert de toepassing een IAudioSessionEvents interface en roept de IAudioSessionControl::RegisterAudioSessionNotification methode aan om de interface te registreren. Wanneer een fout met een ongeldig apparaat ertoe leidt dat de sessie wordt verbroken, roept WASAPI de IAudioSessionEvents::OnSessionDisconnected methode aan in de geregistreerde interface. Via deze methode informeert WASAPI de toepassing van de reden voor de verbroken verbinding. In Windows Vista identificeert de OnSessionDisconnected aanroep de volgende redenen:
- De gebruiker heeft het audio-eindpuntapparaat verwijderd.
- De Windows-audioservice is afgesloten.
- De voorkeursstroomindeling is gewijzigd voor het apparaat waarmee de audiosessie is verbonden.
- De gebruiker heeft de Windows Terminal Services-sessie (WTS) afgemeld waarin de audiosessie werd uitgevoerd. Zie de Windows SDK-documentatie voor meer informatie over WTS-sessies.
- De WTS-sessie waarin de audiosessie werd uitgevoerd, is ontkoppeld.
- De audiosessie (gedeelde modus) is verbroken om het audio-eindpuntapparaat beschikbaar te maken voor een exclusieve-modusverbinding.
Als reactie op de verbindingsverbreking sluit WASAPI alle streams die tot de sessie behoren. Als een toepassing vervolgens probeert toegang te krijgen tot een gesloten stroom via een WASAPI-methode, zoals IAudioClient::GetCurrentPadding, mislukt de methode en retourneert de foutcode AUDCLNT_E_DEVICE_INVALIDATED.
Een extra voordeel van het ontvangen van meldingen via de IAudioSessionEvents interface is dat de meldingen asynchroon binnenkomen. Zelfs wanneer de stream niet wordt uitgevoerd, ontvangt de toepassing nog steeds tijdig een melding van fouten met ongeldige apparaten die kunnen voorkomen dat de stream wordt uitgevoerd.
Verwante onderwerpen