Foco de audio

Antes de iniciar una transmisión lógica, una aplicación solicita el foco de audio usando los mismos atributos de audio que se usan para la transmisión lógica. La aplicación debe respetar las pérdidas de enfoque para funcionar como se espera en los casos de uso automotrices.

Si bien se recomienda enviar una solicitud de enfoque, el sistema no lo exige. Por lo tanto, considere 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 debería 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 manejan en función de interacciones predefinidas entre el CarAudioContext de la solicitud y el de los titulares de enfoque actuales. Hay tres tipos de interacciones:

  • Exclusivo
  • Rechazar
  • Concurrente

Interacción exclusiva

Este es el modelo de interacción más utilizado con Android.

En interacciones exclusivas , solo una aplicación puede mantener el foco a la vez. Por lo tanto, a una solicitud de enfoque entrante se le concede el enfoque mientras que el titular del enfoque existente lo pierde. Dado que ambas aplicaciones reproducen medios, solo una aplicación puede mantener el foco. Como resultado, la solicitud de enfoque de la aplicación recién iniciada se devuelve con AUDIOFOCUS_REQUEST_GRANTED mientras que la aplicación que actualmente reproduce música 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 , la solicitud entrante siempre se rechaza. Por ejemplo, cuando 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 aplicación solicita el foco para reproducir música, la aplicación de música recibe AUDIOFOCUS_REQUEST_FAILED en respuesta a la solicitud. Dado que se rechaza la solicitud de foco, no se envía ninguna pérdida de foco al titular de foco actual.

Interacción concurrente

Exclusivo de AAOS son las interacciones simultáneas . Esto brinda a las aplicaciones que solicitan enfoque de audio en el automóvil la capacidad de mantener el enfoque simultáneamente con otras aplicaciones. Para que se produzca una interacción concurrente, se deben cumplir las siguientes condiciones. El:

Si se cumplen estos criterios, la solicitud de enfoque regresa con AUDIOFOCUS_REQUEST_GRANTED mientras que el titular del enfoque actual no tiene cambios en el enfoque. Sin embargo, si el poseedor del foco actual opta por recibir eventos de agacharse o hacer una pausa cuando se agacha, el poseedor del foco actual pierde el foco, como ocurre con una interacción exclusiva.

Manejo de transmisiones simultáneas

Si bien la interacción concurrente tiene numerosos usos, tenga cuidado al mezclar y atenuar a nivel de hardware en los dispositivos de salida. Recomendamos encarecidamente que los CarAudioContext que pueden reproducirse simultáneamente se enruten a diferentes dispositivos de salida.

Al tener dispositivos de salida separados para transmisiones simultáneas, esto le permite a HAL atenuar una de las transmisiones antes de mezclarlas, o enrutar las transmisiones físicas a diferentes altavoces en el vehículo. Si los flujos lógicos se mezclan dentro de Android, las ganancias no se modifican y se entregan como parte del mismo flujo físico.

Por ejemplo, cuando la navegación y los medios se entregan simultáneamente, la ganancia del flujo de medios podría reducirse (o atenuarse) temporalmente para que las instrucciones de navegación se puedan escuchar con mayor claridad. Alternativamente, el flujo de navegación podría dirigirse a los parlantes del lado del conductor mientras los medios continúan reproduciéndose en el resto de la cabina.

Matriz de interacción

La siguiente tabla muestra la matriz de interacción definida por CarAudioService . Cada fila representa el CarAudioContext del titular del foco actual y cada columna representa el de la solicitud entrante.

Por ejemplo, cuando una aplicación de medios musicales mantiene el foco mientras una aplicación de navegación lo solicita, la matriz indica que las dos interacciones pueden reproducirse simultáneamente, suponiendo que se cumplan los demás criterios para interacciones simultáneas .

Debido a las interacciones simultáneas, es posible tener más de un titular de 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. Rechazar, luego exclusivo y finalmente concurrente.

Matriz de interacción de enfoque de audio

Figura 1. Matriz de interacción del enfoque de audio.

En Android 11, se introdujo una nueva configuración de usuario para permitirles modificar 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 NAVIGATION entrantes y los titulares de enfoque CALL actuales de concurrentes a rechazadas . Si un usuario prefiere que las instrucciones de navegación no interrumpan una llamada, puede habilitar la configuración. Esto persiste para el usuario y se puede configurar dinámicamente para que las solicitudes de enfoque posteriores respeten la nueva configuración.

Enfoque de audio retardable

En Android 11, AAOS agregó soporte para solicitar enfoque de audio retardable . Esto permite retrasar las solicitudes de enfoque no transitorias cuando su interacción con los titulares de enfoque actuales normalmente resultaría en su rechazo. Una vez que un cambio de enfoque da como resultado un estado en el que la solicitud retrasada puede ganar foco, se concede la solicitud.

Reglas para solicitudes de enfoque de audio retrasado

  • Solo solicitudes no transitorias. Solo se puede realizar una solicitud retrasada para fuentes no transitorias para evitar que se reproduzca un sonido transitorio mucho después de que sea relevante.

  • Sólo se puede retrasar una solicitud a la vez. Si se realiza una solicitud retrasable mientras ya existe una solicitud retrasada, la solicitud retrasada original recibe un evento de cambio AUDIOFOCUS_LOSS y la nueva solicitud recibe una respuesta sincrónica de AUDIOFOCUS_REQUEST_DELAYED .

  • Las solicitudes retrasables deben tener un OnAudioFocusChangeListener Una vez que una solicitud se retrasa, el oyente se utiliza para notificar al solicitante cuando finalmente se concede la solicitud ( AUDIOFOCUS_GAIN ) o si se rechaza más tarde ( AUDIOFOCUS_LOSS ).

Solicitar enfoque diferible

Para crear una solicitud que se puede retrasar:

  1. Utilice 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. Al realizar la solicitud, maneje 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 la solicitud se retrasa, el oyente de enfoque maneja los cambios de 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
    

Gestión de enfoque multizona

Para vehículos con múltiples zonas de audio, el enfoque de audio se administra de forma independiente para cada zona. Como tal, una solicitud a una zona no tiene en cuenta lo que mantiene el foco en otras zonas, ni hace que los titulares de foco en otras zonas pierdan el foco. Con esto, el enfoque de la cabina principal se puede gestionar por separado del sistema de entretenimiento del asiento trasero, sin interrumpir así la reproducción de audio en una zona por cambios de enfoque en otra.

Para todas las aplicaciones, CarAudioService gestiona automáticamente el enfoque. La zona de audio de una solicitud de enfoque está determinada por su UserId o UID asociado (para obtener más detalles, consulte Enrutamiento de audio ).

Solicitar audio de múltiples zonas simultáneamente

Si una aplicación quiere reproducir audio en varias zonas al mismo tiempo, debe solicitar el foco 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 de paquete permite al solicitante anular las asignaciones automáticas de zonas de audio para utilizar en su lugar la ID de zona especificada. Por lo tanto, una aplicación podría emitir solicitudes independientes para diferentes zonas de audio.

Enfoque de audio HAL

A partir de Android 11, HAL está habilitado para solicitar enfoque en nombre de transmisiones externas. Si bien es opcional, se recomienda encarecidamente el uso de estas API para permitir que los sonidos externos sean participantes óptimos en el ecosistema de Android y brindar una experiencia de usuario perfecta.

HAL toma la decisión final sobre qué sonidos deben tener prioridad. En este sentido, los sonidos críticos de emergencia y seguridad deben reproducirse independientemente de si se concede o no el enfoque de audio al HAL y deben continuar reproduciéndose según corresponda incluso si el HAL pierde el enfoque de audio. Lo mismo se aplica a cualquier sonido requerido por las regulaciones gubernamentales.

HAL debe silenciar proactivamente las transmisiones de Android según corresponda cuando se reproducen sonidos de emergencia o críticos para la seguridad para garantizar que se escuchen con claridad.

AudioControl@2.0

La versión 2.0 de AudioControl HAL presenta estas nuevas API:

API Objetivo
IAudioControl#registerFocusListener Registra una instancia de IFocusListener con AudioControl HAL. Este oyente permite que HAL solicite y abandone el enfoque de audio. HAl proporciona una instancia ICloseHandle que Android utilizará para cancelar el registro del oyente.
IAudioControl#onAudioFocusChange Notifica a HAL los cambios en el estado de las solicitudes de enfoque realizadas por HAL a través de IFocusListener , incluidas las respuestas a las solicitudes de enfoque iniciales.
IFocusListener#requestAudioFocus Las solicitudes se centran en nombre de HAL para un uso, ID de zona y tipo de ganancia de enfoque específicos.
IFocusListener#abandonAudioFocus Abandona las solicitudes de enfoque HAL existentes para el uso y el ID de zona especificados.

HAL puede tener múltiples solicitudes de enfoque al mismo tiempo, pero está limitado a una solicitud por uso y emparejamiento de ID de zona. Android asume que HAL inmediatamente comienza a reproducir sonidos para un uso una vez que se ha realizado una solicitud y continúa haciéndolo hasta que abandona el foco.

Además de registerFocusListener , estas solicitudes son oneway de garantizar que Android no retrase el HAL mientras se procesa una solicitud de enfoque. El HAL no debe esperar a enfocarse antes de reproducir sonidos críticos para la seguridad. Es opcional que HAL escuche y responda a los cambios en el enfoque de audio a través de IAudioControl#onAudioFocusChange .

Servicio de enfoque de audio para automóvil OEM

En Android 14, AAOS introdujo los servicios de complementos OEM para automóviles para permitir la configuración de algunos componentes del automóvil. Para el servicio de complemento de audio para automóvil , el servicio de complemento permite a los OEM administrar las solicitudes de enfoque interceptadas por el servicio de audio para automóvil. Esto brinda a los OEM más flexibilidad en términos de gestión del enfoque según lo exigen las reglas y regulaciones. Como tal, la interacción del enfoque de audio puede diferir entre fabricantes y de una región a otra. La premisa básica para el enfoque de audio sigue siendo válida: las aplicaciones aún deben solicitar enfoque para administrar mejor el audio y mejorar la experiencia del usuario. En general, aún se aplican ciertas reglas para la solicitud de enfoque de audio por parte de las aplicaciones:

  • Sin ninguna posición, las aplicaciones de enfoque de audio de alta prioridad (incluidas una llamada telefónica, alerta de emergencia o notificación de seguridad) deberían poder obtener enfoque de audio de forma transitoria o permanente.

  • Mientras un foco mediático está activo:

    • Las aplicaciones que solicitan centrarse en el uso de llamadas deberían poder recibir la llamada de forma simultánea o exclusiva.

    • Las aplicaciones que solicitan centrarse en el uso de la navegación deberían poder recibir el enfoque de navegación de forma simultánea o exclusiva.

    • Las aplicaciones que solicitan atención en el uso del asistente deberían poder recibir atención en el uso de forma simultánea o exclusiva.

  • Mientras las aplicaciones de enfoque de audio de alta prioridad (incluidas una llamada telefónica, alerta de emergencia o notificación de seguridad) estén activas, cualquier solicitud entrante de enfoque de audio retrasado debe concederse o retrasarse según sea necesario.

Si bien las sugerencias anteriores no son exhaustivas, pueden ayudar a las aplicaciones que solicitan enfoque a obtenerlo si no existen sonidos activos de alta prioridad. Incluso cuando los sonidos de alta prioridad están activos, las solicitudes de enfoque retardado aún deben respetarse y deberían poder enfocarse cuando el sonido de alta prioridad se detenga.