Administración del volumen

AAOS tiene su propia administración de volumen dentro de CarAudioService. Utiliza aplicaciones fijas volúmenes con la expectativa de que un hardware debería aplicar volúmenes por debajo de la HAL en lugar de en el 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 volumen.

Usa volúmenes fijos

Las implementaciones AAOS deben controlar el volumen mediante un amplificador de hardware en lugar de un mezclador de software. Para evitar efectos secundarios, establece la marca config_useFixedVolume a true (superposición según sea necesario):

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

Cuando la marca config_useFixedVolume no está configurada (o se establece en false), aplicaciones pueden llamar a AudioManager.setStreamVolume() y cambiar la volumen por tipo de transmisión en el mezclador de software. Esto puede ser indeseable debido a el efecto potencial en otras aplicaciones y el 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 que se reciben en el amplificador de hardware.

Grupos de volúmenes

Los grupos de volúmenes administran los volúmenes para una colección de dispositivos dentro de una zona de audio. Para cada grupo de volúmenes, el volumen se puede controlar de forma independiente. se configuran en los dispositivos asociados para que las aplique el amplificador del vehículo. La configuración de volumen se mantiene para el usuario y se carga cuando el usuario accede.

Define grupos de volumen

CarAudioService usa 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 de 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

Configura ganancias del grupo de volumen

Cada grupo de volúmenes tiene valores de ganancia mínimos, máximos y predeterminados, además de un tamaño del paso. Estas se determinan según 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 comprobará los valores de ganancia de las propiedades y configura el grupo de la siguiente manera:

  • Tamaño del paso. Debe ser el mismo para todos los dispositivos controlados por el grupo de volumen
  • Ganancia mínima. Menor ganancia mínima entre los dispositivos del grupo
  • Ganancia máxima. La ganancia máxima más alta entre los dispositivos del grupo
  • Ganancia predeterminada. La mayor ganancia predeterminada entre los dispositivos del grupo

Debido a la forma en que están configurados estos valores, se puede establecer 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 la cantidad mínima o máxima del dispositivo. para ganar valor en función de si el valor del grupo de volúmenes es inferior o superior al rango.

Identificadores de grupos de volúmenes

Los grupos de volúmenes se identifican en el entorno de ejecución por su orden de definición en el archivo en formato XML. Los IDs varían de 0 a N-1 en una zona de audio, donde N es la cantidad de grupos de volúmenes en en esa zona. De esta manera, los IDs de grupos de volúmenes no son únicos entre zonas. Estos identificadores se usan para CarAudioManager APIs asociadas con grupos de volúmenes. Cualquier API que toma un groupId sin un zoneId se establecerá de forma predeterminada como zona de audio principal.

Administración de volúmenes multizona

Se espera que cada zona de audio tenga uno o más grupos de volumen, y cada uno de ellos se asocia con una única zona de audio. Esta relación se define como parte de car_audio_configuration.xml Consulta el ejemplo proporcionado en Cómo definir grupos de volumen más arriba.

Los niveles de volumen actuales de cada zona se mantienen para el usuario asociado con en esa zona. Estos parámetros de configuración son específicos de una zona, es decir, si un usuario accede 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 diferentes de los de la zona secundaria.

Cómo controlar eventos de teclas de volumen

Android define varios códigos de teclas para el control de volumen, lo que incluye KEYCODE_VOLUME_UP, KEYCODE_VOLUME_DOWN y KEYCODE_VOLUME_MUTE De forma predeterminada, Android enruta la tecla de volumen eventos a las aplicaciones. Las implementaciones en Automotive deben forzar estos eventos clave a CarAudioService, que luego puede llamar a setGroupVolume o setMasterMute según corresponda.

Para forzar este comportamiento, configura config_handleVolumeKeysInWindowManager marca para true:

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

Actualmente, los eventos de teclas de volumen no tienen forma de distinguir de qué zona están está diseñada para la zona de audio principal y, por lo tanto, se supone que están asociadas a ella. Cuando se recibe un evento de tecla de volumen, CarAudioService determina el volumen grupo para ajustar recuperando los contextos de audio de los reproductores activos y, luego, ajustando el grupo de volúmenes que contiene el dispositivo de salida asociado con la prioridad más alta contexto de audio. La priorización se determina según un orden fijo definido en CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY

Atenuación y equilibrio

Ambas versiones de la HAL de AudioControl incluyen APIs para configurar el fundido y el equilibrio de entrada el vehículo. Hay APIs del sistema correspondientes para CarAudioManager que pasan valores hasta la HAL de AudioControl. Estas APIs requieren android.car.permission.CAR_CONTROL_AUDIO_VOLUME

Las APIs de AudioControl son las siguientes:

  • setBalanceTowardRight(float value) Mueve el volumen de la bocina hacia el lado derecho (+) o izquierdo (-) del automóvil. 0.0 está centrado, +1.0 está bien a la derecha, -1.0 es un valor completamente izquierdo, y un valor fuera del rango de -1 a 1 es un error.
  • setFadeTowardFront(float value): Mueve el volumen de la bocina hacia la parte delantera (+) o trasera (-) del automóvil. 0.0 está centrado, +1.0 está completamente hacia delante, -1.0 es totalmente posterior, 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 mostrará a los usuarios. Pueden aplicarse estrictamente a los medios o a toda la a todos los sonidos de Android.

Android 11 también introdujo compatibilidad con la aplicación de efectos de audio a dispositivos de salida. Así, puedes administrar, como alternativa, la atenuación y el equilibrio con efectos de audio en los dispositivos de salida correspondientes en lugar de hacerlo mediante estas APIs.

Autosilenciado de fondo

El silenciado de fondo se produce cuando el vehículo reduce la ganancia de una transmisión. para que las demás transmisiones que se reproducen al mismo tiempo se escuchen con mayor claridad. En AAOS, La implementación del autosilenciado de fondo depende de la HAL, ya que puede haber muchos sonidos. fuera de Android sobre los que el SO no tiene control. En Android 11, la información principal disponible para la HAL a fin de tomar decisiones de autosilenciado es si dos dispositivos de salida tienen transmisiones activas.

Cuándo agacharte

Si bien depende del OEM individual determinar cómo se manejará el autosilenciado de fondo por su HAL, hay algunas pautas generales que recomendamos. Si hay varias transmisiones en Android ocurre con mayor frecuencia cuando dos apps o servicios mantienen el foco de audio al mismo tiempo. Con eso en mente, consulta Matriz de interacción para saber cuándo Android puede otorgar enfoque simultáneo y, por lo tanto, cuándo es posible que dos de varias transmisiones para que se reproduzcan de forma simultánea.

Ten en cuenta que cualquier transmisión mezclada por Android se realizará antes de que se produzcan mejoras. que se está aplicando. Por lo tanto, cualquier transmisión que se deba atenuar cuando se reproduzca otro debe enrutarse a dispositivos de salida separados para que la HAL pueda aplicar el autosilenciado antes de mezclarlos.

Comportamiento recomendado de autosilenciado de fondo

A continuación, se incluyen posibles interacciones simultáneas en las que recomendamos el autosilenciado que se aplicarán:

  • EMERGENCY Oculta o silencia todo excepto SAFETY para asegurarte de que el conductor escuche el sonido
  • SAFETY Oculta todo, excepto EMERGENCY, para asegurarte el conductor escucha el sonido
  • NAVIGATION Oculta todo excepto SAFETY y EMERGENCY
  • CALL Oculta todo, excepto SAFETY, EMERGENCY y NAVIGATION
  • VOICE Pato CALL_RING
  • Depende de los OEM determinar la importancia del VEHICLE_SOUNDS activo. y si deben atenuar otros sonidos para garantizar que el conductor los escuche.
  • MUSIC y ANNOUNCEMENT deben estar suprimidos por todo. La excepción principal son los tonos de interacción táctil, que actualmente se reproducen como SYSTEM_SOUND

Otras consideraciones para el autosilenciado de fondo

Es posible que algunas apps o servicios, como la navegación o el Asistente, usen varios jugadores para completarse sus acciones. Los OEMs deben evitar la disminución del ajuste demasiado agresiva en función del momento en que se detienen los datos de transmisión. que llegan a través de estos dispositivos de salida para garantizar que el usuario no tenga a todo volumen antes de volver a bajarla en la próxima reproducción desde la navegación se inicia la app de Asistente.

Para los vehículos con varias etapas de sonido con un aislamiento suficientemente bueno, también está la opción para enrutar el audio a diferentes áreas del vehículo en vez de atenuarlo. Por ejemplo, la navegación las instrucciones podrían enviarse a las bocinas del reposacabezas del conductor mientras la música continúa y se reproducirá en toda la cabina a un volumen normal.

Sonidos críticos de seguridad

Si bien Android 11 introdujo APIs de foco de audio de HAL, La HAL también debe garantizar que se prioricen los sonidos críticos de seguridad otras personas. Incluso si la HAL mantiene el foco de audio para USAGE_EMERGENCY, eso no Garantizar que las apps y los servicios de Android no reproduzcan sonidos. La HAL depende de determinar qué transmisiones de Android se deben mezclar o silenciar como sonidos críticos de seguridad jugó.

Cómo establecer la IU de la configuración del volumen

AAOS separa la IU de configuración de volumen de la configuración de grupos de volumen (que puede superpuestos, como se describe en Configura grupos de volúmenes). Esta separación garantiza que ninguna se requieren cambios si la configuración de los grupos de volúmenes cambia en el futuro.

En la IU de Configuración del vehículo, packages/apps/Car/Settings/res/xml/car_volume_items.xml contiene elementos de la IU (recursos de íconos y títulos) asociados con cada uno de los elementos definidos AudioAttributes.USAGE Este archivo proporciona una renderización razonable de los el VolumeGroups definido usando recursos asociados con el primer reconocido que contiene cada VolumeGroup.

En el siguiente ejemplo, se define que un VolumeGroup incluye ambos voice_communication y voice_communication_signalling. Predeterminado de la IU de la configuración del vehículo renderiza el VolumeGroup con 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 usados en la configuración anterior se declaran en packages/apps/Car/Settings/res/values/attrs.xml La configuración del volumen La IU usa las siguientes APIs de CarAudioManager basadas en VolumeGroup:

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