Gestión de volumen

AAOS tiene su propia gestión de volumen dentro de CarAudioService . Utiliza volúmenes fijos con la expectativa de que los volúmenes se apliquen por debajo del HAL mediante un amplificador de hardware en lugar de un software. También organiza los dispositivos de salida en grupos de volúmenes para aplicar las mismas ganancias a todos los dispositivos asociados con el grupo de volúmenes.

Usando volúmenes fijos

Las implementaciones de AAOS deberían controlar el volumen mediante un amplificador de hardware en lugar de un mezclador de software. Para evitar efectos secundarios, establezca el indicador config_useFixedVolume en verdadero (superpóngalo según sea necesario):

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

Cuando el indicador config_useFixedVolume no está configurado (o configurado en falso), las aplicaciones pueden llamar a AudioManager.setStreamVolume() y cambiar el volumen por tipo de transmisión en el mezclador de software. Esto puede ser indeseable debido al efecto potencial en otras aplicaciones y al hecho de que la atenuación del volumen en el mezclador de software da como resultado menos bits significativos disponibles en la señal cuando se recibe en el amplificador de hardware.

Grupos de volumen

Los grupos de volúmenes administran los volúmenes de una colección de dispositivos dentro de una zona de audio. Para cada grupo de volumen, el volumen se puede controlar de forma independiente y las ganancias resultantes se configuran en los dispositivos asociados para ser aplicadas por el amplificador del vehículo. La configuración del volumen persiste para el usuario y se carga cuando el usuario inicia sesión.

Definición de grupos de volúmenes

CarAudioService utiliza grupos de volúmenes 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>

Ejemplo de implementación car_audio_configuration.xml .

Cada grupo de volúmenes debe contener uno o más dispositivos de salida con direcciones asociadas. Estas direcciones deben corresponder a los dispositivos de salida definidos en audio_policy_configuration.xml .

Configuración de ganancias de grupos de volúmenes

Cada grupo de volúmenes tiene valores de ganancia mínimo, máximo y predeterminado, así como un tamaño de paso. Estos se determinan en función de los valores configurados en audio_policy_configuration.xml para los dispositivos asociados con el grupo de volúmenes.

<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 volúmenes verificará los valores de ganancia de los dispositivos asociados y configurará el grupo de la siguiente manera:

  • Numero de pie. Debe ser el mismo para todos los dispositivos controlados por el grupo de volúmenes.
  • Ganancia mínima. La ganancia mínima más pequeña entre los dispositivos del grupo
  • Ganancia máxima. La ganancia máxima más alta entre los dispositivos del grupo
  • Ganancia predeterminada. Mayor ganancia predeterminada entre los dispositivos del grupo

Debido a la forma en que se configuran estos valores, es posible configurar la ganancia de un grupo de volúmenes fuera del rango admitido para un dispositivo asociado con el grupo de volúmenes. En este caso, para ese dispositivo, la ganancia se establecerá en el valor de ganancia mínimo o máximo del dispositivo en función de 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 tiempo de ejecución por su orden de definición en el archivo XML. Los ID varían de 0 a N-1 dentro de una zona de audio, donde N es el número de grupos de volumen en esa zona. De esta manera, los ID de grupo de volúmenes no son únicos entre zonas. Estos identificadores se utilizan para las API CarAudioManager asociadas con grupos de volúmenes. Cualquier API que acepte un groupId sin un zoneId utilizará de forma predeterminada la zona de audio principal.

Gestió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 está asociado con una única zona de audio. Esta relación se define como parte de car_audio_configuration.xml . Consulte el ejemplo proporcionado en Definición de grupos de volúmenes arriba.

Los niveles de volumen actuales para cada zona persisten para el usuario asociado con esa zona. Estas configuraciones son específicas de la zona, lo que significa que si un usuario inicia sesión en una pantalla asociada con la zona principal y luego inicia sesión en una zona asociada con una zona de audio secundaria, los niveles de volumen cargados y persistentes para la primera zona serán diferentes a los de la zona secundaria.

Manejo de eventos de clave de volumen

Android define varios códigos clave para el control de volumen, incluidos KEYCODE_VOLUME_UP , KEYCODE_VOLUME_DOWN y KEYCODE_VOLUME_MUTE . De forma predeterminada, Android dirige los eventos de las teclas de volumen a las aplicaciones. Las implementaciones automotrices deberían forzar estos eventos clave a CarAudioService , que luego puede llamar a setGroupVolume o setMasterMute según corresponda.

Para forzar este comportamiento, establezca el indicador config_handleVolumeKeysInWindowManager en true :

<resources>
    <bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>

Actualmente, los eventos de teclas de volumen no tienen forma de distinguir a qué zona están destinados y, como tales, 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 obteniendo los contextos de audio para los reproductores activos y luego ajustando 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 .

Desvanecimiento y equilibrio

Ambas versiones de AudioControl HAL incluyen API para configurar el desvanecimiento y el equilibrio en el vehículo. Existen API del sistema correspondientes para CarAudioManager que pasan valores al AudioControl HAL. Estas API requieren android.car.permission.CAR_CONTROL_AUDIO_VOLUME .

Las API de AudioControl son:

  • setBalanceTowardRight(float value) . Cambia el volumen del altavoz hacia el lado derecho (+) o izquierdo (-) del automóvil. 0,0 está centrado, +1,0 está completamente a la derecha, -1,0 está completamente a la izquierda y un valor fuera del rango de -1 a 1 es un error.
  • setFadeTowardFront(float value) : cambia el volumen del altavoz hacia la parte delantera (+) o trasera (-) del automóvil. 0,0 está centrado, +1,0 está completamente hacia adelante, -1,0 está completamente hacia atrás y un valor fuera del rango de -1 a 1 es un error.

Depende de los OEM decidir cómo se deben aplicar estos valores y cómo se presentarán a los usuarios. Podrían aplicarse estrictamente a los medios o de forma generalizada a todos los sonidos de Android.

Android 11 también introdujo soporte para aplicar efectos de audio a dispositivos de salida. Con esto, es posible administrar alternativamente el desvanecimiento y el equilibrio a través de efectos de audio en los dispositivos de salida apropiados en lugar de a través de estas API.

Audio ducking

La atenuación de audio se produce cuando el vehículo reduce la ganancia de una transmisión para que otra transmisión que se reproduce al mismo tiempo se pueda escuchar con mayor claridad. En AAOS, la implementación de la reducción de audio se deja en manos de HAL, ya que potencialmente hay muchos sonidos fuera de Android sobre los que el sistema operativo no tiene control. En Android 11, la información principal disponible para HAL para tomar decisiones de elusión es si dos dispositivos de salida tienen transmisiones activas.

cuando agacharse

Si bien depende del OEM individual determinar cómo su HAL manejará la reducción, existen algunas pautas generales que recomendamos. La reproducción de varias transmisiones en Android se producirá con mayor frecuencia cuando dos aplicaciones/servicios mantienen el foco de audio al mismo tiempo. Teniendo esto en cuenta, consulte Matriz de interacción para saber cuándo Android puede otorgar enfoque simultáneo y, por lo tanto, cuándo es posible que dos transmisiones diferentes se reproduzcan simultáneamente.

Tenga en cuenta que cualquier transmisión mezclada por Android se realizará antes de que se apliquen las ganancias. Como tal, cualquier transmisión que deba atenuarse cuando se reproduce simultáneamente con otra debe enrutarse a dispositivos de salida separados para que HAL pueda aplicar atenuación antes de mezclarlos.

Comportamiento de agachamiento recomendado

Las siguientes son posibles interacciones simultáneas en las que recomendamos aplicar la reducción:

  • EMERGENCY . Agacha o silencia todo excepto SAFETY para asegurar que el conductor escuche el sonido.
  • SAFETY . Evite todo excepto EMERGENCY para asegurarse de que el conductor escuche el sonido.
  • NAVIGATION . Evite todo excepto SAFETY y EMERGENCY
  • CALL . Evite todo excepto SAFETY , EMERGENCY y NAVIGATION
  • VOICE . Pato CALL_RING
  • Depende de los OEM determinar la importancia de los VEHICLE_SOUNDS activos y si deben o no evitar otros sonidos para asegurarse de que el conductor los escuche.
  • MUSIC y ANNOUNCEMENT deben ser esquivados por todo. La principal excepción a esto son los tonos de interacción táctil que actualmente se reproducen como SYSTEM_SOUND .

Otras consideraciones al agacharse

Algunas aplicaciones/servicios, como la navegación o el asistente, pueden utilizar varios reproductores para completar sus acciones. Los fabricantes de equipos originales deben evitar la reducción demasiado agresiva en función de cuándo dejan de pasar los datos de transmisión a través de estos dispositivos de salida para garantizar que el usuario no haga que los medios vuelvan momentáneamente al volumen máximo antes de volver a bajarlos cuando comience la siguiente reproducción desde la aplicación de navegación o asistente.

Para vehículos con múltiples escenarios de sonido con un aislamiento suficientemente bueno, también existe la opción de dirigir el audio a diferentes áreas del automóvil en lugar de agacharse. Por ejemplo, las instrucciones de navegación podrían enviarse a los parlantes del reposacabezas del conductor mientras la música continúa sonando en toda la cabina a un volumen normal.

Sonidos críticos para la seguridad

Si bien Android 11 introdujo las API de enfoque de audio de HAL , aún depende de HAL garantizar que los sonidos críticos para la seguridad tengan prioridad sobre otros. Incluso si HAL mantiene el foco de audio para USAGE_EMERGENCY , eso no garantiza que las aplicaciones y servicios dentro de Android no reproduzcan sonidos. Depende de HAL determinar qué transmisiones de Android deben mezclarse o silenciarse mientras se reproducen sonidos críticos para la seguridad.

Configurar la interfaz de usuario de configuración de volumen

AAOS desacopla la interfaz de usuario de configuración de volumen de la configuración del grupo de volúmenes (que se puede superponer como se describe en Configuración de grupos de volúmenes). Esta separación garantiza que no se requieran cambios si la configuración de los grupos de volúmenes cambia en el futuro.

En la interfaz de usuario de configuración del automóvil, el archivo packages/apps/Car/Settings/res/xml/car_volume_items.xml contiene elementos de la interfaz de usuario (recursos de título e ícono) asociados con cada AudioAttributes.USAGE definido. Este archivo proporciona una representación razonable de los VolumeGroups definidos mediante el uso de recursos asociados con el primer uso reconocido contenido en cada grupo de volúmenes.

Por ejemplo, el siguiente ejemplo define un VolumeGroup que incluye tanto voice_communication como voice_communication_signalling . La implementación predeterminada de la interfaz de usuario de configuración del automóvil representa el VolumeGroup utilizando los recursos asociados con voice_communication , ya que es el primero 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 utilizados en la configuración anterior se declaran en packages/apps/Car/Settings/res/values/attrs.xml . La interfaz de usuario de configuración de volumen utiliza las siguientes API de CarAudioManager basadas en VolumeGroup:

  • getVolumeGroupCount() para saber cuántos controles se deben dibujar.
  • getGroupMinVolume() y getGroupMaxVolume() para obtener los límites superior e inferior.
  • getGroupVolume() para obtener el volumen actual.
  • registerVolumeChangeObserver() para recibir notificaciones sobre cambios de volumen.