Antes de iniciar una transmisión lógica, una app solicita el foco de audio con los mismos atributos de audio que se usan para la transmisión lógica. La app debe respetar las pérdidas de enfoque para funcionar según lo previsto en los casos de uso automotriz.
Si bien se recomienda enviar una solicitud de enfoque, el sistema no la aplica. Por lo tanto, considera el enfoque como un medio para controlar indirectamente y evitar conflictos durante la reproducción, en lugar de como un mecanismo principal de control de audio. El vehículo no debe depender del sistema de enfoque para el funcionamiento del subsistema de audio.
Interacciones de enfoque
Para admitir AAOS, las solicitudes de enfoque de audio se controlan según las interacciones predefinidas entre el CarAudioContext
de la solicitud y el de los titulares del enfoque actuales. Existen tres tipos de interacciones:
- Exclusivo
- Rechazar
- Concurrent
Interacción exclusiva
Este es el modelo de interacción que se usa con mayor frecuencia en Android.
En las interacciones exclusivas, solo una app puede mantener el foco a la vez.
Por lo tanto, se otorga el foco a una solicitud entrante, mientras que el titular del foco existente lo pierde. Como ambas apps reproducen contenido multimedia, solo una puede mantener el foco. Como resultado, la solicitud de enfoque de la app recién iniciada se devuelve con AUDIOFOCUS_REQUEST_GRANTED
, mientras que la app de música en reproducción actual recibe un evento de cambio de enfoque con un estado de pérdida que corresponde al tipo de solicitud que se realizó.
Rechazar interacción
Con las interacciones de rechazo, siempre se rechaza la solicitud entrante. Por ejemplo, cuando se intenta reproducir música mientras hay una llamada en curso. En este caso, si el Marcador mantiene el foco de audio para una llamada y una segunda app solicita el foco para reproducir música, la app de música recibe AUDIOFOCUS_REQUEST_FAILED
en respuesta a la solicitud. Como se rechaza la solicitud de enfoque, no se envía ninguna pérdida de enfoque al titular del enfoque actual.
Interacción simultánea
Las interacciones simultáneas son exclusivas de AAOS. Esto permite que las apps que solicitan el foco de audio en el auto puedan mantenerlo de forma simultánea con otras apps. Para que se produzca una interacción simultánea, se deben cumplir las siguientes condiciones. La
La solicitud de enfoque entrante debe solicitar AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
El titular del enfoque actual no setPauseWhenDucked(true)
El titular del enfoque actual decide no recibir eventos de reducción de audio.
Si se cumplen estos criterios, la solicitud de enfoque se devuelve con AUDIOFOCUS_REQUEST_GRANTED
, mientras que el titular del enfoque actual no experimenta ningún cambio en el enfoque. Sin embargo, si el titular del enfoque actual opta por recibir eventos de atenuación o por pausar la reproducción cuando se atenúa el audio, el titular del enfoque actual pierde el enfoque, como ocurre con una interacción exclusiva.
Cómo controlar transmisiones simultáneas
Si bien la interacción simultánea tiene muchos usos, ten cuidado con la mezcla y la atenuación a nivel del hardware en los dispositivos de salida. Te recomendamos que las instancias de CarAudioContext
que pueden reproducirse de forma simultánea se enruten a diferentes dispositivos de salida.
Al tener dispositivos de salida separados para transmisiones simultáneas, el HAL puede reducir el volumen de una de las transmisiones antes de mezclarlas o enrutar las transmisiones físicas a diferentes bocinas del vehículo. Si los flujos lógicos se mezclan en Android, las ganancias no se alteran y se entregan como parte del mismo flujo físico.
Por ejemplo, cuando se entregan la navegación y el contenido multimedia de forma simultánea, la ganancia del flujo de contenido multimedia podría reducirse temporalmente (o atenuarse) para que las instrucciones de navegación se puedan escuchar con mayor claridad. Como alternativa, el flujo de navegación se puede dirigir a los parlantes del lado del conductor mientras el contenido multimedia sigue reproduciéndose en el resto de la cabina.
Matriz de interacción
En esta tabla, se muestra la matriz de interacción según la define CarAudioService
.
Cada fila representa el CarAudioContext
del elemento que tiene el enfoque actual, y cada columna representa el de la solicitud entrante.
Por ejemplo, cuando una app de música multimedia mantiene el foco mientras una app de navegación lo solicita, la matriz indica que las dos interacciones pueden reproducirse de forma simultánea, suponiendo que se cumplan los demás criterios para las interacciones simultáneas.
Debido a las interacciones simultáneas, es posible tener más de un titular del enfoque. En este caso, una solicitud de enfoque entrante se compara con cada uno de los titulares de enfoque actuales antes de determinar qué interacción aplicar. En este caso, gana la interacción más conservadora. Rechazo, luego exclusiva y, por último, simultánea.
Figura 1: Es la matriz de interacción del foco de audio.
Navegación durante las llamadas telefónicas
En Android 11, se introdujo un nuevo parámetro de configuración del usuario para permitir que los usuarios modifiquen el comportamiento de interacción entre la navegación y las llamadas telefónicas. Cuando se configura, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL
cambia la interacción entre las solicitudes de enfoque de NAVIGATION
entrantes y los titulares de enfoque de CALL
actuales de simultáneas a rechazos. Si un usuario prefiere que las instrucciones de navegación no interrumpan una llamada, puede habilitar el parámetro de configuración. Este valor se conserva para el usuario y se puede establecer de forma dinámica para que las solicitudes de enfoque posteriores respeten el nuevo parámetro de configuración.
Foco de audio demorable
En Android 11, AAOS agregó compatibilidad para solicitar el enfoque de audio retrasable. Esto permite que las solicitudes de enfoque no transitorias se retrasen cuando su interacción con los titulares del enfoque actual normalmente haría que se rechazaran. Una vez que un cambio en el enfoque da como resultado un estado en el que la solicitud demorada puede obtener el enfoque, se otorga la solicitud.
Reglas para las solicitudes de foco de audio retrasadas
Solo solicitudes no transitorias. Solo se puede realizar una solicitud retrasada para fuentes no transitorias, de modo que no se reproduzca un sonido transitorio mucho después de que sea pertinente.
Solo se puede retrasar una solicitud a la vez. Si se realiza una solicitud aplazable mientras ya hay una solicitud aplazada, la solicitud aplazada original recibe un evento de cambio
AUDIOFOCUS_LOSS
y la nueva solicitud recibe una respuesta síncrona deAUDIOFOCUS_REQUEST_DELAYED
.Las solicitudes aplazables deben tener
OnAudioFocusChangeListener
. Después de que se retrasa una solicitud, se usa el objeto de escucha para notificar al solicitante cuando finalmente se otorga la solicitud (AUDIOFOCUS_GAIN
) o si se rechaza más adelante (AUDIOFOCUS_LOSS
).
Cómo solicitar el enfoque demorable
Para crear una solicitud que se pueda retrasar, haz lo siguiente:
Utiliza
AudioFocusRequest.Builder#setAcceptsDelayedFocusGain
.mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener(); mDelayedFocusRequest = new AudioFocusRequest .Builder(AudioManager.AUDIOFOCUS_GAIN) .setAudioAttributes(mMusicAudioAttrib) .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener) .setForceDucking(false) .setWillPauseWhenDucked(false) .setAcceptsDelayedFocusGain(true) .build();
Cuando realices la solicitud, controla la respuesta
AUDIOFOCUS_REQUEST_DELAYED
:int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest); if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // start audio playback return; } if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) { // audio playback delayed to audio focus listener return; }
Cuando se retrasa la solicitud, el objeto de escucha del enfoque controla los cambios en el enfoque:
private final class MediaWithDelayedFocusListener implements OnAudioFocusChangeListener { @Override public void onAudioFocusChange(int focusChange) { synchronized (mLock) { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: … // Start focus playback case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: … // Pause media transiently case AudioManager.AUDIOFOCUS_LOSS: … // Stop media
Atenuación aplicada por el sistema
Android 15 introduce la función de atenuación de audio aplicada por el sistema en AAOS. En Android, el sistema no aplica el foco de audio. Por lo tanto, si bien se recomienda a los desarrolladores de apps que cumplan con los lineamientos sobre el enfoque de audio, si una app sigue reproduciendo contenido a un volumen alto, incluso luego de haber perdido el enfoque de audio, el sistema no puede impedirlo.
En los entornos automotrices críticos para la seguridad, el cumplimiento del enfoque de audio es vital para minimizar la distracción del conductor. Con esta función, el framework de audio ahora atenúa automáticamente las apps que pierden el foco de audio, lo que genera una experiencia de audio más controlada y predecible.
Esta mejora ayuda a garantizar que las apps cumplan con la decisión de pérdida de enfoque de audio según lo define la matriz de interacción, lo que evita conflictos de reproducción de audio.
Diseño de alto nivel
En la siguiente figura, se muestran el diseño de alto nivel y la compatibilidad con la función de pérdida de enfoque en los automóviles:
Figura 2: Diseño de alto nivel para la función de atenuación aplicada por el sistema.
- Fundido segmentado: La aplicación del sistema del fundido en Android 15 está diseñada específicamente para situaciones en las que una app pierde el enfoque de audio, pero sigue reproduciendo audio.
- Mecanismo de fundido de salida: Cuando una app pierde el foco de audio ante una nueva app solicitante, sucede lo siguiente:
- El framework de audio aplica automáticamente el fundido de salida del audio de la app que pierde el foco.
- Después del desvanecimiento, el sistema silencia el flujo de audio.
- Luego, la app recibe una notificación de pérdida de foco de audio.
- Las apps que se comportan de forma incorrecta se silencian hasta que recuperan el foco de audio.
- La lógica predeterminada es mostrar gradualmente las apps que se ocultaron después de 2 segundos. Sin embargo, los OEM pueden configurar este valor en cualquier tiempo de espera.
- El framework de audio usa las configuraciones del OEM para las operaciones de atenuación de entrada y salida.
Archivo de configuración del OEM: Android 15 incluye un nuevo archivo de configuración,
car_audio_fade_configuration.xml
:- Este archivo permite que los OEM definan criterios para cuando se aplique la aplicación del enfoque de audio del sistema a una app que pierde el enfoque.
- El framework de audio solo aplica el efecto de atenuación y el silencio si la app que pierde el enfoque coincide con las reglas definidas por el OEM en este archivo XML.
- Esto proporciona un mecanismo para que los OEM personalicen el comportamiento de la función según las características de la app o los tipos de uso de audio.
Control de funciones con RRO: Se introdujo una nueva marca de función de superposición de recursos en tiempo de ejecución (RRO),
audioUseFadeManagerConfiguration
, para habilitar o inhabilitar esta función:- La función está inhabilitada de forma predeterminada.
- Para activar la pérdida de enfoque de audio aplicada por el sistema, los OEM deben establecer esta marca en
true
. - Si bien el framework de audio para automóviles espera definiciones de configuración de atenuación válidas cuando la marca está habilitada, la ausencia de tales definiciones no genera automáticamente una excepción fatal.
- Todas las apps de las configuraciones de transición deben tener definiciones de transición coincidentes. Es un error grave llamar a una configuración de atenuación (por su nombre) como parte de la configuración de audio del automóvil sin proporcionar una definición válida.
- Cuando la marca está inhabilitada, se ignoran todas las definiciones de configuración de atenuación y las referencias de configuración.
Configuración del administrador de atenuación
El framework de audio de Android 15 presenta un FadeManagerConfiguration
unificado para proporcionar a los OEM un control detallado sobre el comportamiento de atenuación de audio. Este marco de trabajo se ilustra en la figura 3:
Figura 3: Es la configuración del administrador de atenuación.
Esta configuración incluye lo siguiente:
- Propiedades de transición de atenuación: Parámetros de configuración para la atenuación de salida y la atenuación de entrada.
- Se puede definir con usos o atributos de audio específicos.
- Permite establecer la configuración de duración personalizada.
- Estos parámetros de configuración se usan para construir
VolumeShaper.Configuration
.
- Políticas de atenuación: Son las reglas que rigen cuándo se produce la atenuación.
- Es un botón de activación global para habilitar o inhabilitar el efecto de atenuación.
- Es una lista configurable de usos de audio que se pueden atenuar (aptos para atenuarse cuando pierden el enfoque).
- Las listas de exclusiones (que no se pueden atenuar) evitan que se atenúen las fuentes de audio críticas o designadas. Estas listas pueden basarse en lo siguiente:
- Tipos de contenido
- Atributos de audio
- UID de la app (solo se puede configurar durante el tiempo de ejecución)
Configuraciones de OEM
En esta sección, analizaremos las personalizaciones disponibles para los OEM.
Archivo XML de configuración de atenuación de audio del automóvil
Android 15 introduce un nuevo archivo de configuración, car_audio_fade_configuration.xml
, que permite una amplia personalización por parte del OEM del comportamiento de atenuación de audio durante la pérdida de enfoque.
- Este archivo XML permite definir varias configuraciones de atenuación distintas, cada una de las cuales requiere un nombre único para hacer referencias cruzadas dentro de
car_audio_configuration.xml
. - Estas configuraciones se pueden aplicar de forma flexible en diferentes zonas de audio y configuraciones de zona.
- En particular, cada configuración de atenuación solo acepta valores de duración en milisegundos, que el sistema usa de forma interna para generar el
VolumeShaper.Configuration
correspondiente.
Para obtener orientación práctica sobre la implementación, consulta los ejemplos de configuración proporcionados para el emulador que se encuentra en device/generic/car/emulator/audio/car_audio_fade_configuration.xml
.
Archivo XML de configuración de audio del automóvil
Android 15 introduce un archivo car_audio_configuration.xml
actualizado, ahora en la versión 4, que incorpora nuevas etiquetas applyFadeConfigs
y fadeConfig
.
La etiqueta applyFadeConfigs
puede contener varias definiciones de fadeConfig
, lo que permite una configuración de atenuación flexible. Cada definición cumple con las siguientes especificaciones:
- Debe incluir un
fadeConfig
predeterminado designado conisDefault = true
. - Puede incluir varias definiciones de
fadeConfig
transitorias. Estas configuraciones transitorias se aplican específicamente durante las interacciones de pérdida de foco de audio y solo cuando la app que obtiene el foco de audio coincide con los criterios definidos en la configuración transitoria.
Para obtener orientación práctica sobre la implementación, consulta los ejemplos de configuración proporcionados para el emulador que se encuentra en device/generic/car/emulator/audio/car_audio_configuration.xml
.
Extensión de servicio de enfoque de audio para OEM
Los OEM que implementan un servicio de enfoque de audio para automóviles personalizado tienen la flexibilidad de configurar los ajustes de atenuación de audio incluyéndolos en OemCarAudioFocusResult
.
Esto se puede lograr con el método de compilador setAudioAttributesToCarAudioFadeConfigurationMap()
:
/** @see OemCarAudioFocusResult#getAudioAttributesToCarAudioFadeConfigurationMap() **/
@NonNull
public Builder setAudioAttributesToCarAudioFadeConfigurationMap(@NonNull
Map<AudioAttributes, CarAudioFadeConfiguration> attrsToCarAudioFadeConfig) {
}
En particular, los OEM pueden optar por usar parámetros de configuración de atenuación durante el inicio preconfigurados o aplicar parámetros de configuración de forma dinámica a través de su servicio de enfoque de audio personalizado, lo que ofrece un control adaptable.
Diagrama de secuencia
En este diagrama de secuencia, se ilustra el comportamiento después de que se otorga el foco de audio a App2
y la posterior pérdida del foco de audio por parte de App1
:
- Cuando el servicio de audio del automóvil envía la pérdida de enfoque de audio a
App1
, la reproducción del reproductor deApp1
se desvanece según lo definen losFadeManagerConfiguration
s activos. Una vez que se completa la operación de atenuación,App1
recibe la devolución de llamada estándar de pérdida de enfoque de audio. - De manera opcional, el audio de
App1
puede volver a aparecer después de un período configurable. Los OEM tienen la flexibilidad de establecer esta duración a través deBuilder#setFadeInDurationForUsage(int, long)
según los requisitos específicos de sus productos.
Figura 4: Diagrama de secuencia de la función de atenuación de audio del automóvil.
Administración de enfoque en varias zonas
En el caso de los vehículos con varias zonas de audio, el enfoque de audio se administra de forma independiente para cada zona. Por lo tanto, una solicitud a una zona no tiene en cuenta lo que mantiene el enfoque en otras zonas, ni hace que los titulares del enfoque en otras zonas lo pierdan. Con esto, el enfoque de la cabina principal se puede administrar por separado de un sistema de entretenimiento en los asientos traseros, por lo que los cambios de enfoque en una zona no interrumpen la reproducción de audio en otra.
En todas las apps, CarAudioService
administra el enfoque automáticamente. La zona de audio de una solicitud de enfoque se determina por su UserId
o UID
asociado (para obtener más detalles, consulta Enrutamiento de audio multizona).
Solicita audio de varias zonas de forma simultánea
Si una app quiere reproducir audio en varias zonas de forma simultánea, debe solicitar el enfoque para cada zona incluyendo AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
en el paquete:
//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
zoneId);
AudioAttributes attributesWithZone = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.addBundle(bundle)
.build();
//Create focus request using built attributesWithZone
Este parámetro del paquete permite que el solicitante anule las asignaciones automáticas de zonas de audio para usar el ID de zona especificado. Por lo tanto, una app podría emitir solicitudes separadas para diferentes zonas de audio.
Foco de audio del HAL
A partir de Android 11, el HAL está habilitado para solicitar el enfoque en nombre de transmisiones externas. Si bien es opcional, se recomienda usar estas APIs para permitir que los sonidos externos sean participantes óptimos en el ecosistema de Android y para proporcionar una experiencia del usuario fluida.
El HAL toma la determinación final sobre qué sonidos deben tener prioridad. En este sentido, los sonidos críticos de seguridad y emergencia se deben reproducir independientemente de si el HAL tiene el enfoque de audio y se deben seguir reproduciendo según corresponda, incluso si el HAL pierde el enfoque de audio. Lo mismo sucede con los sonidos que exigen las reglamentaciones gubernamentales.
El HAL debe silenciar de forma proactiva los flujos de Android según corresponda cuando se reproduzcan sonidos de emergencia o de seguridad críticos para garantizar que se escuchen con claridad.
AudioControl@2.0
La versión 2.0 de la HAL de AudioControl presenta estas nuevas APIs:
API | Propósito |
---|---|
IAudioControl#registerFocusListener |
Registra una instancia de IFocusListener con el HAL de AudioControl. Este objeto de escucha permite que el HAL solicite y abandone el foco de audio. El HAL proporciona una instancia de ICloseHandle para que Android la use para cancelar el registro del objeto de escucha. |
IAudioControl#onAudioFocusChange |
Notifica al HAL sobre los cambios de estado para enfocar las solicitudes realizadas por el HAL a través de IFocusListener , incluidas las respuestas a las solicitudes de enfoque iniciales. |
IFocusListener#requestAudioFocus |
Las solicitudes se enfocan en nombre de la HAL para un uso, un ID de zona y un tipo de ganancia de enfoque especificados. |
IFocusListener#abandonAudioFocus |
Abandona las solicitudes de enfoque existentes del HAL para el uso y el ID de zona especificados. |
El HAL puede tener varias solicitudes de enfoque al mismo tiempo, pero se limita a una solicitud por cada par de ID de uso y zona. Android supone que el HAL comienza a reproducir sonidos para un uso inmediatamente después de que se realiza una solicitud y continúa haciéndolo hasta que abandona el foco.
Además de registerFocusListener
, estas solicitudes son oneway
para garantizar que Android no retrase el HAL mientras se procesa una solicitud de enfoque. El HAL no debe esperar a obtener el enfoque antes de reproducir sonidos críticos para la seguridad. Es opcional que el HAL escuche y responda a los cambios en el foco de audio a través de IAudioControl#onAudioFocusChange
.
Servicio de enfoque de audio para automóviles de OEM
En Android 14, AAOS introdujo los servicios de complementos del OEM del automóvil para habilitar la capacidad de configuración de algunos componentes del automóvil. En el caso de Car Audio Plugin Service, el servicio de complemento permite que los OEM administren las solicitudes de enfoque interceptadas por el servicio de audio del automóvil. Esto les brinda a los OEM más flexibilidad para administrar el enfoque según lo exigen las reglas y reglamentaciones. Por lo tanto, la interacción del enfoque de audio puede variar entre los fabricantes y de una región a otra. La premisa básica del enfoque de audio sigue siendo la misma: las apps deben solicitar el enfoque para administrar mejor el audio y mejorar la experiencia del usuario. En general, se siguen aplicando ciertas reglas para las solicitudes de enfoque de audio de las apps:
Sin ningún enfoque de audio permanente y de alta prioridad (incluida una llamada telefónica, una alerta de emergencia o una notificación de seguridad), las apps deberían poder obtener el enfoque de audio de forma transitoria o permanente.
Mientras un enfoque de medios está activo, sucede lo siguiente:
Las apps que solicitan el enfoque de uso de llamadas deben poder recibir la llamada de forma simultánea o exclusiva.
Las apps que solicitan el enfoque de uso de la navegación deben poder recibir el enfoque de navegación de forma simultánea o exclusiva.
Las apps que solicitan el enfoque de uso del asistente deben poder recibirlo de forma simultánea o exclusiva.
Mientras las apps con enfoque de audio de prioridad alta (incluidas las llamadas telefónicas, las alertas de emergencia o las notificaciones de seguridad) estén activas, se debe otorgar o retrasar cualquier solicitud de enfoque de audio retrasada entrante según sea necesario.
Si bien estas sugerencias no son exhaustivas, pueden ayudar a las apps que solicitan el enfoque a obtenerlo si no existen sonidos activos de alta prioridad. Incluso mientras los sonidos de alta prioridad están activos, se deben respetar las solicitudes de enfoque retrasadas y se debe poder obtener el enfoque cuando se detiene el sonido de alta prioridad.