Administración de volumen

La administración del volumen se encuentra en CarAudioService, que usa volúmenes fijos con la expectativa de que un amplificador de hardware aplique los volúmenes por debajo de la HAL en lugar de en el software. CarAudioService organiza los dispositivos de salida en grupos de volumen 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 según sea necesario):

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

Cuando la marca config_useFixedVolume no está establecida (o está establecida en false), las apps pueden llamar a AudioManager.setStreamVolume() para cambiar el volumen por tipo de transmisión en el mezclador de software. Esto no siempre es deseable debido a los posibles efectos en otras apps y al hecho de que la atenuación del volumen en el mezclador de software puede generar menos bits significativos disponibles en la señal cuando la recibe el amplificador de hardware.

Grupos de volúmenes

Los grupos de volumen 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 que las aplique el amplificador del vehículo. La configuración de volumen se conserva para el usuario y se carga cuando este accede a su cuenta.

Cómo definir grupos de volúmenes

CarAudioService usa grupos de volumen definidos en car_audio_configuration.xml:

<audioZoneConfiguration version="4">
    </deviceConfigurations>
    <activationVolumeConfigs>
        <activationVolumeConfig name="activation_volume_on_boot_config">
            <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
            invocationType="onBoot" />
        </activationVolumeConfig>
        ...
    </activationVolumeConfigs>
    <zones>
        <zone name="primary zone" isPrimary="true">
          <zoneConfigs>
              <zoneConfig name="primary zone config 0" isDefault="true">
                <volumeGroups>
                    <group activationConfig="activation_volume_on_boot_config">
                        <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>
              </zoneConfig>
              ...
            </zoneConfigs>
        </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.

Cómo configurar las ganancias del grupo 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:

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

Debido a la forma en que se configuran estos valores, es posible establecer la ganancia de un grupo de volumen fuera del rango admitido para un dispositivo asociado con el grupo de volumen. En este caso, para ese dispositivo, la ganancia se establece en el valor mínimo o máximo de ganancia del dispositivo, según 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 el tiempo de ejecución en el orden definido en el archivo XML. Los IDs varían de 0 a N-1 dentro de una zona de audio, donde N es la cantidad de grupos de volumen en esa zona. De esta manera, los IDs de grupos de volúmenes no son únicos en todas las 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 se establece de forma predeterminada en la zona de audio principal.

Administración del volumen en varias zonas

Se espera que cada zona de audio tenga uno o más grupos de volumen, y cada grupo de volumen solo se asocia con una sola 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 Cómo definir grupos de volúmenes.

Los niveles de volumen actuales de cada zona se conservan para el usuario asociado a esa zona. Estos parámetros de configuración son específicos 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 conservados para la primera zona difieren de los de la zona secundaria.

Volumen de activación mínimo y máximo

Android 15 introduce el control sobre los índices de grupos de volumen para mejorar la seguridad y la comodidad del usuario en los sistemas de audio del automóvil. Esto se logra con el uso de volúmenes de activación mínimos y máximos, configurados dentro de la configuración de audio del automóvil (consulta Cómo definir grupos de volumen). Puedes habilitar esta función configurando audioUseMinMaxActivationVolume como true en los RR.OO. de Car Service.

Puedes definir varias entradas de activationVolumeConfig en activationVolumeConfigs, cada una de las cuales representa una configuración de activación mínima y máxima diferente. Cada activationVolumeConfig:

  • Debe contener un name único en todo el archivo de configuración de audio del automóvil, de modo que se pueda hacer referencia a él en el grupo de volumen (group) más adelante.
  • Debe contener solo un activationVolumeConfigEntry.

Cada activationVolumeConfig contiene los siguientes atributos:

  • minActivationVolumePercentage (número entero, de 0 a 100, opcional, valor predeterminado: 0): Especifica el volumen mínimo de activación como porcentaje.
  • maxActivationVolumePercentage (número entero, de 0 a 100, opcional, valor predeterminado: 100): Especifica el volumen máximo de activación como porcentaje.
  • invocationType (cadena, opcional, valor predeterminado: onPlaybackChanged): Define las condiciones en las que se aplica el volumen de activación mínimo y máximo:

    • onBoot: Se aplica solo a la primera reproducción recién activa en un grupo de volúmenes después del inicio.
    • onSourceChanged: Se aplica solo a una reproducción recién activa con una fuente de app o UID cambiada en un grupo de volumen.
    • onPlaybackChanged: Se aplica a cada reproducción que se activa recientemente en un grupo de volúmenes.

CarAudioService administra la activación mínima y máxima supervisando los siguientes subcomponentes de audio activos actualmente:

  • Pistas de reproducción activas actuales
  • Estado de llamada actual
  • Solicitud de foco de audio actual del HAL de Audio Control, en la que la solicitud de foco de audio del HAL de Audio Control indica que se está reproduciendo audio de forma activa fuera de Android

En la siguiente imagen, se muestra una descripción general de alto nivel de la administración del volumen de activación mínimo y máximo:

imagen

Figura 1: Administración del volumen de activación mínimo y máximo de las rutas de datos de audio activos.

Con los valores minActivationVolumePercentage, maxActivationVolumePercentage, y los índices de ganancia de volumen mínimo y máximo especificados, puedes calcular el índice de ganancia de volumen de activación mínimo y máximo para cada grupo de volumen. CarAudioService supervisa cada reproducción recién activada y aplica el volumen de activación mínimo y máximo en las siguientes condiciones:

  • Coincidencia del tipo de invocación: El tipo de activación de la reproducción (derivado de Audio Manager, Audio Control HAL o Telephony Manager) debe coincidir con el invocationType especificado en el activationVolumeConfigEntry asociado con el grupo de volumen.
  • Índice de volumen fuera del rango: El índice de ganancia de volumen actual del grupo de volumen debe estar fuera del rango definido del índice de ganancia de volumen de activación. Específicamente, se debe cumplir una de las siguientes condiciones:

    • El índice es inferior al índice mínimo calculado de aumento del volumen de activación.

      O

    • El índice es más alto que el índice máximo calculado de aumento del volumen de activación.

Dado un evento de activación coincidente, el índice de ganancia de volumen del grupo de volúmenes se ajustará a uno de los siguientes valores:

  • Índice de ganancia de volumen de activación mínimo si es inferior al índice de ganancia de volumen de activación mínimo

    O

  • Índice de ganancia de volumen de activación máximo si es mayor que el índice de ganancia de volumen de activación máximo

Además, se envía un evento de grupo de volumen del automóvil con el tipo de evento EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED a todas las devoluciones de llamada de eventos de grupo de volumen registradas.

Cómo controlar eventos de la tecla 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 de la tecla de volumen a las apps. Las implementaciones para automóviles deben forzar que CarAudioService procese estos eventos de teclas, 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>

Actualmente, los eventos clave de volumen no tienen forma de distinguir para 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. Para ello, recupera los contextos de audio de los reproductores activos y, luego, ajusta el grupo de volumen que contiene el dispositivo de salida asociado con el contexto de audio de mayor prioridad. La priorización se determina según un orden fijo definido en CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.

Fundido y balance

Ambas versiones del HAL de AudioControl incluyen APIs para configurar la atenuación y el balance 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) desplaza el volumen de la bocina hacia el lado derecho (+) o izquierdo (-) del automóvil.

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

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

Tú decides cómo se deben aplicar estos valores y cómo mostrarlos a los usuarios. Se podrían aplicar estrictamente a los medios o de forma general a todos los sonidos de Android. Android 11 también introdujo la compatibilidad para aplicar efectos de audio a los dispositivos de salida. Con esto, es posible administrar de forma alternativa la atenuación y el balance a través de efectos de audio en los dispositivos de salida adecuados en lugar de 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 con mayor claridad otra transmisión que se reproduce de forma simultánea. 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 el HAL para tomar decisiones de atenuación es si dos dispositivos de salida tienen transmisiones activas.

Cuándo agacharse

Si bien depende de cada OEM determinar cómo el HAL controla la atenuación, recomendamos los siguientes lineamientos.

  • En Android, es común que se reproduzcan varias transmisiones cuando dos apps o servicios mantienen el enfoque de audio de forma simultánea. Para saber cuándo Android puede otorgar enfoque simultáneo, consulta la matriz de interacción en Tipos de restricción. Con la introducción del complemento de audio para automóviles, esto también depende de la administración de AudioFocus.

  • Android mezcla los flujos antes de aplicar cualquier ganancia. Por lo tanto, cualquier transmisión que deba atenuarse cuando se reproduzca de forma simultánea con otra debe enrutarse a dispositivos de salida separados para que el HAL pueda aplicar la atenuación antes de mezclarlas.

A continuación, se indican las posibles interacciones simultáneas para las que se recomienda la reducción de audio.

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

Consideraciones para la reducción de audio

Algunas apps y servicios, como la navegación o un asistente, pueden usar varios reproductores para realizar acciones. Evita la reducción agresiva cuando deja de fluir un flujo de datos a través de los dispositivos de salida para garantizar que el contenido multimedia no vuelva al volumen completo antes de reducirse antes de que comience la siguiente reproducción desde la navegación o una app de asistente.

En el caso de los vehículos con varias zonas de sonido con aislamiento suficiente, puedes enrutar el audio a diferentes áreas del automóvil en lugar de reducirlo. Por ejemplo, las instrucciones de navegación se pueden dirigir a los altavoces del apoyacabezas del conductor mientras se sigue reproduciendo música en toda la cabina a un volumen normal.

Sonidos críticos para la seguridad

Android 11 introdujo las APIs de HAL de enfoque de audio. El HAL garantiza que los sonidos críticos para la seguridad tengan prioridad sobre otros sonidos. Si el HAL mantiene el enfoque de audio durante 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.

Configura la IU de configuración de volumen

AAOS desacopla la IU de configuración del volumen de la configuración del grupo de volúmenes. Se pueden superponer como se describe en Cómo configurar las ganancias del grupo de volumen. Esta separación garantiza que no se requieran cambios si cambia la configuración de los grupos de volúmenes.

En la IU de configuración del auto, packages/apps/Car/Settings/res/xml/car_volume_items.xml contiene los elementos de la IU (recursos de título y de ícono) asociados con cada AudioAttributes.USAGE definido. Este archivo proporciona una renderización razonable del VolumeGroups definido usando los recursos asociados con el primer uso reconocido que se incluye en cada VolumeGroup.

Por ejemplo, en el siguiente ejemplo, se define un VolumeGroup que incluye voice_communication y voice_communication_signalling. La implementación predeterminada de la IU de configuración del auto renderiza VolumeGroup con los recursos asociados a voice_communication, ya que es la primera coincidencia 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 de grupo de volumen de automóviles

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

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

CarVolumeGroupInfo

El receptor de la devolución de llamada del evento tiene acceso directo a la lista de información del grupo de volumen de automóviles afectado. Esto significa que la app no necesita realizar llamadas adicionales al framework de Car audio para obtener el estado más reciente. Puede simplemente usar el CarVolumeGroupInfos recibido para actualizar la IU o los estados internos. Para facilitar el trabajo de las apps, los aspectos que cambiaron en un grupo de volúmenes de automóviles también se proporcionan como parte de EventTypes, como se explica a continuación.

EventTypes

Define qué aspecto de CarVolumeGroupInfo cambió. Las apps pueden usar este valor para identificar cambios y tomar las medidas 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.

EventType CarVolumeGroupInfo
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()

ExtraInfos

Proporciona información adicional sobre por qué cambió el CarVolumeGroup. Las apps pueden usar esta información para proporcionar contexto adicional y alertar al usuario para que actúe o para notificarle. 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. Queda a tu discreción determinar el proceso en función de ExtraInfos. 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 mensaje emergente que indique que la atenuación está activa y permitir que el usuario cambie el volumen.

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

CarVolumeGroupEvent se adapta para satisfacer las necesidades futuras del framework de audio para automóviles. Tenemos la intención de admitir funciones nuevas solo 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 del grupo de volumen del automóvil

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

  • Para 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 nuevo CarVolumeGroupEventCallback y el CarVolumeCallback heredado, se priorizan los eventos CarVolumeGroupEventCallbacks. La pila de audio del automóvil ya no activa CarVolumeCallback. Esto evita que se activen duplicados de la misma app para el mismo evento.

Te recomendamos que uses CarVolumeGroupEventCallback para administrar los cambios de volumen y silencio del grupo.

Devolución de llamada de ganancia de audio

Desde 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 los cambios en el sistema de audio del automóvil.

API de HAL

AudioControl @2.0 AIDL

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

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

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

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

Los motivos se pueden clasificar de la siguiente manera:

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

Tipos de restricciones

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

  • Silenciar
  • Bloqueo
  • Limitación
  • Atenuación
Restricción activa Cambio de volumen activado por el usuario Activar o desactivar el silencio activado por el usuario
Silenciar ❌ (activar el audio)

✔ (silenciar)
Bloqueo
Limitación ❌ (se superó el límite)

✔ (no se superó el límite)
Atenuación

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

Restricciones de silencio

Las restricciones de silencio son las siguientes:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Internamente, el framework de audio para automóviles mantiene estos dos estados de silencio:

  • Silenciamiento del usuario. Se activa o desactiva según la solicitud del usuario, ya sea a través de CarAudioManager o eventos de teclado.

  • Silencio de HAL. Se activa o desactiva según las restricciones de silencio recibidas a través de la devolución de llamada AudioGain.

Para los objetos de escucha, como la app de Configuración, el estado general de silencio del grupo de volúmenes (CarVolumeGroupInfo.isMuted()) se basará en si alguno de los silencios anteriores está habilitado.

Cuando el HAL mute está habilitado, se ignoran todas las solicitudes entrantes de cambio de volumen y de reactivación del silencio del grupo durante la restricción.

Caso de interacción: El HAL de silencio está activo y el usuario solicita el botón de activación de silencio

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

  • El estado general de silencio del grupo de volumen cambió 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 su privacidad.

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

  • El estado general de silencio del grupo de volumen cambió a true.

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

    • Motivo: Las solicitudes para reactivar el audio del usuario solo se aceptarán si no hay restricciones activas.

    • Motivo: Quitar el silencio del usuario almacenado en caché 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 en todos los ciclos de encendido, lo que reduce la percepción del nivel de sonido por parte de los usuarios.

Caso de interacción: Se habilita y se inhabilita el silencio del HAL mientras que el silencio del usuario no cambia

Si se activa o desactiva el silencio del HAL, se cambiará el estado general de silencio del grupo de volumen. Sin embargo, no actualiza directamente el estado de silencio del usuario. Cuando se inhabilita el silencio del usuario y se recibe la devolución de llamada de silencio del HAL para habilitar:

  • El estado general de silencio del grupo de volumen cambió a true.
  • Las solicitudes del usuario para cambiar el volumen se procesarán NOT mientras el silencio del 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 apps de volumen pueden registrarse para recibir devoluciones de llamada y activar la función para quitar el silencio (CarAudioManager.setVolumeGroupMute(…,/* mute=*/ true, …)) automáticamente sin intervención del usuario, si el OEM espera este comportamiento.

Cuando el silencio del HAL está inhabilitado y el silencio del usuario también lo está:

  • El estado de silencio del grupo de volumen cambió a false.

    Motivo: Hacer que el estado de silencio sea persistente y solicitar al usuario que reactive el sonido puede interrumpirlo innecesariamente cuando los estados de silencio se alternan con frecuencia.

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

Bloqueo

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 para realizar las siguientes acciones se rechazan:

  • Los cambios de volumen no se procesan.
  • Se procesan los cambios de silencio.

Limitación

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, los usuarios no pueden realizar las siguientes acciones:

  • Cambiar el volumen:

    • Se procesan las solicitudes dentro de la limitación
    • Las limitaciones anteriores no se procesan.
  • Se procesan los cambios 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 para realizar las siguientes acciones se rechazan:

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

  • Se procesó la activación o desactivación del silencio.

Actualizar el índice

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

Con este motivo, el 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 del framework de Car audio. La actualización del índice también se comunica con las 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 app de Volumen para cambiar el índice de volumen a 30.

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

  • Las implementaciones del proveedor deAudio 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 activadores deAudioControl HAL por parte del proveedor:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • El servicio de audio del automóvil consume el nuevo índice 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 actualización asíncrona de comentarios del sistema de audio actualiza el índice a 15.

Caso de uso: Primera reproducción de audio después de salir del modo de 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 existe, suspende (por ejemplo, reanuda):

    • 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 auto consume el nuevo índice 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 reanudar la reproducció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 fin de línea (EOL) del vehículo.

    • Los fabricantes de automóviles prefieren actualizar las configuraciones de volumen al final de la vida útil según la configuración del sistema de audio del vehículo. Por lo general, se trata de una carga lateral sin actualizar la imagen del SW 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 para automóviles admiten configuraciones de amplificador externo, y estas ECU pueden alojar las configuraciones de rango de volumen que se consultan durante el tiempo de arranque.

  3. Configuración según demanda. Se ofrece para satisfacer la creciente necesidad de funciones de audio basadas en la demanda, en las que los usuarios se suscriben a un procesamiento de señales mejorado durante un período. Los nuevos rangos de volumen son válidos durante la suscripción.

Diseño

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

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

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

  • Actualización: La pila de audio del automóvil actualiza los estados del grupo de volumen con los nuevos rangos de volumen.

    Se realizan esfuerzos para mantener el mismo nivel de volumen después de la actualización del rango de volumen. Sin embargo, si el índice está 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 del rango del grupo de volumen, la pila de audio del automóvil activa una devolución de llamada a las apps registradas a través de CarVolumeGroupEventCallback.

    • CarVolumeGroupEvent contiene los campos CarVolumeGroupInfo, Event-type (qué cambió) y Extra-info (por qué cambió) actualizados.

imagen

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

API de HAL

AudioControl @ 3.0 AIDL

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

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

Secuencia

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

imagen

Figura 3: Diagrama de secuencia para la configuración dinámica del volumen.

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 de BUS de Automotive:

    • Puerto del dispositivo: IN_DEVICE, 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 las variantes de vehículos. Consulta la definición de IModuleChangeCallbac en AIDL 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 lo contrario, el framework de audio del automóvil rechazará la nueva definición del rango de volumen.