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 del cliente público o en la API 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 dispositivos OEM y SoC 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
Opcionalmente, el cliente puede configurar 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 utilizando 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 del 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 impactan la decisión incluyen:
- Presencia de un hilo mezclador rápido para esta salida (ver más abajo)
- Frecuencia de muestreo de seguimiento
- Presencia de un hilo de cliente para ejecutar controladores de devolución de llamada para esta pista
- Tamaño del búfer de seguimiento
- Ranuras de acceso rápido disponibles (ver más abajo)
Si la solicitud del cliente fue aceptada, se denomina "vía rápida". De lo contrario, se llama "pista normal".
Hilos mezcladores
En el momento en que AudioFlinger crea un hilo de mezclador normal, decide si crear también un hilo de mezclador rápido o no. Tanto el mezclador normal como el mezclador rápido no están asociados a una pista en particular, sino a un conjunto de pistas. Siempre hay un hilo mezclador normal. El hilo mezclador rápido, si existe, está subordinado al hilo mezclador normal y actúa bajo su control.
batidora rapida
Características
El hilo mezclador rápido proporciona estas características:
- Mezcla de la submezcla del mezclador normal y hasta 7 pistas rápidas del cliente
- Atenuación por pista
Características omitidas:
- Conversión de frecuencia de muestreo por pista
- Efectos por pista
- Efectos por mezcla
Período
El mezclador rápido se ejecuta periódicamente, con un período recomendado de dos a tres milisegundos (ms), o un período ligeramente superior de cinco ms si es necesario para la estabilidad de la programación. Este número se eligió de modo que, teniendo en cuenta toda la canalización del búfer, la latencia total sea del orden de 10 ms. Son posibles valores más pequeños, pero pueden provocar un mayor consumo de energía y posibilidades de fallos dependiendo de la previsibilidad de la programación de la CPU. Son posibles valores mayores, hasta 20 ms, pero dan como resultado una latencia total degradada y, por lo tanto, deben evitarse.
Planificación
El mezclador rápido se ejecuta 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 del ciclo: es la diferencia entre el tiempo del ciclo real versus el tiempo del ciclo esperado. Si se ejecuta demasiado tarde, se producirán fallos debido a una insuficiencia de datos. Correr demasiado pronto resultará en 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()
. Otros casos 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 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 sí 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 audio HAL.
batidora 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
Al mezclador normal se le permite 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 carpeta, el administrador de políticas de audio, el subproceso del mezclador rápido y las pistas del cliente.
El fregadero del mezclador normal es un tubo de bloqueo de la vía 0 del mezclador rápido.
Banderas
El bit AUDIO_OUTPUT_FLAG_FAST
es una pista. No hay garantía de que se cumpla 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.