Recuperación de un error de Invalid-Device

Muchos de los métodos de WASAPI devuelven código de error AUDCLNT_E_DEVICE_INVALIDATED si el dispositivo de punto de conexión de audio que usa la aplicación cliente deja de ser válido. Este código de error indica que el dispositivo de punto de conexión se ha desconectado o que el hardware de audio o los recursos de hardware asociados se han reconfigurado, deshabilitado, quitado o que de otro modo no están disponibles para su uso. Con frecuencia, la aplicación puede recuperarse de este error.

Nota:

Para obtener información sobre cómo recuperarse de errores de dispositivo no válidos al usar las API de audio espacial (ISAC), consulte Recuperación de un error de Invalid-Device (sonido espacial).

La estrategia que una aplicación debe usar para recuperarse de un error de AUDCLNT_E_DEVICE_INVALIDATED depende de las técnicas siguientes que usa la aplicación para seleccionar un dispositivo de punto de conexión de audio:

  • Seleccione siempre el dispositivo de representación o captura de audio predeterminado.
  • Seleccione un dispositivo de punto de conexión de audio específico.

En este último caso, la aplicación selecciona automáticamente un dispositivo específico en función de los requisitos internos o permite al usuario seleccionar explícitamente un dispositivo de una lista de dispositivos disponibles.

Una aplicación que usa el dispositivo predeterminado puede intentar recuperarse de un error de AUDCLNT_E_DEVICE_INVALIDATED de la siguiente manera:

  1. Libere la interfaz IAudioClient y cualquier otra interfaz WASAPI que haya adquirido en el dispositivo.
  2. Llame al método IMMDeviceEnumerator::GetDefaultAudioEndpoint para obtener el dispositivo de audio predeterminado actual.
  3. Intente activar IAudioClient en el dispositivo de audio predeterminado.

Siguiendo los pasos anteriores, la aplicación tiende a responder adecuadamente independientemente de la causa del error de AUDCLNT_E_DEVICE_INVALIDATED. Si la reconfiguración del dispositivo predeterminado produjo el error (por ejemplo, si el usuario cambió el formato de secuencia usado por el dispositivo), estos pasos, si se realizan correctamente, habilite la aplicación para seguir usando el mismo dispositivo. Si el usuario ha deshabilitado o quitado el dispositivo que la aplicación estaba usando y otro dispositivo está disponible para asumir el rol del dispositivo predeterminado, la aplicación puede continuar usando el nuevo dispositivo predeterminado. En cualquier caso, la aplicación se adapta automáticamente sin necesidad de intervención del usuario.

Una aplicación que selecciona un dispositivo específico puede intentar recuperarse del error AUDCLNT_E_DEVICE_INVALIDATED de la siguiente manera:

  1. Libere la interfaz IAudioClient y cualquier otra interfaz WASAPI que haya adquirido en el dispositivo.
  2. Intente activar una interfaz IAudioClient en el mismo dispositivo.
  3. Si se produce un error en el paso 2, la aplicación puede, como opción, pedir al usuario que seleccione otro dispositivo.

El paso 2 puede realizarse correctamente si el dispositivo que usa la aplicación se ha reconfigurado, pero no se ha deshabilitado o quitado. Si se ejecuta correctamente, el paso 2 permite que la aplicación continúe usando automáticamente el mismo dispositivo sin necesidad de intervención del usuario. El paso 3 es adecuado si la aplicación permite al usuario seleccionar explícitamente otro dispositivo después de que el usuario haya deshabilitado o quitado el dispositivo usado anteriormente.

Una aplicación puede determinar con más precisión la causa de un error de dispositivo no válido al registrarse para recibir una notificación cuando una sesión pierde su conexión a un dispositivo. Para habilitar esta notificación, la aplicación implementa una interfaz IAudioSessionEvents y llama al método IAudioSessionControl::RegisterAudioSessionNotification para registrar la interfaz. Cuando un error de dispositivo no válido hace que la sesión se desconecte, WASAPI llama al método IAudioSessionEvents::OnSessionDisconnected en la interfaz registrada. A través de este método, WASAPI informa a la aplicación del motivo de la desconexión. En Windows Vista, la llamada OnSessionDisconnected identifica los siguientes motivos:

  • El usuario quitó el dispositivo de punto de conexión de audio.
  • El servicio de audio de Windows se ha apagado.
  • El formato de secuencia preferido ha cambiado para el dispositivo al que está conectada la sesión de audio.
  • El usuario ha cerrado la sesión de Terminal Windows Services (WTS) en la que se estaba ejecutando la sesión de audio. Para obtener más información sobre las sesiones WTS, consulte la documentación de Windows SDK.
  • La sesión WTS en la que se estaba ejecutando la sesión de audio estaba desconectada.
  • La sesión de audio (modo compartido) se desconecta para que el dispositivo de punto de conexión de audio esté disponible para una conexión en modo exclusivo.

En respuesta al evento de desconexión, WASAPI cierra todas las secuencias que pertenecen a la sesión. Si una aplicación intenta obtener acceso posteriormente a una secuencia cerrada a través de un método WASAPI como IAudioClient::GetCurrentPadding, el método produce un error y devuelve el código de error AUDCLNT_E_DEVICE_INVALIDATED.

Una ventaja adicional para recibir notificaciones a través de la interfaz IAudioSessionEvents es que las notificaciones llegan de forma asincrónica. Por lo tanto, incluso cuando la secuencia no se está ejecutando, la aplicación seguirá recibiendo una notificación oportuna de errores de dispositivo no válidos que pueden impedir que la secuencia se ejecute.

Administración de flujos