Administración del volumen

La administración de volúmenes se encuentra en CarAudioService, que usa volúmenes fijos con la expectativa de que los volúmenes se apliquen por debajo de la 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 volumen.

Volúmenes fijos

Las implementaciones de AAOS usan un amplificador de hardware para controlar el volumen, en lugar de un mezclador de software. Para evitar efectos secundarios, establece la marca config_useFixedVolume en true (superpón si es necesario):

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

Cuando la marca config_useFixedVolume no está configurada (o se establece en false), las apps 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 conveniente debido a posibles efectos en otras apps y al hecho de que la atenuación de volumen en el mezclador de software puede generar menos bits significativos disponibles en la señal cuando el amplificador de hardware la recibe.

Grupos de volúmenes

Los grupos de volúmenes administran los volúmenes para 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 que las aplique el amplificador del vehículo. La configuración de volumen se mantiene para el usuario y se carga cuando el usuario accede.

Define grupos de volúmenes

CarAudioService usa 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.

Configura las ganancias del grupo de volumen

Cada grupo de volúmenes tiene valores de ganancia mínimos, máximos y predeterminados, además de un tamaño del 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:

  • Tamaño del paso. Debe ser el mismo para todos los dispositivos controlados por el grupo de volumen.
  • Ganancia mínima. La menor ganancia mínima entre los dispositivos del grupo.
  • Ganancia máxima. La ganancia máxima más alta entre los dispositivos del grupo.
  • Ganancia predeterminada. Es la ganancia predeterminada más alta entre los dispositivos del grupo.

Dada la forma en que se configuran estos valores, es posible establecer 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 volúmenes es inferior o superior al rango.

Identificadores de grupos de volúmenes

Los grupos de volúmenes se identifican en el entorno de ejecución en el orden definido en el archivo en formato XML. Los ID varían de 0 a N-1 en una zona de audio, en la que N es la cantidad de grupos de volúmenes en esa zona. De esta manera, los IDs de grupos de volúmenes no son únicos entre zonas. Estos identificadores se usan para las APIs de CarAudioManager asociadas con grupos de volúmenes. Cualquier API que tome un groupId sin un zoneId usa la zona de audio principal de forma predeterminada.

Administración de volúmenes multizona

Se espera que cada zona de audio tenga uno o más grupos de volumen, y cada uno de ellos 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, consulta el ejemplo anterior en Define grupos de volumen.

Los niveles de volumen actuales de cada zona se mantienen para el usuario asociado con esa zona. Esta configuración es específica de la zona, lo que significa que, si un usuario accede a una pantalla asociada con la zona principal y, luego, accede a una zona asociada con una zona de audio secundaria, los niveles de volumen cargados y persistentes para la primera zona difieren de los de la zona secundaria.

Cómo controlar eventos de teclas de volumen

Android define varios códigos de teclas para el control de volumen, incluidos los siguientes:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

De forma predeterminada, Android enruta los eventos clave de volumen a las apps. Las implementaciones de Automotive deben forzar el procesamiento de estos eventos de clave por parte de CarAudioService, que luego llama a setGroupVolume o setMasterMute, según corresponda. Para forzar este comportamiento, establece la marca config_handleVolumeKeysInWindowManager en true:

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

Por el momento, los eventos de teclas de volumen no tienen forma de distinguir para qué zona están destinados y se supone que están asociados con la zona de audio principal. Cuando se recibe un evento de tecla de volumen, CarAudioService determina qué grupo de volumen se debe ajustar recuperando los contextos de audio de 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.

Atenuación y equilibrio

Ambas versiones de la HAL de AudioControl incluyen APIs para configurar la atenuación y el equilibrio en el vehículo. Las APIs del sistema correspondientes para CarAudioManager pasan valores a la HAL de AudioControl. Estas APIs requieren android.car.permission.CAR_CONTROL_AUDIO_VOLUME. Las APIs de AudioControl son las siguientes:

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

    • 0.0 está centrado
    • +1.0 está completamente bien
    • -1.0 queda por completo.
    • Un valor fuera del rango de -1 a 1 es un error
  • setFadeTowardFront(float value) mueve el volumen de la bocina hacia la parte delantera (+) o trasera (-) del automóvil.

    • 0.0 está centrado
    • +1.0 está completamente desviado.
    • -1.0 se ubica por completo en la parte posterior.
    • Un valor fuera del rango de -1 a 1 es un error

Tú decides cómo se deben aplicar estos valores y cómo se muestran a los usuarios. Pueden aplicarse estrictamente al contenido multimedia o de manera global a todos los sonidos de Android. Android 11 también introdujo compatibilidad con la aplicación de efectos de audio a dispositivos de salida. De esta manera, es posible administrar de forma alternativa la atenuación y el equilibrio a través de efectos de audio en los dispositivos de salida apropiados, en lugar de hacerlo a través de estas APIs.

Autosilenciado de fondo

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

Cuándo agacharte

Si bien depende del OEM individual determinar cómo controla el autosilenciado de fondo por la HAL, recomendamos los siguientes lineamientos.

  • Por lo general, las transmisiones múltiples que se reproducen en Android ocurren cuando dos apps o servicios tienen foco de audio al mismo tiempo. Para saber cuándo Android puede otorgar el enfoque simultáneo, consulta la matriz de interacción en Tipos de restricciones. Con la introducción del complemento de audio para vehículos, esto también depende de la administración de AudioFocus.

  • Cualquier transmisión mezclada por Android se realiza antes de aplicar las mejoras. Por lo tanto, cualquier transmisión que se deba atenuar cuando se reproduzca de forma simultánea con otra debe enrutarse a dispositivos de salida separados para que la HAL pueda aplicar el autosilenciado antes de mezclarlas.

A continuación, se muestra cómo se recomienda el autosilenciado de fondo de interacciones simultáneas potenciales.

Interacción Acción
EMERGENCY Apaga o silencia todo, excepto SAFETY
SAFETY Apaga todo, excepto EMERGENCY
NAVIGATION Arroja todo, excepto SAFETY y EMERGENCY
CALL Arroja todo, excepto SAFETY, EMERGENCY y NAVIGATION
VOICE Patos CALL_RING
VEHICLE_SOUNDS Tú determinas la importancia del sonido activo y si disminuye o no otros sonidos.
MUSIC y ANNOUNCEMENT Agachado por todo. Las excepciones son los tonos de interacción táctil que se reproducen como SYSTEM_SOUND.

Consideraciones para el atenuación

Algunas apps y servicios, como la navegación o un asistente, podrían usar varios jugadores para realizar acciones. Evita la disminución agresiva del volumen cuando una transmisión de datos deja de fluir a través de los dispositivos de salida para asegurarte de que el contenido multimedia no vuelva al volumen completo antes de que se atenúe antes3 de la siguiente reproducción desde la navegación o de que se inicie una app de asistente.

En el caso de los vehículos con varias etapas de sonido con un aislamiento suficientemente bueno, puedes dirigir el audio a diferentes áreas del vehículo en lugar de atenuar el volumen. Por ejemplo, las instrucciones de navegación se pueden enrutar a las bocinas del reposacabezas del conductor mientras se continúa reproduciendo música en toda la cabina a un volumen normal.

Sonidos críticos de seguridad

Android 11 introdujo las APIs de foco de audio de HAL. La HAL garantiza que los sonidos esenciales para la seguridad tengan prioridad sobre otros sonidos. Si la HAL mantiene el foco de audio para USAGE_EMERGENCY, no se garantiza que las apps y los servicios de Android no reproduzcan sonidos. La HAL determina qué transmisiones de Android se deben mezclar o silenciar para reproducir sonidos críticos para la seguridad.

Cómo establecer la IU de la configuración del volumen

AAOS separa la IU de configuración de volumen de la configuración del grupo de volúmenes. Estas se pueden superponer como se describe en Configura 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 IU de la configuración del vehículo, packages/apps/Car/Settings/res/xml/car_volume_items.xml contiene los elementos de la IU (recursos de íconos y títulos) asociados con cada AudioAttributes.USAGE definido. Este archivo proporciona una renderización razonable del VolumeGroups definido mediante el uso de recursos asociados con el primer uso reconocido que se incluye en cada VolumeGroup.

En el siguiente ejemplo, se define que un elemento VolumeGroup incluye voice_communication y voice_communication_signalling. La implementación predeterminada de la IU de configuración del vehículo renderiza el VolumeGroup con los recursos asociados con voice_communication, ya que es el primer matc en el 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 los valores que se usan en la configuración anterior se declaran en packages/apps/Car/Settings/res/values/attrs.xml. La IU de configuración de volumen usa las siguientes APIs de CarAudioManager basadas en VolumeGroup:

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

Evento del grupo de volumen del vehículo

Los casos de uso de Automotive, como la actualización del volumen y el botón de activación para silenciar, tienen fundamentos contextuales que pueden definir las acciones de ciertas apps, como la configuración del volumen. La devolución de llamada actual de volumen y silencio de la pila de audio del vehículo proporciona información contextual limitada. Para entregar un mejor servicio a los casos de uso automotores y la escalabilidad futura, se agregó CarVolumeGroupEvent a Android 14. Cada evento lleva tres tipos fundamentales de información:

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

InformaciónDeGrupoDeCarVolumen

El receptor de la devolución de llamada de eventos tiene acceso listo a la lista de información del grupo de volúmenes del vehículo afectado. Eso significa que la app no necesita realizar llamadas adicionales al framework de audio del vehículo para obtener el estado más reciente. Simplemente puede usar el CarVolumeGroupInfos recibido para actualizar la IU o los estados internos. Para facilitar el proceso de las apps, los aspectos que cambiaron en un grupo de volumen del vehículo también se proporcionan como parte de EventTypes, como se explica a continuación.

Tipos de eventos

Define qué aspecto de CarVolumeGroupInfo cambió. Las apps pueden usar esto para identificar cambios y realizar las acciones necesarias. Por ejemplo, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED indica que el índice de ganancia de volumen máximo CarVolumeGroups respectivo cambió y se puede consultar con CarVolumeGroupInfo.getMaxVolumeGainIndex().

En la siguiente tabla, se muestra la relación entre EventType y CarVolumeGroupInfo.

Tipo de evento InformaciónDeGrupoDeCarVolumen
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
TIPO_DE_EVENTO_MUTE_CHANGED CarVolumeGroupInfo.isSilenciad()
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é cambió CarVolumeGroup. Las apps pueden usar esta información para proporcionar contexto adicional a fin de alertar al usuario para que actúe o notifique. Por ejemplo, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL indica una atenuación transitoria activa debido a una sobrecarga térmica. La app puede informar al usuario si intenta aumentar el volumen.

No aplicamos ningún proceso para ExtraInfos. Puedes determinar el proceso en función de ExtraInfos a tu discreción. Por ejemplo, si la atenuación está activa debido a EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED, también puedes optar por atenuar la IU de la barra de volumen inicialmente para evitar que el usuario cambie el volumen. Otros pueden optar por mostrar un aviso de que el autosilenciado está activo y permitir que el usuario cambie el volumen.

El framework de audio del vehículo depende de IAudioGainCallback de la HAL de AudioControl para proporcionar el ExtraInfos sugerido. Para obtener más información, consulta Devolución de llamada de obtención de audio.

CarVolumeGroupEvent escala para satisfacer las necesidades futuras del framework de audio del vehículo. Nuestro objetivo es admitir funciones nuevas únicamente a través de CarVolumeGroupEvent. Recomendamos que los desarrolladores de apps usen CarVolumeGroupEvent para controlar los cambios de volumen y silencio del grupo.

Devolución de llamada de evento de grupo de volumen del vehículo

Android 14 proporciona una nueva devolución de llamada para que las apps con privilegios y de plataforma se registren y reciban notificaciones de CarVolumeGroupEvents.

  • Si quieres registrarte para la devolución de llamada, usa CarAudioManager#registerCarVolumeGroupEventCallback().

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

Si una app se registra con el CarVolumeGroupEventCallback nuevo y el CarVolumeCallback heredado, se priorizará el evento CarVolumeGroupEventCallbacks. La pila de audio del vehículo ya no activa CarVolumeCallback. Esto evita activadores duplicados en la misma app para el mismo evento.

Te recomendamos que uses CarVolumeGroupEventCallback para administrar el volumen del grupo y silenciar los cambios.

Devolución de llamada de ganancia de audio

A partir de Android 13, la HAL de AudioControl puede activar una devolución de llamada asíncrona para administrar las actualizaciones del nivel de volumen debido a cambios en el sistema de audio del vehículo.

API de HAL

AudioControl @2.0 AIDL

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

API Propósito
IAudioControl#registerGainCallback Registra una instancia de IAudioGainCallback con la HAL de AudioControl.
IAudioGainCallback#onAudioDeviceGainsChanged Es la devolución de llamada asíncrona para notificar cambios en la configuración de ganancia de audio.

La devolución de llamada de la HAL de AudioControl incluye listas de motivos y el AudioGainConfigInfo respectivo, que consiste en lo siguiente:

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

A grandes rasgos, los motivos se pueden clasificar de la siguiente manera:

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

Tipos de restricciones

A partir del AudioControl HAL AIDL V3, se admiten las siguientes restricciones:

  • Silenciar
  • Se bloquea
  • Limitaciones
  • Atenuación
Restricción activa Cambio de volumen activado por el usuario Botón de activación para silenciar activado por el usuario
Silenciar ❌ (activar el sonido)

✔ (silenciar)
Se bloquea
Limitaciones ❌ (superar el límite)

✔ (no superar el límite)
Atenuación

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

Restricción de elementos silenciados

Las restricciones de elementos silenciados son las siguientes:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

El framework del audio del vehículo mantiene internamente estos dos estados de silencio:

  • Silencio del usuario. Se activa en función de la solicitud del usuario, ya sea mediante CarAudioManager o eventos clave.

  • Silencio del HAL Se activa en función de las restricciones de silencio recibidas a través de la devolución de llamada de AudioGain.

Para los objetos de escucha, como la app de Configuración, el estado de silencio general del grupo de volumen (CarVolumeGroupInfo.isMuted()) se basará en si se habilita cualquiera de los elementos silenciados anteriores.

Cuando se habilita el sonido de HAL, se ignoran todas las solicitudes entrantes de cambio de volumen y activación de sonido de grupo mientras dure la restricción.

Caso de interacción: La HAL está activa y el usuario solicita el botón de activación de Silenciamiento

Cuando se habilita el sonido de HAL y se inhabilita el sonido del usuario, ocurre lo siguiente:

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

Cuando se habilita el sonido de HAL y se habilita el sonido del usuario, ocurre lo siguiente:

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

  • Se procesarán las solicitudes del usuario para inhabilitar el sonido NOT. El estado de silencio del usuario almacenado en caché permanece habilitado.

    • Motivo: Las solicitudes para activar el sonido del usuario solo se respetarán si no hay restricciones activas.

    • Motivo: Activar el sonido de la caché del usuario para silenciar 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 se habilita durante los ciclos de encendido, lo que reduce el conocimiento de los usuarios sobre la percepción del nivel de sonido.

Caso de interacción: Silenciamiento de HAL habilitado e inhabilitado mientras Silenciamiento de usuario no tiene cambios

Activar o desactivar la función para silenciar el HAL cambiará el estado general de silencio del grupo de volumen. Sin embargo, no actualiza directamente el estado de silenciamiento del usuario. Cuando se inhabilita la función para silenciar el usuario y se recibe la devolución de llamada de silencio del usuario de HAL para habilitar, sucede lo siguiente:

  • El estado de silencio general del grupo de volúmenes cambió a true.
  • Las solicitudes del usuario para cambiar el volumen NOT se procesarán mientras esté habilitada la opción para silenciar HAL.

    • Motivo: El usuario no puede percibir el sonido mientras la función de silencio está habilitada. Si permites un cambio de volumen, es posible que se produzca una explosión de sonido y que se ponga en riesgo la seguridad de los usuarios.

    • Motivo: Las apps de volumen pueden registrarse para devoluciones de llamada y activar un sonido (CarAudioManager.setVolumeGroupSilenciar(...,/* mutable=*/ true,..)) automáticamente sin intervención del usuario, si este es el comportamiento que espera el OEM.

Cuando se inhabilita la función para silenciar de HAL y está inhabilitada la opción para silenciar usuarios, ocurre lo siguiente:

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

    Motivo: Hacer que el estado de silencio sea fijo y solicitarle al usuario que active el sonido puede interrumpir al usuario de forma innecesaria cuando los estados de silencio se activan con frecuencia.

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

Se bloquea

Las restricciones de bloqueo son las siguientes:

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

Cuando las restricciones de bloqueo están activas, las solicitudes de los usuarios pueden hacer lo siguiente:

  • No se procesarán los cambios de volumen.
  • Se procesaron los elementos para activar o desactivar la función de silencio.

Limitaciones

Las restricciones de limitación son las siguientes:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Cuando las restricciones de limitación están activas, las solicitudes de los usuarios a lo siguiente:

  • Cambiar el volumen:

    • Se procesan dentro de la limitación
    • No se procesan los límites anteriores.
  • Se procesaron los elementos para activar o desactivar la función de silencio.

Atenuación

Las restricciones de atenuación son las siguientes:

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

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

  • Se procesaron los cambios de volumen. El nuevo nivel de volumen actual se establece en el volumen atenuado (en lugar del volumen anterior). A partir de este nivel, se realizarán los próximos cambios en el volumen.

  • Se procesó la activación de la función para silenciar.

Actualizar al índice

Lo siguiente se considera como la actualización asíncrona del índice de volumen: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

Por este motivo, la HAL de AudioControl puede actualizar el índice actual del grupo de volumen al índice especificado. Se usa principalmente como comentarios del sistema de audio para la solicitud de cambio de volumen desde el framework de Car Audio. La actualización del índice también se comunica con las apps como una devolución de llamada de CarVolumeGroupEvent para sincronizar el índice.

Ejemplos

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

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

  • Este índice se convierte en aumento de volumen y se envía a la HAL de audio.

  • Las implementaciones de proveedores de Audio HAL 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 motivos desconocidos para Android).

  • Implementaciones de proveedores de activadores AudioControl HAL:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • El servicio de audio para vehículos consume el índice nuevo de la devolución de llamada que se usa para la persistencia y las devoluciones de llamada a la app de volumen. El índice solicitado por el usuario es 30. Sin embargo, la respuesta asíncrona 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 la suspensión (por ejemplo, reanudar):

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

    • 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 del vehículo consume el índice nuevo de la devolución de llamada que se usa para la persistencia y sus propias devoluciones de llamada a la app 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 de AudioControl HAL establece este índice en un nivel de volumen seguro de 30.

Configuración de volumen dinámico

Para esta función, consideramos los siguientes casos de uso principales:

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

    • Los fabricantes de automóviles prefieren actualizar la configuración del volumen en el EOL según la configuración del sistema de audio del vehículo. Por lo general, se trata de una transferencia sin actualizar la imagen del SO de Android.

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

  2. Configuración del entorno de ejecución. Los sistemas de audio de la industria automotriz admiten configuraciones de amplificadores externos, y estas ECU pueden alojar las configuraciones de rango de volumen que se consultan durante el tiempo de inicio.

  3. Configuración a pedido. Se ofrece para respaldar la necesidad creciente de funciones de audio basadas en la demanda en las que los usuarios se suscriban al procesamiento de señales mejorado durante un período. Las nuevas opciones de configuración del rango de volumen son válidas durante toda la suscripción.

Diseño

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

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

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

  • Actualizar. La pila de audio del vehículo actualiza los estados de los grupos de volúmenes con los nuevos rangos de volumen.

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

  • Devolución de llamada.

    • Después de las actualizaciones de rango del grupo de volumen, la pila de audio del vehículo activa una devolución de llamada para las apps registradas a través de CarVolumeGroupEventCallback.

    • CarVolumeGroupEvent contiene el elemento CarVolumeGroupInfo actualizado, el tipo de evento (qué cambió) y la información adicional (por qué cambió).

image

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

API de HAL

AudioControl con AIDL 3.0

La versión 3.0 de la HAL del AIDL de AudioControl incluye las siguientes APIs:

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

Secuencia

A continuación, se muestra el diagrama de secuencias de la configuración del volumen dinámico.

image

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

Aspectos clave

Para optimizar esta función, ten en cuenta lo siguiente.

  • Los AudioPorts proporcionados como parte de la devolución de llamada deben coincidir con la definición del BUS de Automotive:

    • Puerto del dispositivo. IN_DEVICE y OUT_DEVICE
    • Conexión. BUS
    • Dirección. Se define en la definición de la HAL de audio.
    • Modo de ganancia. JOINT
  • Los proveedores deben definir un superconjunto de definiciones de rango de volumen en la política de HAL de audio y usar la devolución de llamada para personalizarlo para variantes de vehículos. Para obtener más información, consulta la definición del AIDL de IModuleChangeCallbac.

  • Si 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 lo contrario, el framework del audio del vehículo rechazará la definición nueva del rango de volumen.