Audio para automóviles

El SO Android Automotive (AAOS) se basa en la pila de audio principal de Android para admitir los casos de uso para funcionar como sistema de infoentretenimiento en un vehículo. AAOS es responsable de los sonidos de infoentretenimiento (es decir, contenido multimedia, navegación y comunicaciones, pero no es directamente responsable de las campanillas y advertencias que tengan estrictos requisitos de disponibilidad y tiempo. Si bien el AAOS proporciona indicadores y mecanismos para ayudar al vehículo a administrar el audio; al final, depende del vehículo para determinar qué sonidos se deben reproducir para el conductor pasajeros, garantizando que los sonidos críticos de seguridad y regulatorios funcionen correctamente escucharse sin interrupciones.

Como Android administra la experiencia multimedia del vehículo, las fuentes de contenido multimedia externas como el sintonizador de radio, deben estar representados por apps que puedan procesar audio el enfoque y los eventos clave multimedia de la fuente.

Android 11 incluye los siguientes cambios en el audio relacionado con automóviles soporte:

Sonidos y transmisiones de Android

Los sistemas de audio de Automotive admiten los siguientes sonidos y transmisiones:

Diagrama de arquitectura centrada en la transmisión

Figura 1: Diagrama de arquitectura centrada en la transmisión

Android controla y controla los sonidos que provienen de las apps para Android y enrutar sus sonidos a los dispositivos de salida en la HAL según el tipo sonido:

  • Transmisiones lógicas, conocidas como fuentes en el audio principal se etiquetan con Atributos de audio.
  • Transmisiones físicas, conocidas como dispositivos en el audio principal nomenclatura, no tienen información de contexto después de la mezcla.

Para la confiabilidad, se pueden usar los sonidos externos (provenientes de fuentes fuentes, como la campanilla del cinturón de seguridad) se administran fuera de Android, debajo del HAL o incluso en hardware independiente. Los implementadores de sistemas deben proporcionar un mezclador acepta una o más transmisiones de entrada de sonido de Android y luego las combina de forma adecuada con las fuentes de sonido externas requeridas por vehículo.

La implementación de HAL y el mezclador externo son responsables de garantizar que los sonidos externos críticos para la seguridad y para mezclar en los transmisiones continuas y enrutarlas a las bocinas adecuadas.

Sonidos de Android

Las apps pueden tener uno o más reproductores que interactúen mediante la versión estándar de Android. APIs (por ejemplo, AudioManager para el control de enfoque o MediaPlayer para la transmisión) para emitir una o más transmisiones lógicas de datos de audio. Estos datos puede ser monocanal o envolvente 7.1, pero se enruta y trata como un fuente única. La transmisión de aplicaciones se asocia con AudioAttributes. que le proporcionan sugerencias al sistema sobre cómo se debe expresar el audio.

Las transmisiones lógicas se envían a través de AudioService y se enrutan a una una sola) de las transmisiones de salida físicas disponibles, cada una de las cuales es la de un mezclador en AudioFlinger. Después de mezclar los atributos de audio a una transmisión física, ya no están disponibles.

Luego, cada transmisión física se entrega a la HAL de audio para que se renderice el hardware. En apps para vehículos, el hardware de procesamiento puede ser códecs locales. (similar a los dispositivos móviles) o un procesador remoto en toda la infraestructura física del vehículo en cada red. De cualquier manera, la tarea de la implementación de la HAL de audio es proporcionar el datos de muestra reales y hacer que sean audibles.

Transmisiones externas

Transmisiones de sonido que no se deben enrutar a través de Android (para certificación o de tiempo) se pueden enviar directamente a la mezcladora externa. A partir de Android 11, la HAL ahora puede solicitar foco para estos sonidos externos para informar a Android para que pueda tomar las medidas adecuadas, como detener contenido multimedia o evitar que otros se enfoquen.

Si las transmisiones externas son fuentes multimedia que deberían interactuar con el sonido de producción que genera Android (por ejemplo, detener la reproducción de MP3 cuando se un sintonizador externo está activado), esas transmisiones externas deben estar representadas App para Android Este tipo de app solicitaría el foco de audio en nombre de la fuente de contenido multimedia en lugar de la HAL, y respondería a las notificaciones de enfoque iniciar/detener la fuente externa según sea necesario para ajustarse al enfoque de Android . La app también es responsable de controlar los eventos clave de contenido multimedia, reproducir/pausar. Un mecanismo sugerido para controlar estos dispositivos externos es HwAudioSource.

Dispositivos de salida

En el nivel de la HAL de audio, el tipo de dispositivo AUDIO_DEVICE_OUT_BUS proporciona un dispositivo de salida genérico para usar en sistemas de audio de vehículos. El autobús el dispositivo admite puertos direccionables (donde cada puerto es el extremo de un física) y se espera que sea el único tipo de dispositivo de salida compatible en un vehículo.

Una implementación del sistema puede usar un puerto de bus para todos los sonidos de Android, en en cuyo caso Android mezcla todo y lo entrega como una sola transmisión. Como alternativa, la HAL puede proporcionar un puerto de bus para cada CarAudioContext a fin de permitir y entrega simultánea de cualquier tipo de sonido. Esto hace posible que la HAL para mezclar y atenuar los diferentes sonidos como desees.

La asignación de contextos de audio a los dispositivos de salida se realiza mediante car_audio_configuration.xml

Entrada de micrófono

Al capturar audio, la HAL de audio recibe un openInputStream. llamada que incluye un argumento AudioSource que indica cómo se debe procesar la entrada del micrófono.

La fuente VOICE_RECOGNITION (específicamente, el Asistente de Google) espera una transmisión de micrófono estéreo con un efecto de cancelación del eco (si está disponible), pero no se aplicó ningún otro procesamiento. Se espera que Asistente realice la conformación de haces.

Entrada de micrófono multicanal

Para capturar audio de un dispositivo con más de dos canales (estéreo), usa un de índice de canal en lugar de una máscara de índice posicional (como CHANNEL_IN_LEFT). Ejemplo:

final AudioFormat audioFormat = new AudioFormat.Builder()
    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
    .setSampleRate(44100)
    .setChannelIndexMask(0xf /* 4 channels, 0..3 */)
    .build();
final AudioRecord audioRecord = new AudioRecord.Builder()
    .setAudioFormat(audioFormat)
    .build();
audioRecord.setPreferredDevice(someAudioDeviceInfo);

Cuando setChannelMask y setChannelIndexMask se establecen, AudioRecord usa solo el valor establecido por setChannelMask (dos canales como máximo).

Captura simultánea

A partir de Android 10, el framework de Android admite la captura simultánea. de entradas, pero con restricciones para proteger la privacidad del usuario. Como parte de estas restricciones, las fuentes virtuales, como AUDIO_SOURCE_FM_TUNER se ignorarán y, por lo tanto, se podrán se capturan de forma simultánea junto con una entrada normal (como el micrófono). Las HwAudioSources tampoco se consideran parte de operaciones simultáneas. de captura.

Apps diseñadas para funcionar con dispositivos de AUDIO_DEVICE_IN_BUS o con los dispositivos AUDIO_DEVICE_IN_FM_TUNER secundarios deben depender explícitamente identificar esos dispositivos y usar AudioRecord.setPreferredDevice() para omitir la lógica de selección de fuentes predeterminada de Android.

Usos de audio

El AAOS utiliza principalmente AudioAttributes.AttributeUsages para el enrutamiento, los ajustes de volumen y la gestión del enfoque. Los usos son un del “por qué” se está reproduciendo la transmisión. Por lo tanto, todas las transmisiones y las solicitudes de foco de audio deben especificar un uso para su reproducción de audio. Cuándo no se establece específicamente cuando se compila un objeto AudioAttributes, el uso se se estableció de forma predeterminada en USAGE_UNKNOWN. Aunque actualmente se trata de la misma forma como USAGE_MEDIA, no se debe confiar en este comportamiento para el contenido multimedia. reproducción.

Usos del sistema

En Android 11, se introdujeron los usos del sistema. Estos usos se comportan de manera similar a los usos establecidos anteriormente, con la excepción de que requieren APIs del sistema para usar, así como android.permission.MODIFY_AUDIO_ROUTING. La nueva herramienta usos del sistema son:

  • USAGE_EMERGENCY
  • USAGE_SAFETY
  • USAGE_VEHICLE_STATUS
  • USAGE_ANNOUNCEMENT

Para construir un objeto AudioAttributes con un uso del sistema, usa AudioAttributes.Builder#setSystemUsage en lugar de setUsage. Llamar a este método con un uso que no es del sistema Se arrojará una IllegalArgumentException. Además, si se establecieron un uso del sistema y uno de uso en un compilador, se arrojará un IllegalArgumentException durante la compilación.

Para comprobar qué uso está asociado con un AudioAttributes llamada a AudioAttributes#getSystemUsage. Esto muestra el uso, o bien el uso del sistema, asociado.

Contextos de audio

Para simplificar la configuración de audio AAOS, se agruparon usos similares CarAudioContext. Estos contextos de audio se usan a lo largo CarAudioService para definir el enrutamiento, los grupos de volumen y el foco de audio y administración de posturas.

Los contextos de audio en Android 11 son los siguientes:

Contexto de CarAudio AttributeUsages asociados
MUSIC UNKNOWN, GAME, MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT, ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION, VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION, NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

Asignación entre contextos de audio y usos. Las filas destacadas son para los nuevos usos del sistema.

Audio multizona

Con la industria automotriz, se presenta un nuevo conjunto de casos de uso en torno a usuarios simultáneos que interactúan con la plataforma y que buscan consumir contenido multimedia independiente. Para Por ejemplo, un conductor puede reproducir música en el asiento trasero mientras los pasajeros están en el asiento trasero están mirando un video de YouTube en la pantalla posterior. El audio multizona permite ya que permite reproducir varias fuentes de audio de forma simultánea en distintas áreas. del vehículo.

El audio multizona a partir de Android 10 permite que los OEM configuren el audio en zonas separadas. Cada zona es un conjunto de dispositivos dentro del vehículo con sus propios grupos de volúmenes, la configuración de enrutamiento para los contextos y y administración de posturas. De esta manera, la cabina principal se podría configurar como una sola cámara de audio. mientras que los conectores para auriculares de la pantalla posterior se configuran como una segunda zona.

Las zonas se definen como parte de car_audio_configuration.xml. Luego, CarAudioService lee la configuración y ayuda a AudioService enrutan transmisiones de audio según su zona asociada. Cada zona aún define reglas de enrutamiento basadas en contextos y el UID de la aplicación. Cuando un jugador es cuando se crea, CarAudioService determina la zona en la que se encuentra el jugador asociado y, luego, según el uso, con qué dispositivo el AudioFlinger a la que se debe enrutar el audio.

El enfoque también se mantiene de forma independiente para cada zona de audio. Esto permite aplicaciones en diferentes zonas para producir audio de forma independiente sin interfieran entre sí mientras hacen que las aplicaciones respeten los cambios el enfoque en su zona. CarZonesAudioFocus en un radio de CarAudioService es responsable de administrar el enfoque de cada zona.

Configura el audio multizona

Figura 2: Configura el audio multizona

HAL de audio

Las implementaciones de audio de Automotive se basan en la HAL de audio estándar de Android. que incluye lo siguiente:

  • IDevice.hal Crea transmisiones de entrada y salida. controla el volumen y el silenciamiento principales, y usa lo siguiente:
    • createAudioPatch Para crear parches externos y externos entre dispositivos.
    • IDevice.setAudioPortConfig() para proporcionar volumen a cada transmisión física.
  • IStream.hal Junto con las variantes de entrada y salida, administra la transmisión de muestras de audio hacia y desde el hardware.

Industria automotriz: tipo de dispositivos

Los siguientes tipos de dispositivos son relevantes para las plataformas de la industria automotriz.

Tipo de dispositivo Descripción
AUDIO_DEVICE_OUT_BUS Salida principal de Android (así es como se reproduce todo el audio de Android o se entreguen al vehículo). Se usa como dirección para desambiguar las transmisiones. para cada contexto.
AUDIO_DEVICE_OUT_TELEPHONY_TX Se usa para el audio enrutado a la radio móvil para su transmisión.
AUDIO_DEVICE_IN_BUS Se usa para entradas que no se clasificaron de otra manera.
AUDIO_DEVICE_IN_FM_TUNER Solo se usa para la entrada de radio de emisión.
AUDIO_DEVICE_IN_TV_TUNER Se usa para un dispositivo de TV si está presente.
AUDIO_DEVICE_IN_LINE Se usa para el conector de entrada AUX.
AUDIO_DEVICE_IN_BLUETOOTH_A2DP Música recibida por Bluetooth
AUDIO_DEVICE_IN_TELEPHONY_RX Se utiliza para el audio recibido de la radio móvil asociada con un teléfono. llamada.

Cómo configurar dispositivos de audio

Los dispositivos de audio visibles para Android deben definirse en /audio_policy_configuration.xml, que incluye los siguientes componentes:

  • nombre del módulo. Compatible con "principal" (se usa para casos de uso de la industria automotriz), "A2DP", "remote_submix" y "USB". El nombre del módulo y el audio correspondiente El controlador debe compilarse en audio.primary.$(variant).so.
  • devicePorts. Contiene una lista de descriptores de dispositivos para todas las entradas y salidas de dispositivos (incluidos los dispositivos conectados de forma permanente y los extraíbles) que se pueden a las que se accede desde este módulo.
    • Para cada dispositivo de salida, puedes definir un control de ganancia que consta de valores mínimos, máximos, predeterminados y de pasos en milibeles (1 milibel = 1/100 dB = 1/1000 bel).
    • El atributo address en una instancia devicePort se puede usar para encontrar la , incluso si existen varios con el mismo tipo de dispositivo que AUDIO_DEVICE_OUT_BUS
  • mixPorts. Contiene una lista de todas las transmisiones de salida y entrada que expone la de audio. Cada instancia de mixPort puede considerarse como una transmisión física a Android AudioService
  • rutas. Define una lista de posibles conexiones entre la entrada y la salida o entre la transmisión y el dispositivo.

En el siguiente ejemplo, se define un dispositivo de salida bus0_phone_out en el que Las transmisiones de audio de Android se mezclan con mixer_bus0_phone_out. La ruta toma el flujo de salida de mixer_bus0_phone_out al dispositivo bus0_phone_out

<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>bus0_phone_out</item>
<defaultOutputDevice>bus0_phone_out</defaultOutputDevice>
            <mixPorts>
                <mixPort name="mixport_bus0_phone_out"
                         role="source"
                         flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="bus0_phone_out"
                            role="sink"
                            type="AUDIO_DEVICE_OUT_BUS"
                            address="BUS00_PHONE">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400"
                                maxValueMB="4000"
                                defaultValueMB="0"
                                stepValueMB="100"/>
                    </gains>
                </devicePort>
            </devicePorts>
            <routes>
                <route type="mix" sink="bus0_phone_out"
                       sources="mixport_bus0_phone_out"/>
            </routes>
        </module>
    </modules>
</audioPolicyConfiguration>