Los proveedores pueden implementar dos funciones clave para reducir la latencia de audio:
- FAST Mixer en AudioFlinger: Esta función, que se introdujo en Android 4.1, admite apps que usan Java AudioTrack y AAudio. El mezclador de FAST implica cambios mínimos en la API pública del cliente o en la API de HAL.
- AAudio MMAP: Esta función, que se introdujo en Android 8.1, permite que las apps nativas logren una latencia aún más baja a través de AAudio. Consulta AAudio y MMAP para obtener más información.
En esta página, se describe el diseño inicial de la latencia de audio, que siguió evolucionando con el tiempo. Es fundamental que los OEM de dispositivos y los proveedores de SoC comprendan bien este diseño para garantizar una implementación correcta en sus dispositivos y chipsets específicos. Esta página no está destinada a los desarrolladores de apps.
Creación de segmentos
De manera opcional, el cliente puede establecer el bit AUDIO_OUTPUT_FLAG_FAST
en el parámetro audio_output_flags_t
del constructor de AudioTrack en C++ o AudioTrack::set()
. Actualmente, los únicos clientes que lo hacen son los siguientes:
- Audio nativo de Android basado en OpenSL ES o AAudio
android.media.SoundPool
android.media.ToneGenerator
La implementación en C++ de AudioTrack revisa la solicitud AUDIO_OUTPUT_FLAG_FAST
y puede rechazarla de forma opcional a nivel del cliente. Si decide pasar la solicitud, lo hace con 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, de manera opcional, puede rechazarla a nivel del servidor. Informa al cliente si se aceptó o no la solicitud a través del bit CBLK_FAST
del bloque de control de memoria compartida.
Entre los factores que influyen en la decisión, se incluyen los siguientes:
- Presencia de un subproceso de mezclador rápido para esta salida (consulta a continuación)
- Tasa de muestreo de la pista
- Presencia de un subproceso del cliente para ejecutar controladores de devolución de llamada para este segmento
- Tamaño del búfer de seguimiento
- Ranuras disponibles para la vía rápida (consulta la información a continuación)
Si se acepta la solicitud del cliente, se denomina vía rápida. De lo contrario, se denomina pista normal.
Tornillos de mezclador
En el momento en que AudioFlinger crea un subproceso de mezclador normal, decide si también crea un subproceso de mezclador rápido. Tanto el mezclador normal como el rápido no se asocian con una pista en particular, sino con un conjunto de pistas. Siempre hay un subproceso de mezclador normal. El subproceso del mezclador rápido, si existe, está subordinado al subproceso del mezclador normal y actúa bajo su control.
Mezclador rápido
Funciones
El subproceso del mezclador rápido proporciona estas funciones:
- Mezcla de la submezcla del mezclador normal y hasta siete pistas rápidas del cliente
- Atenuación por pista
Funciones omitidas:
- Conversión de la 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, o un período ligeramente más alto de 5 ms si es necesario para la estabilidad de la programación. Este número se eligió de modo que, teniendo en cuenta la canalización de búfer completa, la latencia total sea del orden de 10 ms. Es posible usar valores más pequeños, pero pueden aumentar el consumo de energía y la probabilidad de fallas según la previsibilidad de la programación de la CPU. Se pueden usar valores más grandes, de hasta 20 ms, pero esto genera una latencia total degradada, por lo que se deben evitar.
Programació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 una baja 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 producen fallas debido a la falta de datos. Si se ejecuta demasiado pronto, se producen fallas debido a que se extraen datos de una pista rápida antes de que esta los proporcione.
Bloqueo
Idealmente, el subproceso del mezclador rápido nunca se bloquea, excepto en write()
de HAL. Otros casos de bloqueo dentro del mezclador rápido se consideran errores. En particular, se evitan los mutex.
En su lugar, se usan algoritmos sin bloqueo (también conocidos como algoritmos sin bloqueo).
Consulta 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 las operaciones a nivel del binder, 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 los datos de la pista, la interacción con los clientes se realiza a través del mezclador normal.
El receptor principal del mezclador rápido es la HAL de audio.
Batidora normal
Funciones
Todas las funciones están habilitadas:
- Hasta 32 pistas
- Atenuación por pista
- Conversión de la 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.
Programación
El mezclador normal se ejecuta con una prioridad SCHED_OTHER
elevada.
Bloqueo
El mezclador normal puede bloquearse y, a menudo, lo hace en varios mutexes, así como en una canalización de bloqueo para escribir su mezcla secundaria.
Relación con otros componentes
El mezclador normal interactúa de forma extensa con el mundo exterior, incluidos los subprocesos del vinculador, el administrador de políticas de audio, el subproceso del mezclador rápido y los segmentos de clientes.
El receptor del mezclador normal es una tubería de bloqueo para el canal 0 del mezclador rápido.
Marcas
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 del cliente. No aparece en el servidor.
TRACK_FAST
es un concepto de cliente a servidor.