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:
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 elactivationVolumeConfigEntry
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.
Comportamiento de reducción recomendado
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()
ygetGroupMaxVolume()
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 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 activadores de
AudioControl 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:
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.
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.
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 camposCarVolumeGroupInfo
, Event-type (qué cambió) y Extra-info (por qué cambió) actualizados.
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.
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
- Puerto del dispositivo:
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.