La administración de volumen se encuentra en CarAudioService
, que usa volúmenes fijos con la expectativa de que un amplificador de hardware aplique los volúmenes debajo del HAL en lugar de hacerlo 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
(superposición según sea necesario):
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
Cuando no se establece la marca config_useFixedVolume
(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. Esto puede no ser deseable en todo momento 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 el amplificador de hardware la recibe.
Grupos de volúmenes
Los grupos de volumen administran los volúmenes de un conjunto 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.
Define grupos de volumen
CarAudioService usa grupos de volumen 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 volúmenes
Cada grupo de volumen 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 volumen.
<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 volumen 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 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.
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 la 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 en formato XML.
Los IDs van del 0
al N-1
dentro de una zona de audio, en la que N
es la cantidad de grupos de volumen en esa zona. De esta manera, los IDs de los grupos de volúmenes no son únicos entre las zonas. Estos identificadores se usan para las APIs de CarAudioManager
asociadas con grupos de volumen. Cualquier API que tome un groupId
sin un zoneId
se establece de forma predeterminada en la zona de audio principal.
Administración de volúmenes multizona
Se espera que cada zona de audio tenga uno o más grupos de volumen, y cada grupo de volumen solo se asocie 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 Define grupos de volúmenes.
Los niveles de volumen actuales de cada zona se conservan 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 de teclas de volumen a las apps. Las implementaciones para la industria automotriz deben forzar que CarAudioService
procese estos eventos de tecla, que luego llama a setGroupVolume
o setMasterMute
, según corresponda. Para forzar este comportamiento, establece la marca config_handleVolumeKeysInWindowManager
como true
:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
Actualmente, los eventos de teclas 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 recuperando 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 en función de un orden fijo definido en CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
.
Atenuación 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 al 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 las bocinas hacia el lado derecho (+) o izquierdo (-) del automóvil.- 0.0 está centrado
- +1.0 es completamente a la derecha.
- -1.0 está completamente a la izquierda.
- Un valor fuera del rango de -1 a 1 es un error.
setFadeTowardFront(float value)
cambia el volumen de la bocina hacia la parte delantera (+) o trasera (-) del automóvil.- 0.0 está centrado
- +1.0 es completamente hacia adelante.
- -1.0 está completamente hacia atrás
- Un valor fuera del rango de -1 a 1 es un error.
Tú decides cómo deben aplicarse estos valores y cómo mostrarlos a los usuarios. Se pueden aplicar estrictamente al contenido multimedia o a todos los sonidos de Android. Android 11 también introdujo compatibilidad para aplicar efectos de audio a dispositivos de salida. Con esto, es posible administrar la atenuación y el balance de forma alternativa a través de efectos de audio en los dispositivos de salida adecuados en lugar de hacerlo a través de estas APIs.
Autosilenciado de fondo
La disminución automática del volumen de audio 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, el HAL implementa la atenuación de audio. 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 silenciamiento es si dos dispositivos de salida tienen transmisiones activas o no.
Cuándo agacharse
Si bien depende de cada OEM determinar cómo el HAL controla la atenuación, te recomendamos que sigas los siguientes lineamientos.
Por lo general, se reproducen varias transmisiones en Android cuando dos apps o servicios tienen el foco 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 restricciones. Con la introducción del complemento de audio para automóviles, esto también depende de la administración de AudioFocus.
Las transmisiones que Android combina se hacen antes de que se apliquen las ganancias. Por lo tanto, cualquier transmisión que se deba atenuar cuando se reproduce de forma simultánea con otra debe enrutarse a dispositivos de salida separados para que el HAL pueda aplicar la atenuación antes de mezclarlos.
Comportamiento de atenuación recomendado
A continuación, se muestran las posibles interacciones simultáneas para las que se recomienda la atenuación.
Interacción | Acción |
---|---|
EMERGENCY
| Silencia todo excepto SAFETY
|
SAFETY |
Oculta todo excepto EMERGENCY |
NAVIGATION |
Omite todo excepto SAFETY y EMERGENCY |
CALL |
Omite todo excepto SAFETY , EMERGENCY y NAVIGATION . |
VOICE |
Patos CALL_RING |
VEHICLE_SOUNDS |
Tú determinas la importancia del sonido activo y si se silencian otros sonidos. |
MUSIC y ANNOUNCEMENT |
Se esquivó todo. Las excepciones son los tonos de interacción táctil que se reproducen como SYSTEM_SOUND .
|
Consideraciones para usar la función de atenuación
Algunas apps y servicios, como la navegación o un asistente, pueden usar varios reproductores para realizar acciones. Evita la reducción agresiva cuando una transmisión de datos deja de fluir a través de los dispositivos de salida para garantizar que el contenido multimedia no vuelva al volumen completo antes de que se reduzca antes de la próxima reproducción de la navegación o de que se inicie una app de asistente.
En el caso de los vehículos con varias plataformas de sonido con un aislamiento lo suficientemente bueno, puedes desviar el audio a diferentes áreas del automóvil en lugar de atenuarlo. Por ejemplo, las instrucciones de navegación se pueden dirigir a las bocinas del reposacabezas del conductor mientras se sigue reproduciendo música en la cabina a un volumen normal.
Sonido de seguridad crítica
Android 11 introdujo las APIs de enfoque de audio de HAL. El sistema HAL se asegura de que los sonidos esenciales para la seguridad tengan prioridad sobre otros. Si el HAL mantiene el enfoque de audio para USAGE_EMERGENCY
, no se garantiza que las apps y los servicios de Android no reproduzcan sonidos. El HAL determina qué transmisiones de Android se deben mezclar o silenciar para reproducir sonidos esenciales para la seguridad.
Configura la IU de configuración de volumen
AAOS separa la IU de configuración de volumen de la configuración del grupo de volumen. Se pueden superponer como se describe en Configura las ganancias de los grupos 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 automóvil, packages/apps/Car/Settings/res/xml/car_volume_items.xml
contiene los elementos de la IU (recursos de título y ícono) 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 contenido en cada VolumeGroup
.
Por ejemplo, en el siguiente ejemplo, se define un VolumeGroup
como lo que incluye voice_communication
y voice_communication_signalling
. La implementación predeterminada de la IU de configuración del automóvil renderiza el VolumeGroup
con los recursos asociados con voice_communication
, ya que ese es el primer partido 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 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 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 del automóvil
Los casos de uso de Automotive de la actualización de volumen y el botón de silenciamiento tienen bases contextuales que pueden definir las acciones de ciertas apps, como la configuración de volumen. La devolución de llamada de volumen y silenciamiento actual de la pila de audio del automóvil proporciona información contextual limitada. Para ofrecer una mejor escalabilidad y casos de uso para la industria automotriz, se agregó CarVolumeGroupEvent a Android 14. Cada evento contiene tres tipos de información fundamentales:
- Lista de
CarVolumeGroupInfo
EventTypes
(mapeado de bits)- Lista de
ExtraInfos
CarVolumeGroupInfo
El receptor de la devolución de llamada del evento tiene acceso inmediato a la lista de información del grupo de volumen del automóvil afectado. Esto significa que la app no necesita realizar llamadas adicionales al framework de audio para automóviles para obtener el estado más reciente. Simplemente puede usar el CarVolumeGroupInfos
recibido para actualizar la IU o los estados internos. Para facilitar el uso de las apps, los aspectos que cambiaron en un grupo de volumen de automóvil 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 esto 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
correspondiente cambió y se puede consultar a través de 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 realice una acción o le envíe una notificación. 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
. Depende de ti 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 aviso que indique que la función de atenuación está activa y permitir que el usuario cambie el volumen.
El framework de audio para automóviles 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 escala para satisfacer las necesidades futuras del framework de audio para automóviles. Solo admitiremos funciones nuevas a través de CarVolumeGroupEvent
. Te recomendamos que los desarrolladores de apps usen CarVolumeGroupEvent
para controlar el volumen del grupo y silenciar los cambios.
Devolución de llamada del evento de 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 recibir devoluciones 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 prioriza el evento CarVolumeGroupEventCallbacks
.
La pila de audio del automóvil ya no activa CarVolumeCallback
. Esto evita que se dupliquen los activadores 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 automóvil.
API de HAL
AIDL de AudioControl @2.0
La versión 2.0 del HAL de AIDL de AudioControl 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 cambios en la configuración de ganancia de audio. |
La devolución de llamada de HAL de AudioControl incluye listas de motivos y el AudioGainConfigInfo
correspondiente, que consta de lo siguiente:
- ID de zona
- Dirección del puerto del dispositivo
- Índice de volumen > El índice puede ser un índice restringido o un índice de actualización.
Los motivos se pueden clasificar de la siguiente manera:
- Motivos de la restricción. Cambio transitorio en el volumen y el comportamiento de silenciamiento.
- Motivos de la actualización. Cambio permanente en el comportamiento del volumen.
Tipos de restricciones
A partir de AudioControl
HAL AIDL
V3
, los siguientes son los tipos de restricciones compatibles:
- Silenciar
- Bloqueo
- Limitación
- Atenuación
Restricción activa | Cambio de volumen activado por el usuario | Activación o desactivación del silencio activada por el usuario |
---|---|---|
Silenciar | ❌ | ❌ (activar sonido) ✔ (silenciar) |
Bloqueo | ❌ | ✔ |
Limitación | ❌ (supera el límite) ✔ (no supera el límite) |
✔ |
Atenuación | ✔ | ✔ |
La prioridad entre las restricciones es Silenciar > Bloquear > Limitar > Atenuar.
Restricciones de silenciamiento
Las restricciones de silenciamiento son las siguientes:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
El framework de audio para automóviles mantiene internamente estos dos estados de silenciamiento:
Silenciar al usuario. Se activa o desactiva según la solicitud del usuario, ya sea a través de
CarAudioManager
o eventos de teclas.Silenciamiento de HAL. Se activa o desactiva según las restricciones de silenciamiento 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 silenciamiento general del grupo de volumen (CarVolumeGroupInfo.isMuted()
) se basará en si está habilitado cualquiera de los silenciamientos anteriores.
Cuando se habilita la función de silenciamiento de HAL, se ignoran todas las solicitudes entrantes de cambio de volumen y de activación del sonido del grupo durante el período de la restricción.
Caso de interacción: La función de silenciamiento de HAL está activa y el usuario solicita el botón de activación de silenciamiento
Cuando el silenciamiento de HAL está habilitado y el silenciamiento del usuario está inhabilitado:
- El estado de silenciamiento general del grupo de volumen se cambia a
true
. - Se procesarán las solicitudes del usuario para habilitar la función de silenciamiento.
- Motivo: Las solicitudes de silenciamiento de los usuarios deben cumplirse en todo momento para preservar su privacidad.
Cuando el silenciamiento de HAL y el del usuario están habilitados, sucede lo siguiente:
El estado de silenciamiento general del grupo de volumen se cambia a
true
.Se procesarán las solicitudes del usuario para inhabilitar la función de silenciamiento.
NOT
El estado silenciado del usuario almacenado en caché permanece habilitado.Motivo: Las solicitudes de los usuarios para activar el sonido solo se respetarán si no hay restricciones activas.
Motivo: Si se activa el sonido silenciado almacenado en caché del usuario, es posible que se produzca una explosión de sonido no deseada y se ponga en riesgo la seguridad del usuario. Esto es especialmente cierto si el estado de silenciamiento está habilitado en todos los ciclos de encendido, lo que reduce la percepción de los usuarios sobre el nivel de sonido.
Caso de interacción: Se habilitó y desactivó la función Silenciar HAL mientras que la función Silenciar del usuario no tiene cambios.
Si activas o desactivas el modo silencio de HAL, se cambiará el estado de silenciamiento general del grupo de volumen. Sin embargo, no actualiza directamente el estado de silenciamiento del usuario. Cuando se inhabilita la función Silenciar usuario y se recibe la devolución de llamada de silenciamiento de HAL para habilitarla, sucede lo siguiente:
- El estado de silenciamiento general del grupo de volumen se cambia a
true
. Las solicitudes del usuario para cambiar el volumen se
NOT
procesarán mientras esté habilitada la función de silenciamiento de HAL.Motivo: El usuario no puede percibir el sonido mientras la función de silenciamiento está habilitada. 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 una anulación del silencio (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) automáticamente sin intervención del usuario, si este es el comportamiento esperado del OEM.
Cuando el silenciamiento de HAL está inhabilitado mientras el silenciamiento del usuario está inhabilitado:
El estado de silenciamiento del grupo de volumen cambia a
false
.Motivo: Hacer que el estado de silenciamiento sea fijo y solicitarle al usuario que lo desactive puede interrumpirlo innecesariamente cuando los estados de silenciamiento se alternan con frecuencia.
Las solicitudes de los usuarios para cambiar el volumen se procesarán de forma normal.
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, los usuarios no pueden realizar las siguientes acciones:
- Los cambios de volumen no se procesarán.
- Se procesan las acciones para activar o desactivar el silenciamiento.
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, se rechazan las solicitudes de los usuarios para realizar las siguientes acciones:
Cambiar el volumen:
- Se procesan dentro de los límites
- Las limitaciones anteriores no se procesan.
Se procesan las acciones para activar o desactivar el silenciamiento.
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 hacer lo siguiente no se llevan a cabo:
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 de volumen futuros se realizan desde este nivel.
Se procesó la opción para activar o desactivar el sonido.
Actualiza el índice
La siguiente acción se considera la actualización asíncrona del índice de volumen: Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Por 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 audio para vehículos. 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: 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 de proveedores de
Audio HAL
reciben la nueva ganancia de volumen y actualizan el sistema de audio (como el 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 de
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, los comentarios asíncronos del sistema de audio actualizan el índice a 15.
Caso de uso: Primera reproducción de audio después de salir del estado suspendido
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 para vehículos 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 reanudar, el implementador de
AudioControl HAL
configura 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 SO de Android.
Es posible que los fabricantes de automóviles deban actualizar la configuración del volumen durante un programa de mantenimiento.
Configuración del entorno de ejecución. Los sistemas de audio para automóviles admiten configuraciones de amplificadores externos, y estas ECU pueden alojar las configuraciones de rango de volumen que se consultan durante el inicio.
Configuración a pedido. Se ofrece para satisfacer la creciente necesidad de funciones de audio basadas en la demanda en las que los usuarios se suscriben al procesamiento de señal mejorado durante un período. Las nuevas configuraciones de rango de volumen son válidas durante el período de una suscripción.
Diseño
La configuración de volumen dinámico se logra en tres etapas:
Descubrimiento. La implementación de 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 descubre, se genera una devolución de llamada a través de
AudioControl::IModuleChangeCallback
.Actualiza. La pila de audio para automóviles 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 sale 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 publicar 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
lleva elCarVolumeGroupInfo
actualizado, el tipo de evento (qué cambió) y la información adicional (por qué cambió).
Figura 1: Configuración de volumen dinámico
API de HAL
AudioControl en AIDL 3.0
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 cambios en AudioPorts |
Secuencia
A continuación, se muestra el diagrama de secuencias de la configuración de volumen dinámico.
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 que se proporcionan 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
- Address. Se define en la definición de 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 AIDL de
IModuleChangeCallbac
para obtener más información.Cuando más de un BUS de audio pertenece al mismo grupo de volumen, cada uno debe tener definiciones de rango de volumen idénticas. De lo contrario, el framework de audio del automóvil rechazará la nueva definición del rango de volumen.