Udostępnij za pośrednictwem


Odzyskiwanie po błędzie Invalid-Device

Wiele metod w WASAPI zwraca kod błędu AUDCLNT_E_DEVICE_INVALIDATED, jeśli urządzenie punktu końcowego audio używane przez aplikację kliencką stanie się nieważne. Ten kod błędu wskazuje, że urządzenie punktu końcowego zostało odłączone lub że sprzęt audio lub skojarzone zasoby sprzętowe zostały ponownie skonfigurowane, wyłączone, usunięte lub w inny sposób niedostępne. Często aplikacja może odzyskać dane po tym błędzie.

Notatka

Aby uzyskać informacje na temat odzyskiwania z błędów nieprawidłowych urządzeń podczas korzystania z API dźwięku przestrzennego (ISAC), zobacz Odzyskiwanie z błędu Invalid-Device (Dźwięk Przestrzenny)

Strategia, którą aplikacja powinna stosować do odzyskiwania po błędzie AUDCLNT_E_DEVICE_INVALIDATED, zależy od technik, za pomocą których aplikacja wybiera urządzenie punktu końcowego audio:

  • Zawsze wybieraj domyślne dźwiękowe urządzenie wyjściowe lub wejściowe.
  • Wybierz określone urządzenie punktu końcowego audio.

W tym ostatnim przypadku aplikacja automatycznie wybiera określone urządzenie na podstawie wymagań wewnętrznych lub umożliwia użytkownikowi jawne wybranie urządzenia z listy dostępnych urządzeń.

Aplikacja korzystająca z urządzenia domyślnego może spróbować odzyskać się po błędzie AUDCLNT_E_DEVICE_INVALIDATED w następujący sposób:

  1. Zwolnij interfejs IAudioClient oraz wszystkie inne interfejsy WASAPI uzyskane przez urządzenie.
  2. Wywołaj metodę IMMDeviceEnumerator::GetDefaultAudioEndpoint, aby pobrać bieżące domyślne urządzenie audio.
  3. Spróbuj aktywować IAudioClient na domyślnym urządzeniu audio.

Wykonując powyższe kroki, aplikacja ma tendencję do odpowiedniego reagowania niezależnie od przyczyny błędu AUDCLNT_E_DEVICE_INVALIDATED. Jeśli ponowna konfiguracja urządzenia domyślnego spowodowała błąd (na przykład jeśli użytkownik zmienił format strumienia używany przez urządzenie), to te kroki, jeśli się powiodą, umożliwiają aplikacji dalsze korzystanie z tego samego urządzenia. Jeśli użytkownik wyłączył lub usunął urządzenie używane przez aplikację, a inne urządzenie jest dostępne do objęcia roli domyślnego urządzenia, aplikacja może kontynuować korzystanie z nowego urządzenia domyślnego. W obu przypadkach aplikacja dostosowuje się automatycznie bez konieczności interwencji użytkownika.

W następujący sposób aplikacja, która wybiera określone urządzenie, może podjąć próbę naprawy błędu AUDCLNT_E_DEVICE_INVALIDATED:

  1. Zwolnij interfejs IAudioClient i wszystkie inne interfejsy WASAPI uzyskane na urządzeniu.
  2. Spróbuj aktywować interfejs IAudioClient na tym samym urządzeniu.
  3. Jeśli krok 2 zakończy się niepowodzeniem, aplikacja może w ramach opcji monitować użytkownika o wybranie innego urządzenia.

Krok 2 może zakończyć się powodzeniem, jeśli urządzenie używane przez aplikację zostało ponownie skonfigurowane, ale nie zostało wyłączone lub usunięte. Jeśli działanie powiedzie się, krok 2 umożliwia aplikacji automatyczne korzystanie z tego samego urządzenia bez konieczności interwencji użytkownika. Krok 3 jest odpowiedni, jeśli aplikacja umożliwia użytkownikowi jawne wybranie innego urządzenia po wyłączeniu lub usunięciu wcześniej używanego urządzenia.

Aplikacja może dokładniej ustalić przyczynę błędu dotyczącego nieprawidłowego urządzenia, rejestrując się do otrzymywania powiadomień, gdy utracone zostanie połączenie z urządzeniem w trakcie sesji. Aby włączyć to powiadomienie, aplikacja implementuje interfejs IAudioSessionEvents i wywołuje metodę IAudioSessionControl::RegisterAudioSessionNotification w celu zarejestrowania interfejsu. Gdy błąd nieprawidłowego urządzenia powoduje rozłączenie sesji, interfejs WASAPI wywołuje metodę IAudioSessionEvents::OnSessionDisconnected w zarejestrowanym interfejsie. Za pomocą tej metody interfejs WASAPI informuje aplikację o przyczynie rozłączenia. W systemie Windows Vista wywołanie OnSessionDisconnected identyfikuje następujące przyczyny:

  • Użytkownik usunął urządzenie punktu końcowego audio.
  • Usługa audio systemu Windows została zamknięta.
  • Preferowany format strumienia został zmieniony dla urządzenia, z którymi jest połączona sesja audio.
  • Użytkownik wylogował się z sesji usług terminalowych systemu Windows (WTS), w których była uruchomiona sesja dźwiękowa. Aby uzyskać więcej informacji na temat sesji usług WTS, zobacz dokumentację zestawu Windows SDK.
  • Sesja usługi WTS, w ramach którego uruchomiono sesję audio, została rozłączona.
  • Sesja audio (tryb udostępniony) została rozłączona, aby urządzenie punktu końcowego audio było dostępne dla połączenia w trybie wyłącznym.

W odpowiedzi na zdarzenie rozłączenia WASAPI zamyka wszystkie strumienie należące do sesji. Jeśli następnie aplikacja próbuje uzyskać dostęp do zamkniętego strumienia za pośrednictwem metody WASAPI, takiej jak IAudioClient::GetCurrentPadding, metoda kończy się niepowodzeniem i zwraca kod błędu AUDCLNT_E_DEVICE_INVALIDATED.

Dodatkową korzyścią dla otrzymywania powiadomień za pośrednictwem interfejsu IAudioSessionEvents jest to, że powiadomienia docierają asynchronicznie. W związku z tym nawet wtedy, gdy strumień nie jest uruchomiony, aplikacja nadal będzie otrzymywać powiadomienie o błędach nieprawidłowych urządzeń, które mogą uniemożliwić uruchomienie strumienia.

Zarządzanie strumieniami