En Android 10, car_audio_configuration.xml
reemplaza a car_volumes_groups.xml
y IAudioControl.getBusForContext
.
En el nuevo archivo de configuración, se define una lista de zonas. Cada zona tiene uno o más
grupos de volumen con sus dispositivos asociados, y cada dispositivo tiene los contextos que
deberían enrutarse dentro de esa zona. Es obligatorio que todos los contextos se representen dentro de cada zona.
Cómo configurar el enrutamiento de audio
Los archivos de políticas de audio, que suelen residir en la partición del proveedor, representan la configuración de hardware de audio de la placa. Todos los dispositivos a los que se hace referencia en car_audio_configuration.xml
deben definirse dentro de audio_policy_configuration.xml
.
Cómo habilitar el enrutamiento de AAOS
Para usar el enrutamiento basado en AAOS, debes establecer la marca audioUseDynamicRouting
en true
:
<resources> <bool name="audioUseDynamicRouting">true</bool> </resources>
Cuando sea false
, se inhabilitarán el enrutamiento y gran parte de CarAudioService
, y el SO recurrirá al comportamiento predeterminado de AudioService
.
Zona principal
De forma predeterminada, todo el audio se enrutará a la zona principal. Solo puede haber una zona principal, que se indica en la configuración con el atributo isPrimary="true"
.
Configuración de ejemplo
Por ejemplo, un vehículo podría tener dos zonas: una zona principal y un sistema de entretenimiento para asientos traseros. Con eso, un posible car_audio_configuration.xml
se definiría de la siguiente manera:
<audioZoneConfiguration version="2.0"> <zone name="primary zone" isPrimary="true"> <volumeGroups> <group> <device address="bus0_media_out"> <context context="music"/> <context context="announcement"/> </device> <device address="bus3_call_ring_out"> <context context="call_ring"/> </device> <device address="bus6_notification_out"> <context context="notification"/> </device> <device address="bus7_system_sound_out"> <context context="system_sound"/> <context context="emergency"/> <context context="safety"/> <context context="vehicle_status"/> </device> </group> <group> <device address="bus1_navigation_out"> <context context="navigation"/> </device> <device address="bus2_voice_command_out"> <context context="voice_command"/> </device> </group> <group> <device address="bus4_call_out"> <context context="call"/> </device> </group> <group> <device address="bus5_alarm_out"> <context context="alarm"/> </device> </group> </volumeGroups> </zone> <zone name="rear seat zone" audioZoneId="1"> <volumeGroups> <group> <device address="bus100_rear_seat"> <context context="music"/> <context context="navigation"/> <context context="voice_command"/> <context context="call_ring"/> <context context="call"/> <context context="alarm"/> <context context="notification"/> <context context="system_sound"/> <context context="emergency"/> <context context="safety"/> <context context="vehicle_status"/> <context context="announcement"/> </device> </group> </volumeGroups> </zones> </audioZoneConfiguration>
Aquí, la zona principal separó los contextos en diferentes dispositivos. Esto permite que el sistema HAL aplique diferentes efectos de procesamiento posterior y combinación en cada salida del dispositivo con el hardware del vehículo. Los dispositivos se organizaron en cuatro grupos de volumen: contenido multimedia, navegación, llamadas y alarmas. Si el sistema está configurado en useFixedVolume
, los niveles de volumen de cada grupo se pasarán al HAL para aplicarlos a la salida de estos dispositivos.
Para la zona secundaria, el resultado esperado es a través de un solo dispositivo de salida. En este ejemplo, todos los usos se enrutan al dispositivo y al grupo de volúmenes únicos para simplificar el proceso.
Configuración de audio de la zona para ocupantes
En Android 11, car_audio_configuration.xml
se expandió aún más para introducir dos campos nuevos: audioZoneId
y occupantZoneId
.
El primero, audioZoneId
, se puede usar para controlar mejor la administración de zonas.
Por otro lado, occupantZoneId
se puede usar para configurar el enrutamiento basado en el ID de usuario.
Para usar estos campos nuevos, se requiere la versión 2 de car_audio_configuration.xml
. Si revisas la configuración de audio anterior, pero usas el nuevo campo para la asignación de ID de zona de ocupante y de ID de zona de audio, la nueva configuración sin las definiciones de grupo de volumen se puede configurar de la siguiente manera:
<audioZoneConfiguration version="2.0"> <zone name="primary zone" isPrimary="true" occupantZoneId="0"> ... </zone> <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1"> ... </zone> </zones> </audioZoneConfiguration>
La configuración anterior define una asignación de la zona principal a la zona de ocupante 0 y de audioZoneId
1 a occupantZoneId
1. En general, se puede configurar cualquier asignación entre la zona de ocupantes y la zona de audio, pero la asignación debe ser uno a uno.
Estas son las reglas que definieron los dos campos nuevos:
- El
audioZoneId
de la zona principal siempre es cero. - Los números
audioZoneId
yoccupantZoneId
no se pueden repetir. audioZoneId
yoccupantZoneId
solo pueden tener una asignación uno a uno.
Enrutamiento a través de un UID de aplicación
Se introdujo una serie de APIs ocultas en CarAudioManager
en 10 para permitir que las apps consultaran y configuraran zonas de audio y enfoque.
int[] getAudioZoneIds(); int getZoneIdForUid(int uid); boolean setZoneIdForUid(int zoneId, int uid); boolean clearZoneIdForUid(int uid);
Las APIs anteriores permitían que una aplicación propia administrara el enrutamiento de audio según el UID de una aplicación. Por lo tanto, también se necesita el ID de la zona de audio y el UID de la aplicación. Con esa información en mano, se puede configurar el enrutamiento de audio con la API de CarAudioManager#setZoneIdForUid
.
Cambia zonas para una app
De forma predeterminada, todo el audio se enruta a la zona principal. Para actualizar una aplicación para que se enrute a una zona diferente, usa CarAudioManager#setZoneIdForUid
:
// Find zone to play int zoneId = ... // Find application's uid Int uid = mContext.getPackageManager() .getApplicationInfo(mContext.getPackageName(), 0) .uid; if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) { Log.d(TAG, "Zone successfully updated"); } else { Log.d(TAG, "Failed to change zone"); }
N Nota: Las transmisiones y el enfoque no pueden cambiar de zona de forma dinámica. Por lo tanto, se debe detener la reproducción y volver a solicitar el enfoque para cambiar de zona.
Enrutamiento con User-ID
Si bien el enrutamiento basado en UID de una aplicación permite un control preciso del enrutamiento de audio de cada aplicación, también requiere que el enrutamiento de audio de cada aplicación se defina antes de que la aplicación solicite el foco de audio y reproduzca audio. Para mitigar este problema y facilitar aún más que las aplicaciones de terceros reproduzcan audio sin modificaciones, CarAudioService
usa la asignación de la zona de ocupantes del automóvil y la zona de audio para definir el enrutamiento basado en el ID de usuario. De esta manera, cuando un usuario accede a la zona de ocupantes, se notifica al servicio de audio del automóvil. Con este indicador, la administración y el enrutamiento del enfoque de audio se configuran automáticamente para todas las zonas de audio.
Aún se puede usar el enrutamiento basado en UID de las aplicaciones, pero se debe hacer independientemente del enrutamiento de ID de usuario. Esto significa que, si se define la asignación de la zona del ocupante a la zona de audio del automóvil, se inhabilita el enrutamiento basado en UID y se mostrará un error si se intenta llamar a CarAudioManager#setZoneidForUid
.
Si bien la enrutación de audio y la administración de enfoque se simplificaron con la administración de zonas de ocupación, el usuario aún debe asignarse a una zona de ocupación. Esto se puede hacer con CarOccupantZoneManager#assignProfileUserToOccupantZone
. Esta API requiere permiso para administrar usuarios. La expectativa actual es que los OEM administren la asignación de usuarios a zonas de ocupantes a través de algún tipo de IU del sistema. Una vez que se complete, se configurarán automáticamente el inicio de la aplicación, el enrutamiento de audio y la administración de enfoque para el usuario.
Enrutamiento con setPreferredDevice
Además de los cambios anteriores, Android 11 también tiene una nueva API para consultar los dispositivos de salida asociados con cada zona, CarAudioManager#getOutputDeviceForUsage(int zoneId, int usage).
La API se puede usar para consultar un dispositivo de salida para una zona en particular y un uso de atributo de audio. De esta manera, las aplicaciones propias pueden enrutar el audio a diferentes zonas mediante la API de setPreferredDevice
del reproductor. La API de getOutputDeviceForUsage
requiere PERMISSION_CAR_CONTROL_AUDIO_SETTINGS
y es una API del sistema. A continuación, se muestra un ejemplo de cómo encontrar el dispositivo multimedia de una zona en particular y enrutar a ese dispositivo con la API de setPreferredDevice
.
audioZoneId = ... ; mediaDeviceInfo = mCarAudioManager .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA); … mPlayer.setPreferredDevice(mediaDeviceInfo);