Condividi tramite


Ripristino da un errore di dispositivo non valido

Molti dei metodi in WASAPI restituiscono il codice di errore AUDCLNT_E_DEVICE_INVALIDATED se il dispositivo endpoint audio usato dall'applicazione client non è valido. Questo codice di errore indica che il dispositivo endpoint è stato scollegato o che l'hardware audio o le risorse hardware associate sono state riconfigurate, disabilitate, rimosse o altrimenti rese non disponibili per l'uso. Spesso, l'applicazione può recuperare da questo errore.

Nota

Per informazioni sul ripristino da errori di dispositivo non validi quando si usano le API audio spaziali (ISAC), vedere Ripristino da un errore del dispositivo non valido (audio spaziale)

La strategia che un'applicazione deve usare per eseguire il ripristino da un errore di AUDCLNT_E_DEVICE_INVALIDATED dipende dalle tecniche seguenti usate dall'applicazione per selezionare un dispositivo endpoint audio:

  • Selezionare sempre il dispositivo di rendering o acquisizione audio predefinito.
  • Selezionare un dispositivo endpoint audio specifico.

Nel secondo caso, l'applicazione seleziona automaticamente un dispositivo specifico in base ai requisiti interni oppure consente all'utente di selezionare in modo esplicito un dispositivo da un elenco di dispositivi disponibili.

Un'applicazione che usa il dispositivo predefinito può tentare di eseguire il ripristino da un errore di AUDCLNT_E_DEVICE_INVALIDATED come indicato di seguito:

  1. Rilasciare l'interfaccia IAudioClient e tutte le altre interfacce WASAPI acquisite nel dispositivo.
  2. Chiamare il metodo IMMDeviceEnumerator::GetDefaultAudioEndpoint per ottenere il dispositivo audio predefinito corrente.
  3. Tentare di attivare IAudioClient nel dispositivo audio predefinito.

Seguendo i passaggi precedenti, l'applicazione tende a rispondere in modo appropriato indipendentemente dalla causa dell'errore AUDCLNT_E_DEVICE_INVALIDATED. Se la riconfigurazione del dispositivo predefinito ha causato l'errore (ad esempio, se l'utente ha modificato il formato di flusso usato dal dispositivo), questi passaggi, se hanno esito positivo, consentono all'applicazione di continuare a usare lo stesso dispositivo. Se l'utente ha disabilitato o rimosso il dispositivo usato dall'applicazione e un altro dispositivo è disponibile per assumere il ruolo del dispositivo predefinito, l'applicazione può continuare usando il nuovo dispositivo predefinito. In entrambi i casi, l'applicazione si adatta automaticamente senza richiedere l'intervento dell'utente.

Un'applicazione che seleziona un dispositivo specifico può tentare di eseguire il ripristino dall'errore di AUDCLNT_E_DEVICE_INVALIDATED come indicato di seguito:

  1. Rilasciare l'interfaccia IAudioClient e tutte le altre interfacce WASAPI acquisite nel dispositivo.
  2. Tentare di attivare un'interfaccia IAudioClient nello stesso dispositivo.
  3. Se il passaggio 2 ha esito negativo, l'applicazione può, come opzione, richiedere all'utente di selezionare un altro dispositivo.

Il passaggio 2 può avere esito positivo se il dispositivo usato dall'applicazione è stato riconfigurato ma non disabilitato o rimosso. In caso di esito positivo, il passaggio 2 consente all'applicazione di continuare automaticamente a usare lo stesso dispositivo senza richiedere l'intervento dell'utente. Il passaggio 3 è appropriato se l'applicazione consente all'utente di selezionare in modo esplicito un altro dispositivo dopo che l'utente ha disabilitato o rimosso il dispositivo usato in precedenza.

Un'applicazione può determinare più precisamente la causa di un errore di dispositivo non valido registrando per ricevere una notifica quando una sessione perde la connessione a un dispositivo. Per abilitare questa notifica, l'applicazione implementa un'interfaccia IAudioSessionEvents e chiama il metodo IAudioSessionControl::RegisterAudioSessionNotification per registrare l'interfaccia. Quando un errore di dispositivo non valido causa la disconnessione della sessione, WASAPI chiama il metodo IAudioSessionEvents::OnSessionDisconnected nell'interfaccia registrata. Tramite questo metodo, WASAPI informa l'applicazione del motivo della disconnessione. In Windows Vista la chiamata OnSessionDisconnected identifica i motivi seguenti:

  • L'utente ha rimosso il dispositivo endpoint audio.
  • Il servizio audio di Windows è stato arrestato.
  • Il formato del flusso preferito è stato modificato per il dispositivo a cui è connessa la sessione audio.
  • L'utente ha disconnesso la sessione di Terminale Windows Services (WTS) in cui era in esecuzione la sessione audio. Per altre informazioni sulle sessioni WTS, vedere la documentazione di Windows SDK.
  • La sessione WTS in cui era in esecuzione la sessione audio è stata disconnessa.
  • La sessione audio (modalità condivisa) è stata disconnessa per rendere disponibile il dispositivo endpoint audio per una connessione in modalità esclusiva.

In risposta all'evento di disconnessione, WASAPI chiude tutti i flussi che appartengono alla sessione. Se un'applicazione tenta successivamente di accedere a un flusso chiuso tramite un metodo WASAPI, ad esempio IAudioClient::GetCurrentPadding, il metodo ha esito negativo e restituisce il codice di errore AUDCLNT_E_DEVICE_INVALIDATED.

Un vantaggio aggiuntivo per ricevere notifiche tramite l'interfaccia IAudioSessionEvents è che le notifiche arrivano in modo asincrono. Pertanto, anche quando il flusso non è in esecuzione, l'applicazione riceverà comunque una notifica tempestiva degli errori del dispositivo non validi che possono impedire l'esecuzione del flusso.

Gestione dei flussi