Recuperando-se de um erro de dispositivo inválido
Muitos dos métodos no WASAPI retornam o código de erro AUDCLNT_E_DEVICE_INVALIDATED se o dispositivo de ponto de extremidade de áudio que o aplicativo cliente está usando se tornar inválido. Esse código de erro indica que o dispositivo de ponto de extremidade foi desconectado ou que o hardware de áudio ou os recursos de hardware associados foram reconfigurados, desabilitados, removidos ou indisponíveis para uso. Frequentemente, o aplicativo pode se recuperar desse erro.
Observação
Para obter informações sobre como recuperar de erros de dispositivo inválidos ao usar APIs de áudio espacial (ISAC), consulte Recuperando-se de um erro de dispositivo inválido (som espacial)
A estratégia que um aplicativo deve usar para se recuperar de um erro de AUDCLNT_E_DEVICE_INVALIDATED depende de qual das seguintes técnicas o aplicativo usa para selecionar um dispositivo de ponto de extremidade de áudio:
- Sempre selecione o dispositivo de renderização ou captura de áudio padrão.
- Selecione um dispositivo de ponto de extremidade de áudio específico.
Neste último caso, o aplicativo seleciona automaticamente um dispositivo específico com base em requisitos internos ou permite que o usuário selecione explicitamente um dispositivo de uma lista de dispositivos disponíveis.
Um aplicativo que usa o dispositivo padrão pode tentar se recuperar de um erro de AUDCLNT_E_DEVICE_INVALIDATED da seguinte maneira:
- Libere a interface IAudioClient e quaisquer outras interfaces WASAPI que ele adquiriu no dispositivo.
- Chame o método IMMDeviceEnumerator::GetDefaultAudioEndpoint para obter o dispositivo de áudio padrão atual.
- Tente ativar IAudioClient no dispositivo de áudio padrão.
Seguindo as etapas anteriores, o aplicativo tende a responder apropriadamente, independentemente da causa do erro AUDCLNT_E_DEVICE_INVALIDATED. Se a reconfiguração do dispositivo padrão causou o erro (por exemplo, se o usuário alterou o formato de fluxo usado pelo dispositivo), essas etapas, se forem bem-sucedidas, permitirão que o aplicativo continue a usar o mesmo dispositivo. Se o usuário desabilitou ou removeu o dispositivo que o aplicativo estava usando e outro dispositivo está disponível para assumir a função de dispositivo padrão, o aplicativo pode continuar usando o novo dispositivo padrão. Em ambos os casos, o aplicativo se adapta automaticamente sem a necessidade de intervenção do usuário.
Um aplicativo que seleciona um dispositivo específico pode tentar se recuperar do erro de AUDCLNT_E_DEVICE_INVALIDATED da seguinte maneira:
- Libere a interface IAudioClient e quaisquer outras interfaces WASAPI que ele adquiriu no dispositivo.
- Tente ativar uma interface IAudioClient no mesmo dispositivo.
- Se a etapa 2 falhar, o aplicativo pode, como opção, solicitar que o usuário selecione outro dispositivo.
A etapa 2 pode ser bem-sucedida se o dispositivo que está sendo usado pelo aplicativo foi reconfigurado, mas não desabilitado ou removido. Se for bem-sucedida, a etapa 2 permite que o aplicativo continue a usar automaticamente o mesmo dispositivo sem exigir a intervenção do usuário. A etapa 3 será apropriada se o aplicativo permitir que o usuário selecione explicitamente outro dispositivo depois que o usuário tiver desabilitado ou removido o dispositivo usado anteriormente.
Um aplicativo pode determinar com mais precisão a causa de um erro de dispositivo inválido registrando-se para receber uma notificação quando uma sessão perde sua conexão com um dispositivo. Para habilitar essa notificação, o aplicativo implementa uma interface IAudioSessionEvents e chama o método IAudioSessionControl::RegisterAudioSessionNotification para registrar a interface. Quando um erro de dispositivo inválido faz com que a sessão seja desconectada, WASAPI chama o método IAudioSessionEvents::OnSessionDisconnected na interface registrada. Através deste método, o WASAPI informa a aplicação do motivo da desconexão. No Windows Vista, a chamada OnSessionDisconnected identifica os seguintes motivos:
- O usuário removeu o dispositivo de ponto de extremidade de áudio.
- O serviço de áudio do Windows foi desligado.
- O formato de fluxo preferencial foi alterado para o dispositivo ao qual a sessão de áudio está conectada.
- O usuário fez logoff da sessão dos Serviços de Terminal do Windows (WTS) em que a sessão de áudio estava sendo executada. Para obter mais informações sobre sessões WTS, consulte a documentação do SDK do Windows.
- A sessão WTS em que a sessão de áudio estava sendo executada foi desconectada.
- A sessão de áudio (modo compartilhado) foi desconectada para disponibilizar o dispositivo de ponto de extremidade de áudio para uma conexão de modo exclusivo.
Em resposta ao evento de desconexão, o WASAPI fecha todos os fluxos que pertencem à sessão. Se, subsequentemente, um aplicativo tentar acessar um fluxo fechado por meio de um método WASAPI, como IAudioClient::GetCurrentPadding, o método falhará e retornará o código de erro AUDCLNT_E_DEVICE_INVALIDATED.
Um benefício adicional de receber notificações por meio da interface IAudioSessionEvents é que as notificações chegam de forma assíncrona. Assim, mesmo quando o fluxo não estiver em execução, o aplicativo ainda receberá notificação oportuna de erros de dispositivo inválido que podem impedir a execução do fluxo.
Tópicos relacionados