Wiederherstellen nach einem Invalid-Device Fehler

Viele der Methoden in WASAPI geben Fehlercode AUDCLNT_E_DEVICE_INVALIDATED zurück, wenn das Audioendpunktgerät, das die Clientanwendung verwendet, ungültig wird. Dieser Fehlercode gibt an, dass das Endpunktgerät nicht angeschlossen wurde oder dass die Audiohardware oder die zugehörigen Hardwareressourcen neu konfiguriert, deaktiviert, entfernt oder anderweitig für die Verwendung nicht verfügbar gemacht wurden. Häufig kann die Anwendung diesen Fehler wiederherstellen.

Hinweis

Informationen zur Wiederherstellung nach ungültigen Gerätefehlern bei Verwendung von Räumlichen Audio-APIs (ISAC) finden Sie unter Wiederherstellen von Invalid-Device Error (Spatial Sound)

Die Strategie, die eine Anwendung zum Wiederherstellen eines AUDCLNT_E_DEVICE_INVALIDATED-Fehlers verwenden sollte, hängt davon ab, welche der folgenden Techniken die Anwendung verwendet, um ein Audioendpunktgerät auszuwählen:

  • Wählen Sie immer das Standard-Audiorendering- oder Aufnahmegerät aus.
  • Wählen Sie ein bestimmtes Audioendpunktgerät aus.

Im letzteren Fall wählt die Anwendung entweder automatisch ein bestimmtes Gerät basierend auf internen Anforderungen aus oder ermöglicht es dem Benutzer, ein Gerät explizit aus einer Liste der verfügbaren Geräte auszuwählen.

Eine Anwendung, die das Standardgerät verwendet, kann versuchen, nach einem AUDCLNT_E_DEVICE_INVALIDATED Fehler wie folgt wiederherzustellen:

  1. Geben Sie die IAudioClient-Schnittstelle und alle anderen WASAPI-Schnittstellen frei, die sie auf dem Gerät erworben hat.
  2. Rufen Sie die IMMDeviceEnumerator::GetDefaultAudioEndpoint-Methode auf, um das aktuelle Standardaudiogerät abzurufen.
  3. Versuchen Sie, IAudioClient auf dem Standardaudiogerät zu aktivieren.

Wenn Sie die vorherigen Schritte ausführen, reagiert die Anwendung in der Regel entsprechend, unabhängig von der Ursache des AUDCLNT_E_DEVICE_INVALIDATED Fehlers. Wenn die Neukonfiguration des Standardgeräts den Fehler verursacht hat (z. B. wenn der Benutzer das vom Gerät verwendete Streamformat geändert hat), können diese Schritte, falls sie erfolgreich sind, der Anwendung ermöglichen, weiterhin dasselbe Gerät zu verwenden. Wenn der Benutzer das von der Anwendung verwendete Gerät deaktiviert oder entfernt hat und ein anderes Gerät verfügbar ist, um die Rolle des Standardgeräts zu übernehmen, kann die Anwendung mit dem neuen Standardgerät fortfahren. In beiden Fällen passt sich die Anwendung automatisch an, ohne dass der Benutzer eingreifen muss.

Eine Anwendung, die ein bestimmtes Gerät auswählt, kann versuchen, nach dem AUDCLNT_E_DEVICE_INVALIDATED Fehler wie folgt wiederherzustellen:

  1. Geben Sie die IAudioClient-Schnittstelle und alle anderen WASAPI-Schnittstellen frei, die sie auf dem Gerät erworben hat.
  2. Versuchen Sie, eine IAudioClient-Schnittstelle auf demselben Gerät zu aktivieren.
  3. Wenn Schritt 2 fehlschlägt, kann die Anwendung den Benutzer optional auffordern, ein anderes Gerät auszuwählen.

Schritt 2 kann erfolgreich sein, wenn das von der Anwendung verwendete Gerät neu konfiguriert, aber nicht deaktiviert oder entfernt wurde. Bei erfolgreicher Ausführung ermöglicht Schritt 2 der Anwendung, dasselbe Gerät automatisch weiter zu verwenden, ohne dass der Benutzer eingreifen muss. Schritt 3 ist geeignet, wenn die Anwendung es dem Benutzer ermöglicht, explizit ein anderes Gerät auszuwählen, nachdem der Benutzer das zuvor verwendete Gerät deaktiviert oder entfernt hat.

Eine Anwendung kann die Ursache eines Fehlers mit ungültigem Gerät genauer ermitteln, indem sie sich registriert, um eine Benachrichtigung zu erhalten, wenn eine Sitzung ihre Verbindung mit einem Gerät verliert. Um diese Benachrichtigung zu aktivieren, implementiert die Anwendung eine IAudioSessionEvents-Schnittstelle und ruft die IAudioSessionControl::RegisterAudioSessionNotification-Methode auf, um die Schnittstelle zu registrieren. Wenn ein Invalid-Device-Fehler dazu führt, dass die Sitzung getrennt wird, ruft WASAPI die IAudioSessionEvents::OnSessionDisconnected-Methode in der registrierten Schnittstelle auf. Mit dieser Methode informiert WASAPI die Anwendung über den Grund für die Trennung. In Windows Vista identifiziert der OnSessionDisconnected-Aufruf die folgenden Gründe:

  • Der Benutzer hat das Audioendpunktgerät entfernt.
  • Der Windows-Audiodienst wurde heruntergefahren.
  • Das bevorzugte Streamformat wurde für das Gerät geändert, mit dem die Audiositzung verbunden ist.
  • Der Benutzer hat die Windows-Terminal Services-Sitzung (WTS) abgemeldet, in der die Audiositzung ausgeführt wurde. Weitere Informationen zu WTS-Sitzungen finden Sie in der Dokumentation zum Windows SDK.
  • Die WTS-Sitzung, in der die Audiositzung ausgeführt wurde, wurde getrennt.
  • Die Audiositzung im freigegebenen Modus wurde getrennt, um das Audioendpunktgerät für eine Verbindung im exklusiven Modus verfügbar zu machen.

Als Reaktion auf das Trennungsereignis schließt WASAPI alle Streams, die zur Sitzung gehören. Wenn eine Anwendung anschließend versucht, über eine WASAPI-Methode wie IAudioClient::GetCurrentPadding auf einen geschlossenen Stream zuzugreifen, schlägt die Methode fehl und gibt Fehlercode AUDCLNT_E_DEVICE_INVALIDATED zurück.

Ein weiterer Vorteil beim Empfangen von Benachrichtigungen über die IAudioSessionEvents-Schnittstelle ist, dass die Benachrichtigungen asynchron eingehen. Daher erhält die Anwendung auch dann, wenn der Stream nicht ausgeführt wird, eine rechtzeitige Benachrichtigung über Fehler mit ungültigen Geräten, die die Ausführung des Datenstroms verhindern können.

Streamverwaltung