Gestión de volumen

La gestión de volumen está contenida en CarAudioService , que utiliza volúmenes fijos con la expectativa de que los volúmenes se apliquen por debajo del HAL mediante un amplificador de hardware en lugar de hacerlo en el software. CarAudioService organiza los dispositivos de salida en grupos de volúmenes para aplicar las mismas ganancias a todos los dispositivos asociados con un grupo de volúmenes.

Volúmenes fijos

Las implementaciones de AAOS utilizan un amplificador de hardware para controlar el volumen en lugar de un mezclador de software. Para evitar efectos secundarios, establezca el indicador config_useFixedVolume en true (superpóngalo según sea necesario):

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

Cuando el indicador config_useFixedVolume no está configurado (o está configurado en false ), las aplicaciones pueden llamar a AudioManager.setStreamVolume() para cambiar el volumen por tipo de transmisión en el mezclador de software. Es posible que esto no siempre sea deseable debido a los posibles efectos en otras aplicaciones y al hecho de que la atenuación del volumen en el mezclador de software puede dar como resultado menos bits significativos disponibles en la señal cuando la recibe el amplificador de hardware.

Grupos de volumen

Los grupos de volúmenes administran los volúmenes de una colección de dispositivos dentro de una zona de audio. Para cada grupo de volumen, el volumen se puede controlar de forma independiente. Las ganancias resultantes se configuran en los dispositivos asociados para ser aplicadas por el amplificador del vehículo. La configuración del volumen persiste para el usuario y se carga cuando el usuario inicia sesión.

Definir grupos de volúmenes

CarAudioService utiliza grupos de volúmenes definidos en car_audio_configuration.xml :

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <device address="bus0_media_out">
                        <context context="music"/>
                    </device>
                </group>
                <group>
                    <device address="bus1_navigation_out">
                        <context context="navigation"/>
                    </device>
                    <device address="bus2_voice_command_out">
                        <context context="voice_command"/>
                    </device>
                </group>
                ...
            </volumeGroups>
        </zone>
     </zones>
</audioZoneConfiguration>

Cada grupo de volúmenes debe contener uno o más dispositivos de salida con direcciones asociadas. Las direcciones deben corresponder a los dispositivos de salida definidos en audio_policy_configuration.xml .

Configurar ganancias de grupos de volúmenes

Cada grupo de volúmenes tiene valores de ganancia mínimos, máximos y predeterminados, así como un tamaño de paso basado en los valores configurados en audio_policy_configuration.xml para los dispositivos asociados con el grupo de volúmenes.

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

Durante la inicialización, el grupo de volúmenes verifica los valores de ganancia de los dispositivos asociados y configura el grupo de la siguiente manera:

  • Numero de pie. Debe ser el mismo para todos los dispositivos controlados por el grupo de volúmenes.
  • Ganancia mínima. Ganancia mínima más pequeña entre los dispositivos del grupo.
  • Ganancia máxima. La ganancia máxima más alta entre los dispositivos del grupo.
  • Ganancia predeterminada. Mayor ganancia predeterminada entre los dispositivos del grupo.

Dada la forma en que están configurados estos valores, es posible configurar la ganancia de un grupo de volúmenes fuera del rango admitido para un dispositivo asociado con el grupo de volúmenes. En este caso, para ese dispositivo, la ganancia se establece en el valor de ganancia mínimo o máximo del dispositivo en función de si el valor del grupo de volumen está por debajo o por encima del rango.

Identificadores de grupos de volúmenes

Los grupos de volúmenes se identifican en tiempo de ejecución en el orden definido en el archivo XML. Los ID varían de 0 a N-1 dentro de una zona de audio, donde N es el número de grupos de volumen en esa zona. De esta manera, los ID de grupo de volúmenes no son únicos entre zonas. Estos identificadores se utilizan para las API CarAudioManager asociadas con grupos de volúmenes. Cualquier API que acepte un groupId sin un zoneId tiene como valor predeterminado la zona de audio principal.

Gestión de volúmenes multizona

Se espera que cada zona de audio tenga uno o más grupos de volumen, y cada grupo de volumen solo está asociado con una única zona de audio. Esta relación se define como parte de car_audio_configuration.xml . Para obtener más información, consulte el ejemplo anterior en Definir grupos de volúmenes .

Los niveles de volumen actuales para cada zona persisten para el usuario asociado con esa zona. Estas configuraciones son específicas de la zona, lo que significa que si un usuario inicia sesión en una pantalla asociada con la zona principal y luego inicia sesión en una zona asociada con una zona de audio secundaria, los niveles de volumen cargados y persistentes para la primera zona difieren de aquellos para la zona secundaria.

Manejar eventos de teclas de volumen

Android define varios códigos clave para el control de volumen, que incluyen:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

De forma predeterminada, Android dirige los eventos de las teclas de volumen a las aplicaciones. Las implementaciones automotrices deberían obligar a que CarAudioService procese estos eventos clave, que luego llama setGroupVolume o setMasterMute , según corresponda. Para forzar este comportamiento, establezca el indicador config_handleVolumeKeysInWindowManager en true :

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

Actualmente, los eventos de teclas de volumen no tienen forma de distinguir a qué zona están destinados y se supone que todos están asociados con la zona de audio principal. Cuando se recibe un evento de tecla de volumen, CarAudioService determina qué grupo de volumen ajustar obteniendo los contextos de audio para los reproductores activos y luego ajustando el grupo de volumen que contiene el dispositivo de salida asociado con el contexto de audio de mayor prioridad. La priorización se determina en función de un orden fijo definido en CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY .

Desvanecimiento y equilibrio

Ambas versiones de AudioControl HAL incluyen API para configurar el desvanecimiento y el equilibrio en el vehículo. Las API del sistema correspondientes para CarAudioManager pasan valores al AudioControl HAL. Estas API requieren android.car.permission.CAR_CONTROL_AUDIO_VOLUME . Las API de AudioControl son:

  • setBalanceTowardRight(float value) cambia el volumen del altavoz hacia el lado derecho (+) o izquierdo (-) del automóvil.

    • 0.0 está centrado
    • +1.0 tiene toda la razón
    • -1.0 queda completamente a la izquierda
    • Un valor fuera del rango de -1 a 1 es un error
  • setFadeTowardFront(float value) cambia el volumen del altavoz hacia la parte delantera (+) o trasera (-) del automóvil.

    • 0.0 está centrado
    • +1.0 está completamente adelantado
    • -1.0 está completamente atrás
    • Un valor fuera del rango de -1 a 1 es un error

Usted decide cómo se deben aplicar estos valores y cómo mostrarlos a los usuarios. Podrían aplicarse estrictamente a los medios o de forma generalizada a todos los sonidos de Android. Android 11 también introdujo soporte para aplicar efectos de audio a dispositivos de salida. Con esto, es posible administrar alternativamente el desvanecimiento y el equilibrio a través de efectos de audio en los dispositivos de salida apropiados en lugar de a través de estas API.

Audio ducking

La atenuación de audio se produce cuando el vehículo reduce la ganancia de una transmisión para que otra transmisión que se reproduce simultáneamente se pueda escuchar con mayor claridad. En AAOS, HAL implementa la reducción de audio. Android no tiene control sobre los sonidos más allá del sistema operativo. En Android 11, la información principal disponible para HAL para tomar decisiones de evasión es si dos dispositivos de salida tienen transmisiones activas o no.

cuando agacharse

Si bien depende del OEM individual determinar cómo maneja HAL la reducción, recomendamos las siguientes pautas.

  • La reproducción de múltiples transmisiones en Android ocurre comúnmente cuando dos aplicaciones o servicios mantienen el foco de audio simultáneamente. Para saber cuándo Android puede otorgar enfoque simultáneo, consulte la matriz de interacción en Tipos de restricción . Con la introducción del complemento de audio para automóvil, esto también depende de su administración de AudioFocus.

  • Cualquier transmisión mezclada por Android se realiza antes de que se apliquen las ganancias. Como tal, cualquier transmisión que deba atenuarse cuando se reproduce simultáneamente con otra debe enrutarse a dispositivos de salida separados para que HAL pueda aplicar atenuación antes de mezclarlos.

Las siguientes son posibles interacciones simultáneas y se recomienda evitarlas.

Interacción Acción
EMERGENCY Agacha o silencia todo excepto SAFETY
SAFETY Evita todo excepto EMERGENCY
NAVIGATION Evita todo excepto SAFETY y EMERGENCY
CALL Evita todo excepto SAFETY , EMERGENCY y NAVIGATION
VOICE Patos CALL_RING
VEHICLE_SOUNDS Usted determina la importancia del sonido activo y si evita o no otros sonidos.
MUSIC y ANNOUNCEMENT Agachado por todo. Las excepciones son los tonos de interacción táctil reproducidos como SYSTEM_SOUND .

Consideraciones al agacharse

Algunas aplicaciones y servicios, como la navegación o un asistente, pueden utilizar varios reproductores para realizar acciones. Evite la desactivación agresiva cuando un flujo de datos deja de fluir a través de los dispositivos de salida para garantizar que los medios no vuelvan a su volumen máximo antes de ser desactivados antes de que se inicie la siguiente reproducción desde la navegación o una aplicación de asistente.

Para vehículos con múltiples escenarios de sonido con un aislamiento suficientemente bueno, puede dirigir el audio a diferentes áreas del automóvil en lugar de agacharse. Por ejemplo, las instrucciones de navegación se pueden enviar a los parlantes del reposacabezas del conductor mientras se continúa reproduciendo música en toda la cabina a un volumen normal.

Sonidos críticos para la seguridad

Android 11 introdujo las API de enfoque de audio HAL . HAL garantiza que los sonidos críticos para la seguridad tengan prioridad sobre otros sonidos. Si HAL mantiene el foco de audio para USAGE_EMERGENCY , no se garantiza que las aplicaciones y servicios de Android no reproduzcan sonidos. HAL determina qué transmisiones de Android deben mezclarse o silenciarse para reproducir sonidos críticos para la seguridad.

Configurar la interfaz de usuario de configuración de volumen

AAOS desacopla la interfaz de usuario de configuración de volumen de la configuración del grupo de volúmenes. Estos se pueden superponer como se describe en Configurar ganancias de grupos de volúmenes . Esta separación garantiza que no se requieran cambios en caso de que cambie la configuración de los grupos de volúmenes.

En la interfaz de usuario de configuración del automóvil, packages/apps/Car/Settings/res/xml/car_volume_items.xml contiene los elementos de la interfaz de usuario (título y recursos de íconos) asociados con cada AudioAttributes.USAGE definido. Este archivo proporciona una representación razonable de los VolumeGroups definidos mediante el uso de recursos asociados con el primer uso reconocido contenido en cada VolumeGroup .

Por ejemplo, el siguiente ejemplo define un VolumeGroup que incluye voice_communication y voice_communication_signalling . La implementación predeterminada de la interfaz de usuario de configuración del automóvil representa el VolumeGroup utilizando los recursos asociados con voice_communication , ya que esa es la primera coincidencia del archivo.

<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
    <item car:usage="voice_communication"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="voice_communication_signalling"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="media"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="game"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="alarm"
          car:title="@*android:string/volume_alarm"
          car:icon="@*android:drawable/ic_audio_alarm"/>
    <item car:usage="assistance_navigation_guidance"
          car:title="@string/navi_volume_title"
          car:icon="@drawable/ic_audio_navi"/>
    <item car:usage="notification_ringtone"
          car:title="@*android:string/volume_ringtone"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistant"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="notification"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_request"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_instant"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_delayed"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_event"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_accessibility"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_sonification"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="unknown"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>

Los atributos y valores utilizados en la configuración anterior se declaran en packages/apps/Car/Settings/res/values/attrs.xml . La interfaz de usuario de configuración de volumen utiliza las siguientes API de CarAudioManager basadas en VolumeGroup :

  • getVolumeGroupCount() para saber cuántos controles se deben dibujar.
  • getGroupMinVolume() y getGroupMaxVolume() para obtener los límites superior e inferior.
  • getGroupVolume() para obtener el volumen actual.
  • registerVolumeChangeObserver() para recibir notificaciones de los cambios de volumen.

Evento de grupo de volumen de automóviles

Los casos de uso automotriz de actualización de volumen y alternancia de silencio tienen fundamentos contextuales que pueden definir las acciones de ciertas aplicaciones, como la configuración de volumen. El volumen actual y la devolución de llamada de silencio de la pila de audio del automóvil proporcionan información contextual limitada. Para brindar un mejor servicio a los casos de uso automotriz y la escalabilidad futura, se agrega CarVolumeGroupEvent a Android 14. Cada evento contiene tres tipos críticos de información:

  • Lista de CarVolumeGroupInfo
  • EventTypes (mapa de bits)
  • Lista de ExtraInfos

CocheVolumenGrupoInfo

El receptor de la devolución de llamada del evento tiene acceso inmediato a la lista de información del grupo de volumen de automóviles afectados. Esto significa que la aplicación no necesita realizar ninguna llamada adicional al marco de audio del automóvil para obtener el estado más reciente. Simplemente puede usar los CarVolumeGroupInfos recibidos to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of EventTypes`, como se explica a continuación.

Tipos de eventos

Define qué aspecto de CarVolumeGroupInfo ha cambiado. Las aplicaciones pueden usar esto para identificar cambios y tomar las acciones necesarias. Por ejemplo, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED indica que el CarVolumeGroups' maximum volume gain index has changed and can be queried by CarVolumeGroupInfo.getMaxVolumeGainIndex()`.

La siguiente tabla muestra la relación entre EventType y CarVolumeGroupInfo .

Tipo de evento CocheVolumenGrupoInfo
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

Información adicional

Proporciona información adicional sobre por qué ha cambiado CarVolumeGroup . Las aplicaciones pueden usar esta información para proporcionar contexto adicional para alertar al usuario para que actúe o para notificar. Por ejemplo, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL indica una atenuación transitoria activa debido a una sobrecarga térmica. La aplicación puede informar al usuario si intenta aumentar el volumen.

No aplicamos ningún proceso para ExtraInfos . Queda a su criterio determinar el proceso en base a ExtraInfos . Por ejemplo, si la atenuación está activa debido a EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED , también puede optar por atenuar la interfaz de usuario de la barra de volumen inicialmente para evitar que el usuario cambie el volumen. Otros pueden optar por mostrar un brindis de que la reducción está activa y permitir al usuario cambiar el volumen.

El marco de audio del automóvil depende de AudioControl HAL IAudioGainCallback para proporcionar las ExtraInfos sugeridas. Para obtener más información, consulte Devolución de llamada de ganancia de audio .

CarVolumeGroupEvent se amplía para satisfacer las necesidades futuras del marco de audio del automóvil. Tenemos la intención de admitir nuevas funciones únicamente a través de CarVolumeGroupEvent . Recomendamos encarecidamente que los desarrolladores de aplicaciones utilicen CarVolumeGroupEvent para controlar el volumen del grupo y silenciar los cambios.

Devolución de llamada de evento de grupo de volumen de automóvil

Android 14 proporciona una nueva devolución de llamada para que las aplicaciones privilegiadas y de plataforma se registren y reciban notificaciones sobre CarVolumeGroupEvents .

  • Para registrarse para la devolución de llamada, use CarAudioManager#registerCarVolumeGroupEventCallback()

  • Para cancelar el registro de la devolución de llamada, utilice CarAudioManager#unregisterCarVolumeGroupEventCallback()

Si una aplicación se registra con el nuevo CarVolumeGroupEventCallback y el CarVolumeCallback heredado, se da prioridad al evento CarVolumeGroupEventCallbacks . La pila de audio del automóvil ya no activa CarVolumeCallback . Esto evita activadores duplicados en la misma aplicación para el mismo evento.

Le recomendamos encarecidamente que utilice CarVolumeGroupEventCallback para administrar el volumen del grupo y silenciar los cambios.

Devolución de llamada de ganancia de audio

Desde Android 13, AudioControl HAL puede activar una devolución de llamada asincrónica para administrar las actualizaciones del nivel de volumen debido a cambios en el sistema de audio del automóvil.

API HAL

AudioControl @2.0 AIDL

La versión 2.0 de AudioControl AIDL HAL agrega la siguiente API:

API Objetivo
IAudioControl#registerGainCallback Registra una instancia de IAudioGainCallback con AudioControl HAL.
IAudioGainCallback#onAudioDeviceGainsChanged Devolución de llamada asincrónica para notificar cambios en la configuración de ganancia de audio.

La devolución de llamada AudioControl HAL incluye listas de motivos y el AudioGainConfigInfo respectivo, que consta de:

  • Identificación de zona
  • Dirección del puerto del dispositivo
  • Índice de volumen > índice puede ser un índice restringido o un índice de actualización.

Las razones se pueden clasificar en términos generales como:

  • Razones de restricción. Cambio transitorio de volumen y comportamiento de silencio.
  • Motivos de actualización. Cambio permanente en el comportamiento del volumen.

Tipos de restricción

A partir de AudioControl HAL AIDL V3 , los siguientes son tipos de restricciones admitidas:

  • Silenciar
  • Bloqueo
  • Limitación
  • Atenuación
Restricción activa Cambio de volumen activado por el usuario Alternancia de silencio activada por el usuario
Silenciar ❌ (activar el silencio)

✔ (silencio)
Bloqueo
Limitación ❌ (por encima del límite)

✔ (por debajo del límite)
Atenuación

La prioridad entre restricciones es Silencio > Bloqueo > Limitación > Atenuación.

Restricciones de silencio

Las restricciones de silencio son:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Car audio framework mantiene internamente estos dos estados de silencio:

  • Usuario silenciado. Se alterna según la solicitud del usuario, ya sea a través de CarAudioManager o eventos clave.

  • HAL en silencio. Se alterna según las restricciones de silencio recibidas a través de la devolución de llamada AudioGain .

Para los oyentes como la aplicación Configuración, el estado de silencio general del grupo de volumen ( CarVolumeGroupInfo.isMuted() ) se basará en si alguno de los silencios anteriores está habilitado.

Cuando el silencio HAL está habilitado, todos los cambios de volumen entrantes y las solicitudes de activación de grupo se ignoran mientras dure la restricción.

Caso de interacción: el silencio de HAL está activo y el usuario solicita silencio para alternar

Cuando el silencio HAL está habilitado y el silencio del usuario está deshabilitado:

  • El estado de silencio general del grupo de volúmenes cambia a true .
  • Se procesarán las solicitudes del Usuario para habilitar el silencio.
    • Motivo: las solicitudes de silencio de los usuarios deben respetarse en todo momento para preservar la privacidad de los usuarios.

Cuando el silencio HAL está habilitado y el silencio del usuario está habilitado:

  • El estado de silencio general del grupo de volúmenes cambia a true .

  • Las solicitudes del Usuario para desactivar el silencio NOT serán procesadas. El estado de silencio del usuario en caché permanece habilitado.

    • Motivo: Las solicitudes de activación del usuario solo se aceptarán si no hay restricciones activas.

    • Motivo: Desactivar el silencio del usuario en caché El silencio del usuario puede provocar una explosión de sonido no deseada y poner en peligro la seguridad del usuario. Esto es especialmente cierto si el estado de silencio está habilitado durante los ciclos de encendido, lo que reduce la conciencia de los usuarios sobre la percepción del nivel de sonido.

Caso de interacción: HAL Mute habilitado y deshabilitado mientras que el silencio del usuario no tiene cambios

Al alternar el silencio de HAL se cambiará el estado de silencio general del grupo de volúmenes. Sin embargo, no actualiza directamente el estado de silencio del usuario. Cuando el silencio del usuario está deshabilitado y se recibe una devolución de llamada de silencio HAL para habilitarlo:

  • El estado de silencio general del grupo de volúmenes cambia a true .
  • Las solicitudes del usuario para cambiar el volumen NOT se procesarán mientras el silencio HAL esté habilitado.

    • Motivo: el usuario no puede percibir el sonido mientras el silencio está habilitado. Permitir el cambio de volumen puede provocar una explosión de sonido y poner en peligro la seguridad del usuario.

    • Motivo: las aplicaciones de volumen pueden registrarse para devoluciones de llamada y activar un silencio (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) automáticamente sin intervención del usuario, si este es el comportamiento esperado por el OEM.

Cuando el silencio HAL está deshabilitado mientras el silencio del usuario está deshabilitado:

  • El estado de silencio del grupo de volúmenes se cambia a false .

    Motivo: Hacer que el estado de silencio sea fijo y solicitar al Usuario que desactive el silencio puede interrumpir innecesariamente al Usuario cuando los estados de silencio cambian con frecuencia.

  • Las solicitudes de los usuarios para cambiar el volumen se procesarán con normalidad.

Bloqueo

Las restricciones de bloqueo son:

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE .

Cuando las restricciones de bloqueo están activas, las solicitudes de los usuarios para:

  • El volumen de cambios no se procesa.
  • Se procesan los cambios de silencio.

Limitación

Las restricciones de limitación son:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Cuando las restricciones de limitación están activas, las solicitudes de los usuarios para:

  • Cambiar volumen:

    • Dentro de la limitación se procesan
    • Las limitaciones anteriores no se procesan
  • Se procesan los cambios de silencio.

Atenuación

Las restricciones de atenuación son:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

Cuando las restricciones de atenuación están activas, las solicitudes de los usuarios para:

  • Se procesa el volumen de cambios. El nuevo nivel de volumen actual se establece en el volumen atenuado (en lugar del volumen anterior). Los cambios de volumen futuros se realizan desde este nivel.

  • Se procesa la opción de silencio.

Actualizar al índice

Lo siguiente se considera actualización asincrónica del índice de volumen: Reasons.EXTERNAL_AMP_VOL_FEEDBACK .

Por este motivo, AudioControl HAL puede actualizar el índice actual del grupo de volúmenes al índice especificado. Esto se utiliza principalmente como retroalimentación del sistema de audio para la solicitud de cambio de volumen del marco de audio del automóvil. La actualización del índice también se comunica con Apps como una devolución de llamada CarVolumeGroupEvent para sincronizar el índice.

Ejemplos

Caso de uso: el usuario actualiza el índice de volumen a 30

  • El usuario usa la aplicación Volumen para cambiar el índice de volumen a 30.

  • Este índice se convierte en ganancia de volumen y se envía a Audio HAL.

  • Las implementaciones de Audio HAL de los proveedores reciben la nueva ganancia de volumen y actualizan el sistema de audio (como un amplificador externo).

  • El sistema de audio responde que el nivel de volumen solo se actualiza al índice 15 (por razones desconocidas para Android).

  • Implementaciones de proveedores de activadores AudioControl HAL :

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • El servicio de audio para el automóvil consume el nuevo índice de la devolución de llamada que se utiliza para la persistencia y las devoluciones de llamada a la aplicación de volumen. El índice solicitado por el usuario es 30. Sin embargo, la retroalimentación asincrónica del sistema de audio actualiza el índice a 15.

Caso de uso: primera reproducción de audio después de salir de la suspensión

  • El índice de volumen antes de la suspensión se establece en un nivel alto de 95 (rango: [0-99]).

  • Android entra en suspensión.

  • Una vez que Android exista, suspender (por ejemplo, reanudar):

    • El proveedor Audio HAL/AudioControl HAL aplica un índice seguro de 30 al sistema de audio localmente.

    • El proveedor AudioControl HAL también activa la devolución de llamada para el índice seguro:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • El servicio de audio para automóvil consume el nuevo índice de la devolución de llamada que se utiliza para la persistencia y sus propias devoluciones de llamada a la aplicación de volumen que sincroniza el índice. El índice de volumen antes de la suspensión es 95. Sin embargo, después de la reanudación, el implementador AudioControl HAL establece este índice en un nivel de volumen seguro de 30.

Configuración de volumen dinámico

Para esta característica consideramos los siguientes casos de uso principales:

  1. Configuración de fin de línea (EOL) del vehículo.

    • Los fabricantes de automóviles prefieren actualizar las configuraciones de volumen en el EOL según la configuración del sistema de audio del vehículo. Normalmente, se trata de una carga lateral sin actualizar la imagen del software de Android.

    • Es posible que los fabricantes de automóviles necesiten actualizar la configuración del volumen durante un programa de servicio.

  2. Configuración en tiempo de ejecución. Los sistemas de audio automotrices admiten configuraciones de amplificadores externos y estas ECU pueden albergar las configuraciones de rango de volumen que se consultan durante el tiempo de arranque.

  3. Configuración bajo demanda. Se ofrece para respaldar la creciente necesidad de funciones de audio basadas en la demanda en las que los usuarios se suscriben a un procesamiento de señal mejorado durante un período de tiempo. Las nuevas configuraciones de rango de volumen son válidas mientras dure la suscripción.

Diseño

La configuración dinámica del volumen se logra en tres etapas:

  • Descubrimiento. La implementación AudioControl HAL del proveedor descubre nuevas actualizaciones de rango de volumen a través de un mecanismo IPC personalizado propiedad del proveedor.

    Una vez descubierto, se genera una devolución de llamada a través de AudioControl::IModuleChangeCallback .

  • Actualizar. La pila de audio del automóvil actualiza los estados de los grupos de volumen con los nuevos rangos de volumen.

    Se hacen esfuerzos para mantener el mismo nivel de volumen después de la actualización del rango de volumen. Sin embargo, si el índice se sale de los límites, el índice de volumen actual se establece en un valor seguro. Por ejemplo, el nivel predeterminado proporcionado por el proveedor durante la devolución de llamada.

  • Llamar de vuelta.

    • Después de las actualizaciones del rango del grupo de volumen, la pila de audio del automóvil activa una devolución de llamada a las aplicaciones registradas a través de CarVolumeGroupEventCallback .

    • CarVolumeGroupEvent lleva CarVolumeGroupInfo actualizado, tipo de evento (qué cambió) e información adicional (por qué cambió).

imagen

Figura 1. Configuración de volumen dinámico.

API HAL

Control de audio @ 3.0 AIDL

La versión 3.0 de AudioControl AIDL HAL presenta las siguientes API:

API
IAudioControl#setModuleChangeCallback Establece una instancia de IModuleChangeCallback con AudioControl HAL.
IAudioControl#clearModuleChangeCallback Borra la instancia de IModuleChangeCallback previamente configurada con AudioControl HAL.
IModuleChangeCallback#onAudioPortsChanged Devolución de llamada para notificar cambios en AudioPorts

Secuencia

El diagrama de secuencia de la configuración del volumen dinámico se muestra a continuación.

imagen

Figura 2. Diagrama de secuencia para la configuración de volumen dinámico.

Aspectos clave

Para optimizar esta característica, considere lo siguiente.

  • Los AudioPorts suministrados como parte de la devolución de llamada deben coincidir con la definición de BUS automotriz:

    • Puerto del dispositivo. IN_DEVICE , OUT_DEVICE
    • Conexión. BUS
    • DIRECCIÓN. Definido en la definición de Audio HAL
    • Modo de ganancia. JOINT
  • Los proveedores deben definir un superconjunto de definiciones de rango de volumen en la política Audio HAL y utilizar la devolución de llamada para personalizarlo para las variantes del vehículo. Consulte la definición AIDL IModuleChangeCallbac para obtener más información.

  • Cuando más de un BUS de audio pertenece al mismo grupo de volumen, cada uno debe tener definiciones de rango de volumen idénticas. De no hacerlo, el sistema de audio del automóvil rechazará la nueva definición del rango de volumen.