Configuración del audio del auto

En Android 10, car_audio_configuration.xml reemplazó a car_volumes_groups.xml y IAudioControl.getBusForContext. Los archivos de política de audio, que suelen estar contenidos en la partición del proveedor, representan la configuración de hardware de audio de la placa. Todos los dispositivos a los que se hace referencia en car_audio_configuration.xml deben definirse en audio_policy_configuration.xml.

En la siguiente Figura 1, se muestra una descripción general de alto nivel de la arquitectura del servicio de audio para automóviles en la que el servicio de audio para automóviles lee el archivo de configuración de audio para configurar el audio del dispositivo.

Descripción general de la arquitectura de audio para automóviles

Figura 1: Descripción general de la arquitectura de audio para automóviles.

Coloca el archivo de configuración de audio para vehículos en vendor\etc\ o system\etc\ en el dispositivo, siendo vendor\etc\ el primer lugar en el que el servicio de audio para vehículos busca el archivo. Los servicios de audio del automóvil leen car_audio_configuration.xml para determinar la configuración de audio.

Zonas de audio para automóviles:

  • Cada zona de audio contiene un ID de zona de audio único.
  • Cada zona de audio se puede asignar a una zona de ocupante.
  • Las acciones de audio de cada zona son independientes entre sí:

    • Enfoque de audio
    • Enrutamiento de audio
    • Autosilenciado de fondo
  • Grupos de volumen del automóvil:

    • Todos los dispositivos de audio que contienen un grupo de volumen se controlan juntos con los mismos cambios de ganancia. La configuración de ganancia de audio para todos los dispositivos de un grupo debe ser la misma.

    • Asignación del contexto de audio a dispositivos de audio. Úsalo para crear una combinación de audio que asigne los usos de audio a un dispositivo de salida.

    • Todos los contextos de audio deben representarse dentro de una zona. Esto permite que el enrutamiento de audio se configure con precisión para todos los usos de atributos de audio.

Contextos de audio

Para simplificar la configuración del audio de AAOS, los usos similares se agruparon en CarAudioContexts. Estos contextos de audio se usan en todo CarAudioService para definir el enrutamiento, los grupos de volumen, el enfoque de audio y la administración de la atenuación. A continuación, se enumeran los contextos de audio estáticos en AAOS.

En esta tabla, se describe la asignación entre contextos y usos de audio. Se proporcionan filas destacadas para un nuevo uso del sistema.

CarAudioContext Associated AttributeUsages
MÚSICA UNKNOWN
GAME
MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
ALARMA ALARM
NOTIFICACIÓN NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCIA EMERGENCY
DE LA MARCA SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANUNCIO ANNOUNCEMENT

Habilita el enrutamiento de AAOS

Para usar el enrutamiento basado en AAOS, debes establecer la marca audioUseDynamicRouting en true:

<resources>
    <bool name="audioUseDynamicRouting">true</bool>
</resources>

Cuando false, el enrutamiento y gran parte de CarAudioService están inhabilitados, el AAOS vuelve al comportamiento predeterminado de AudioService.

Zona principal

De forma predeterminada, todo el audio se enruta a la zona principal. Solo existe una zona principal, que se indica en la configuración con el atributo isPrimary="true". La zona principal se asigna automáticamente a Audiomanager.PRIMARY_AUDIO_ZONE.

Configuración de muestra (versión 2)

Por ejemplo, un vehículo puede tener dos zonas, una principal y un sistema de entretenimiento para asientos traseros. En esta situación, puedes diseñar una posible versión 2 de car_audio_configuration.xml de la siguiente manera:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
               <group>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

En este ejemplo, la zona principal separa algunos contextos de audio para diferentes dispositivos. Esto permite que el sistema HAL aplique diferentes efectos de procesamiento posterior y combine la salida en cada dispositivo con el hardware del vehículo. Los dispositivos se organizaron en varios grupos de volumen: multimedia, navegación, llamadas, alarmas y sonidos del sistema. Si el sistema está configurado en useFixedVolume, los niveles de volumen de cada grupo se pasan al HAL para que se apliquen a la salida de estos dispositivos.

Para la zona principal, recomendamos que los sonidos del sistema estén separados de los demás. Esto permite que los sonidos del vehículo se traten con una prioridad más alta. El servicio de audio para automóviles ya hace estas distinciones para los sonidos del vehículo en términos de enfoque y administración de atenuación. Por ejemplo, una solicitud de enfoque de sonido de emergencia tiene una prioridad más alta que otra solicitud de enfoque.

Para simplificar, en el ejemplo de la zona secundaria, todos los contextos de audio se dirigen a un solo dispositivo y a un grupo de volumen.

Configuración de audio de la zona para ocupantes

En Android 11, car_audio_configuration.xml introdujo dos campos nuevos: audioZoneId y occupantZoneId. Puedes usar audioZoneId para controlar la administración de zonas de audio. Puedes usar occupantZoneId para configurar el enrutamiento en función del ID de usuario.

Si revisamos la configuración de audio anterior, pero usamos el nuevo campo para el ID de zona de ocupante y la asignación de ID de zona de audio, la nueva configuración sin las definiciones de grupo de volumen se puede configurar de la siguiente manera.

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

La configuración anterior define una asignación de la zona principal a la zona de ocupante 0 y de audioZoneId 1 a occupantZoneId 1. En general, se puede configurar cualquier asignación entre la zona de ocupante y la zona de audio. Sin embargo, la asignación debe ser uno a uno. A continuación, se enumeran las reglas que definieron los dos campos nuevos.

  • audioZoneId para la zona principal siempre es el ID PRIMARY_AUDIO_ZONE. Si se define isPrimary="true", no se necesita audioZoneId.

  • No se pueden repetir los números audioZoneId y occupantZoneId.

  • audioZoneId y occupantZoneId solo pueden tener una asignación uno a uno.

Configuración de audio para vehículos de Android 14

En Android 14, AAOS introdujo el servicio de complementos OEM, que te permite administrar de forma más activa el comportamiento de audio supervisado por el servicio de audio del automóvil. Junto con los nuevos servicios de complementos, se agregan los siguientes cambios al archivo de configuración de audio para vehículos:

  • Contexto de audio del automóvil definido por el OEM
  • Parámetros de configuración dinámicos de zonas no principales

Contexto de audio del automóvil definido por el OEM

Para habilitar una configuración de audio flexible, en Android 14, el servicio de audio para vehículos permite que los usos de audio se agrupen de manera diferente a los contextos de audio estáticos definidos anteriormente. Este contexto definido por el OEM se puede definir en el archivo car_audio_configuration.xml de la versión 3.

En su lugar, se usan los contextos de audio estáticos definidos actualmente. A continuación, se muestra el formato general del contexto de audio para automóviles definido por el OEM.

Cada contexto de OEM requiere un name junto con una lista de uso de atributos de audio que se asignan al contexto. En el ejemplo anterior, se definen dos contextos:

<carAudioConfiguration version="3">
    <oemContexts>
        <oemContext name="media">
            <audioAttributes>
                <usage value="AUDIO_USAGE_MEDIA" />
    <usage value="AUDIO_USAGE_UNKNOWN"/>
            </audioAttributes>
        </oemContext>
        <oemContext name="game">
            <audioAttributes>
                <usage value="AUDIO_USAGE_GAME" />
            </audioAttributes>
        </oemContext>
...
  • El contexto media contiene AUDIO_USAGE_MEDIA y AUDIO_USAGE_UNKNOWN.
  • El contexto de game contiene solo AUDIO_USAGE_GAME.

El contexto se debe definir en la parte superior del archivo car_audio_configuration.xml. Cuando se definen los contextos de OEM, el resto de la configuración de audio del automóvil puede continuar como antes. Se aplican las siguientes reglas al contexto de audio para vehículos:

  • Las definiciones de contexto del OEM son opcionales. En su lugar, se usa el Contexto de audio estático.

  • No repitas los nombres de los contextos.

  • No asignes el uso del atributo de audio a varios contextos.

  • Se deben usar todos los usos de audio definidos en AudioAttributes para construir el contexto.

Estrictamente hablando, se debe usar la representación de cadena android.audio.policy.configuration.V7_0.AudioUsage del uso de audio para la definición del contexto de audio del OEM. En el futuro, los usos más recientes de los atributos de audio se asignarán al contexto más apropiado para reducir los errores durante la migración de una versión de Android a otra.

Si bien se introdujo el contexto definido por el OEM para expandir aún más el servicio de audio del complemento OEM, se puede usar sin el servicio del complemento OEM. El comportamiento del audio se asemeja al del servicio de audio estático:

  • Interacciones con el foco de audio El atributo de audio se usa para determinar el mejor comportamiento de coincidencia según lo establecido por la matriz de interacción de enfoque de audio. Para obtener más detalles, consulta Enfoque de audio.

  • El atributo de audio de control de volumen de audio se usa para determinar la mejor coincidencia:

    • Grupo de volumen basado en el contexto definido por el OEM.
    • Prioridad de la lista de volumen estático configurada.
  • Comportamiento de autosilenciado de fondo:

    • El uso del atributo de audio para el enfoque de audio actual se usa para asignar la información del dispositivo de audio de salida como se define en el archivo de configuración de audio del automóvil.

    • El atributo de audio se usa para asignar el contexto estático correspondiente a la atenuación, según la matriz de atenuación de audio estática.

Configuraciones de zonas de audio dinámicas

En Android 14, para admitir una configuración dinámica de zonas de audio, el esquema de configuración de audio para vehículos para definir zonas de audio también se actualiza a la versión 3. El nuevo esquema requiere que se configure una configuración para cada zona.

<carAudioConfiguration version="3">
    <!-- optional OEM context -->
    <oemContexts>
      <oemContext name="media">
        <audioAttributes>
          <usage value="AUDIO_USAGE_MEDIA" />
          <usage value="AUDIO_USAGE_UNKNOWN"/>
        </audioAttributes>
      </oemContext>
      <oemContext name="game">
        <audioAttributes>
          <usage value="AUDIO_USAGE_GAME" />
        </audioAttributes>
      </oemContext>
...
    </oemContexts>
  <zones>
    <zone name="primary zone" isPrimary="true" occupantZoneId="0">
      <zoneConfigs>
        <zoneConfig name="primary zone config 0" isDefault="true">
          <volumeGroups>
            <group>
              <device address="bus0_media_out">
                <context context="media"/>
            <context context="game"/>
                <context context="announcement"/>
              </device>
              <device address="bus6_notification_out">
                <context context="notification"/>
              </device>
            </group>
  ...
      </zoneConfigs>
    </zone
  </zones>

Para obtener más información, consulta el archivo de la versión 3 definido en device/generic/car/emulator/audio/car_audio_configuration.xml. A partir de Android 14, la zona principal solo puede tener una (1) configuración. Las zonas que no son primarias pueden tener varias configuraciones. Las siguientes reglas se aplican a las configuraciones de audio para automóviles:

  • La zona de audio principal puede tener solo una configuración.

  • Las zonas de audio no principales pueden tener varias configuraciones.

  • El nombre debe ser único para cada zona de audio y configuración de zona de audio.

  • Dentro de una zona de audio, las configuraciones de audio pueden diferir:

    • No es necesario que la configuración de los grupos de volumen sea la misma.
    • No es necesario que la asignación de contexto de audio sea la misma.
  • Los nombres de los dispositivos de salida de audio deben ser únicos en todas las zonas o configuraciones. El nombre del dispositivo debe aparecer solo una vez en una configuración de audio o en las zonas.

  • Los dispositivos de audio que pertenecen al mismo grupo de volumen deben tener la misma configuración de ganancia de audio.

  • Se deben asignar todos los contextos de audio (OEM o estáticos) para cada configuración de audio.

Compatibilidad con versiones posteriores

Aunque las versiones nuevas de car_audio_configuration.xml presentan funciones nuevas en cada actualización, puedes usar archivos más antiguos en versiones más recientes de AAOS. Los OEMs que actualizan a versiones nuevas de Android pueden volver a usar el archivo car_audio_configuration.xml.

Para usar una función nueva que requiera información nueva contenida en car_audio_configuration.xml, se debe actualizar la versión. Si intentas usar una versión anterior de un archivo con información que no es compatible con esa versión, se genera un IllegalStateException cuando se inicia el servicio del automóvil. El mensaje de excepción contiene la información relevante sobre qué información se usa y qué versión mínima se requiere.