Foco de audio

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

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.

Matriz de interacción del foco de audio

Figura 1: Es la matriz de interacción del foco de audio.

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 de AUDIOFOCUS_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:

  1. 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();
    
  2. 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;
    }
    
  3. 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:

Diseño de alto nivel para la función de atenuación aplicada por el sistema

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:

Configuración del administrador de atenuación

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 con isDefault = 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 de App1 se desvanece según lo definen los FadeManagerConfigurations 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 de Builder#setFadeInDurationForUsage(int, long) según los requisitos específicos de sus productos.

Diagrama de secuencia de la función de atenuación de audio del automóvil

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.