La versión de Android 4.1 introdujo cambios en el marco interno para una ruta de salida de audio de menor latencia . Hubo cambios mínimos en la API de cliente público o la API de HAL. Este documento describe el diseño inicial, que ha seguido evolucionando con el tiempo. Tener una buena comprensión de este diseño debería ayudar a los proveedores de SoC y OEM de dispositivos a implementar el diseño correctamente en sus dispositivos y conjuntos de chips particulares. Este artículo no está destinado a desarrolladores de aplicaciones.
Creación de pistas
El cliente puede configurar opcionalmente el bit AUDIO_OUTPUT_FLAG_FAST
en el parámetro audio_output_flags_t
del constructor AudioTrack C++ o AudioTrack::set()
. Actualmente los únicos clientes que lo hacen son:
- Audio nativo de Android basado en OpenSL ES o AAudio
- android.media.SoundPool
- android.media.ToneGenerator
La implementación de AudioTrack C++ revisa la solicitud AUDIO_OUTPUT_FLAG_FAST
y, opcionalmente, puede denegar la solicitud a nivel de cliente. Si decide pasar la solicitud, lo hace usando el bit TRACK_FAST
del parámetro track_flags_t
del método de fábrica IAudioTrack
IAudioFlinger::createTrack()
.
El servidor de audio AudioFlinger revisa la solicitud TRACK_FAST
y, opcionalmente, puede rechazar la solicitud a nivel de servidor. Informa al cliente si la solicitud fue aceptada o no, a través del bit CBLK_FAST
del bloque de control de memoria compartida.
Los factores que afectan la decisión incluyen:
- Presencia de un hilo mezclador rápido para esta salida (ver más abajo)
- Seguimiento de la frecuencia de muestreo
- Presencia de un subproceso de cliente para ejecutar controladores de devolución de llamada para esta pista
- Seguimiento del tamaño del búfer
- Ranuras de vía rápida disponibles (ver más abajo)
Si se aceptó la solicitud del cliente, se denomina "vía rápida". De lo contrario, se llama una "pista normal".
Mezclador de hilos
En el momento en que AudioFlinger crea un subproceso de mezclador normal, decide si crear o no también un subproceso de mezclador rápido. Tanto el mezclador normal como el mezclador rápido no están asociados con una pista en particular, sino con un conjunto de pistas. Siempre hay un hilo mezclador normal. El subproceso mezclador rápido, si existe, está subordinado al subproceso mezclador normal y actúa bajo su control.
Mezclador rápido
Características
El hilo mezclador rápido proporciona estas características:
- Mezcla de la submezcla del mezclador normal y hasta 7 pistas rápidas de cliente
- Atenuación por pista
Funciones omitidas:
- Conversión de frecuencia de muestreo por pista
- Efectos por pista
- Efectos por mezcla
Período
El mezclador rápido funciona periódicamente, con un período recomendado de dos a tres milisegundos (ms), o un período ligeramente mayor de cinco ms si es necesario para la estabilidad de la programación. Este número se eligió para que, teniendo en cuenta la canalización de búfer completa, la latencia total sea del orden de 10 ms. Son posibles valores más pequeños, pero pueden dar como resultado un mayor consumo de energía y la posibilidad de fallas según la previsibilidad de la programación de la CPU. Son posibles valores más grandes, hasta 20 ms, pero dan como resultado una latencia total degradada y, por lo tanto, deben evitarse.
Planificación
El mezclador rápido funciona con una prioridad SCHED_FIFO
elevada. Necesita muy poco tiempo de CPU, pero debe ejecutarse con frecuencia y con poca fluctuación de programación. Jitter expresa la variación en el tiempo de ciclo: es la diferencia entre el tiempo de ciclo real y el tiempo de ciclo esperado. Si se ejecuta demasiado tarde, se producirán fallas debido al agotamiento. Si se ejecuta demasiado pronto, se producirán fallas debido a que se sale de una pista rápida antes de que la pista haya proporcionado datos.
Bloqueo
Idealmente, el subproceso del mezclador rápido nunca se bloquea, excepto en HAL write()
. Otras ocurrencias de bloqueo dentro del mezclador rápido se consideran errores. En particular, se evitan los mutex. En su lugar, se utilizan algoritmos sin bloqueo (también conocidos como algoritmos sin bloqueo). Consulte Cómo evitar la inversión de prioridad para obtener más información sobre este tema.
Relación con otros componentes
El mezclador rápido tiene poca interacción directa con los clientes. En particular, no ve operaciones a nivel de carpeta, pero accede al bloque de control de memoria compartida del cliente.
El mezclador rápido recibe comandos del mezclador normal a través de una cola de estado.
Además de extraer datos de la pista, la interacción con los clientes se realiza a través del mezclador normal.
El sumidero principal del mezclador rápido es el HAL de audio.
Mezclador normal
Características
Todas las funciones están habilitadas:
- Hasta 32 pistas
- Atenuación por pista
- Conversión de frecuencia de muestreo por pista
- Procesamiento de efectos
Período
El período se calcula como el primer múltiplo integral del período del mezclador rápido que es >= 20 ms.
Planificación
El mezclador normal se ejecuta con una prioridad SCHED_OTHER
elevada.
Bloqueo
El mezclador normal puede bloquear, y a menudo lo hace en varios mutex, así como en una tubería de bloqueo para escribir su submezcla.
Relación con otros componentes
El mezclador normal interactúa ampliamente con el mundo exterior, incluidos los subprocesos de enlace, el administrador de políticas de audio, el subproceso del mezclador rápido y las pistas del cliente.
El fregadero de la mezcladora normal es un tubo de bloqueo a la vía 0 de la mezcladora rápida.
banderas
El bit AUDIO_OUTPUT_FLAG_FAST
es una pista. No hay garantía de que se cumplirá la solicitud.
AUDIO_OUTPUT_FLAG_FAST
es un concepto a nivel de cliente. No aparece en el servidor.
TRACK_FAST
es un concepto de cliente -> servidor.