Compartir a través de


Consideraciones sobre la implementación del enrutamiento de flujos

En Windows 7, las API de plataforma de alto nivel que usan core Audio API, como Media Foundation, DirectSound y Wave API, implementan la característica de enrutamiento de secuencias controlando el cambio de flujo de un dispositivo existente a un nuevo punto de conexión de audio predeterminado. Las aplicaciones multimedia que usan estas API usan el comportamiento de enrutamiento de secuencias sin modificaciones en el origen. Los clientes WASAPI directos pueden usar las notificaciones enviadas por los componentes de Core Audio e implementar la característica de enrutamiento de secuencias.

Los clientes WASAPI directos (aplicaciones multimedia que usan WASAPI directamente) reciben nuevas notificaciones de sesión de audio y dispositivo enviadas por los componentes de Core Audio. El comportamiento de la característica de enrutamiento de flujos se define mediante la forma en que la aplicación controla estas notificaciones.

MMDevice API y la sesión de audio envían notificaciones sobre los cambios de estado del dispositivo y los cambios de sesión en los clientes WASAPI en forma de devoluciones de llamada. Para obtener estas notificaciones, el cliente debe registrar su implementación de IMMNotificationClient e IAudioSessionEvents. Para obtener más información, consulte Notificaciones relevantes para el enrutamiento de flujos.

En el escenario de auriculares USB descrito en Enrutamiento de secuencias, una aplicación está reproduciendo una secuencia de audio y usa MMDeviceAPI y WASAPI para representar la secuencia en el dispositivo de representación predeterminado, Speaker. Cuando se cambia el dispositivo predeterminado, la aplicación recibe una notificación IMMNotificationClient . La aplicación también recibe notificaciones IAudioSessionEvents que indican que el usuario quitó el dispositivo de punto de conexión de audio o que el formato de secuencia cambió para el dispositivo al que está conectada la sesión de audio. Al recibir las notificaciones, la aplicación detiene el streaming al punto de conexión del altavoz y vuelve a abrir la secuencia para representarla en el punto de conexión predeterminado actual, el casco.

diagrama del flujo de datos para las notificaciones de dispositivo.

En respuesta a estas notificaciones, el cliente podría volver a abrir la secuencia en el nuevo dispositivo predeterminado en el nuevo formato seleccionado por el usuario.

Administración de flujos

En la lista siguiente se resumen los pasos que debe realizar un cliente WASAPI para proporcionar la funcionalidad de conmutación de flujos.

  1. Espere a la notificación IMMNotificationClient correspondiente. Si el dispositivo es el dispositivo predeterminado, se recibe la notificación IMMNotificationClient::OnDefaultDeviceChanged .

  2. Si hay un nuevo dispositivo disponible, obtenga una referencia al punto de conexión del nuevo dispositivo. Llame a IMMDeviceEnumerator::GetDefaultAudioEndpoint para el nuevo dispositivo predeterminado. Si el nuevo dispositivo no es el dispositivo predeterminado, puede recuperarlo llamando a IMMDeviceEnumerator::GetDevice. Para obtener más información, consulte Obtención del punto de conexión de dispositivo para el enrutamiento de flujos.

  3. Espere a que IAudioSessionEvents::OnSessionDisconnected con el valor de motivo.

    Nota

    Dado que todas estas operaciones son asincrónicas, no se puede predecir el orden en que la aplicación recibe notificaciones de cambio de dispositivo y desconexión de sesión. La aplicación debe implementar el control de notificaciones para recibir estas notificaciones en cualquier orden. Sin embargo, normalmente, la aplicación recibe el valor AudioSessionDisconnect antes de la notificación de cambio de dispositivo predeterminada.

     

  4. Evalúe el valor de motivo y determine si la secuencia debe transferirse a otro punto de conexión de audio o la secuencia debe reinicializarse con un nuevo formato.

  5. Detenga el streaming al dispositivo predeterminado anterior si el motivo indica que la secuencia se debe volver a enrutar al nuevo dispositivo predeterminado.

  6. Realizar cálculos de asignación de posición.

  7. Abra la secuencia en el nuevo dispositivo y transfiera toda la información de estado.

  8. Reanude el streaming en el nuevo dispositivo predeterminado.

  9. Controle la salida del dispositivo predeterminado anterior.

Para que la operación de conmutación de flujos aparezca sin problemas, debe realizarse lo antes posible. Esto depende del rendimiento de los componentes implicados en el re-iniciación de la secuencia en el nuevo dispositivo.

Consideraciones sobre la asignación de posición

Cuando la aplicación obtiene notificaciones IMMNotificationClient e IAudioSessionEvents , puede enrutar las secuencias existentes al nuevo dispositivo predeterminado. Cuando se interrumpe una secuencia de audio existente y se abre en el nuevo dispositivo, la representación en el nuevo dispositivo debe comenzar en la posición en la que se detuvo la secuencia en el dispositivo anterior. Para ello, la aplicación debe tener la última posición de dispositivo conocida para calcular la posición inicial en el nuevo dispositivo. Por ejemplo, esta posición se puede usar como desplazamiento diferencial para la asignación de posición posterior. Cuando la secuencia comienza a representarse, la nueva posición del dispositivo se puede reasignar a la posición del dispositivo almacenado en caché.

En los pasos siguientes se resume el proceso de realizar una transición de flujo sin problemas.

  1. Almacene en caché la última posición del dispositivo de la secuencia en el dispositivo anterior.
  2. Detenga la secuencia en el dispositivo antiguo.
  3. Realice cálculos de reasignación para obtener la nueva posición.
  4. Inicie la representación de la secuencia en el nuevo dispositivo.
  5. Libere la secuencia anterior.

Durante la transición, la aplicación debe asegurarse de que el reloj no salga de la sincronización, lo que da lugar a secuencias de audio y vídeo fuera de sincronización. Esto puede ocurrir si los ejemplos de vídeo continúan representando mientras la secuencia de audio se enruta al nuevo dispositivo. La aplicación debe almacenar en caché la posición del reloj para el cálculo de reasignación y asegurarse de que las muestras de vídeo no se representan hasta que se vuelva a abrir la secuencia de audio en el nuevo dispositivo, de modo que cuando el clip reanude la representación, se sincronicen el audio y las secuencias de vídeo. En algunos casos, cuando el tiempo de presentación para representar los fotogramas de vídeo se basa en el reloj de audio, es suficiente detener la secuencia de audio hasta que se complete el cambio de secuencia y no se necesite ninguna otra implementación de asignación de posición para la secuencia de vídeo para la sincronización de vídeo de audio.

Si se representa, IAudioRenderClient::GetBuffer devuelve un error porque se pierde el dispositivo antiguo, la aplicación no necesita detener la secuencia antigua porque la operación de streaming ya ha finalizado. Para obtener información sobre cómo controlar este error, consulte Recuperación de un error de Invalid-Device.

Acerca de MMDevice API

Acerca de WASAPI

Enrutamiento de flujos