Gerenciamento de volume

O gerenciamento de volume está contido em CarAudioService, que usa volumes fixos com a expectativa de que eles sejam aplicados abaixo da HAL por um amplificador de hardware, em vez de no software. O CarAudioService organiza dispositivos de saída em grupos de volume para aplicar os mesmos ganhos a todos os dispositivos associados a um grupo de volume.

Volumes fixos

As implementações do AAOS usam um amplificador de hardware para controlar o volume em vez de um mixer de software. Para evitar efeitos colaterais, defina a flag config_useFixedVolume como true (faça a sobreposição conforme necessário):

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

Quando a flag config_useFixedVolume não está definida (ou está definida como false), os apps podem chamar AudioManager.setStreamVolume() para mudar o volume por tipo de stream no mixer de software. Isso nem sempre é desejável devido aos possíveis efeitos em outros apps e ao fato de que a atenuação de volume no mixer de software pode resultar em menos bits significativos disponíveis no sinal quando recebido pelo amplificador de hardware.

Grupos de volumes

Os grupos de volume gerenciam os volumes de uma coleção de dispositivos em uma zona de áudio. Para cada grupo de volume, o volume pode ser controlado de forma independente. Os ganhos resultantes são configurados nos dispositivos associados para serem aplicados pelo amplificador do veículo. As configurações de volume são mantidas para o usuário e carregadas quando ele faz login.

Definir grupos de volumes

O CarAudioService usa grupos de volume definidos em car_audio_configuration.xml:

<audioZoneConfiguration version="4">
    </deviceConfigurations>
    <activationVolumeConfigs>
        <activationVolumeConfig name="activation_volume_on_boot_config">
            <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
            invocationType="onBoot" />
        </activationVolumeConfig>
        ...
    </activationVolumeConfigs>
    <zones>
        <zone name="primary zone" isPrimary="true">
          <zoneConfigs>
              <zoneConfig name="primary zone config 0" isDefault="true">
                <volumeGroups>
                    <group activationConfig="activation_volume_on_boot_config">
                        <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>
              </zoneConfig>
              ...
            </zoneConfigs>
        </zone>
     </zones>
</audioZoneConfiguration>

Cada grupo de volume precisa conter um ou mais dispositivos de saída com endereços associados. Os endereços precisam corresponder aos dispositivos de saída definidos em audio_policy_configuration.xml.

Configurar ganhos do grupo de volume

Cada grupo de volume tem valores de ganho mínimo, máximo e padrão, além de um tamanho de etapa com base nos valores configurados em audio_policy_configuration.xml para os dispositivos associados ao grupo de volume.

<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 a inicialização, o grupo de volumes verifica os valores de ganho dos dispositivos associados e configura o grupo da seguinte maneira:

  • Taxa de aprendizado. Precisa ser o mesmo para todos os dispositivos controlados pelo grupo de volume.
  • Ganho mínimo. O menor ganho mínimo entre os dispositivos do grupo.
  • Ganho máximo. Maior ganho máximo entre os dispositivos do grupo.
  • Ganho padrão. O maior ganho padrão entre os dispositivos do grupo.

Devido à forma como esses valores são configurados, é possível definir o ganho de um grupo de volume fora do intervalo compatível com um dispositivo associado a ele. Nesse caso, para esse dispositivo, o ganho é definido como o valor mínimo ou máximo do dispositivo, dependendo se o valor do grupo de volume está abaixo ou acima do intervalo.

Identificadores de grupo de volumes

Os grupos de volumes são identificados no tempo de execução na ordem definida no arquivo XML. Os IDs variam de 0 a N-1 em uma zona de áudio, em que N é o número de grupos de volume nessa zona. Dessa forma, os IDs dos grupos de volumes não são exclusivos em todas as zonas. Esses identificadores são usados para APIs CarAudioManager associadas a grupos de volumes. Qualquer API que receba um groupId sem um zoneId tem como padrão a zona de áudio principal.

Gerenciamento de volume em várias zonas

Cada zona de áudio deve ter um ou mais grupos de volume, e cada grupo de volume está associado a uma única zona de áudio. Essa relação é definida como parte de car_audio_configuration.xml. Para saber mais, consulte o exemplo acima em Definir grupos de volumes.

Os níveis de volume atuais de cada zona são mantidos para o usuário associado a ela. Essas configurações são específicas da zona. Isso significa que, se um usuário fizer login em uma tela associada à zona principal e depois em uma zona associada a uma zona de áudio secundária, os níveis de volume carregados e mantidos para a primeira zona serão diferentes dos da segunda.

Volume mínimo e máximo de ativação

O Android 15 introduz o controle sobre os índices de grupos de volume para melhorar a segurança e o conforto do usuário em sistemas de áudio automotivo. Isso é feito usando volumes de ativação mínimos e máximos, configurados na configuração de áudio do carro (consulte Definir grupos de volume). Para ativar esse recurso, defina audioUseMinMaxActivationVolume como true nas RROs do serviço de carro.

É possível definir várias entradas activationVolumeConfig em activationVolumeConfigs, cada uma representando uma configuração de ativação mínima e máxima diferente. Cada activationVolumeConfig:

  • Precisa conter um name exclusivo no arquivo de configuração de áudio do carro para que possa ser referenciado no grupo de volume (group) mais tarde.
  • Precisa conter apenas um activationVolumeConfigEntry.

Cada activationVolumeConfig contém os seguintes atributos:

  • minActivationVolumePercentage (número inteiro, 0 a 100, opcional, padrão: 0): especifica o volume mínimo de ativação como uma porcentagem.
  • maxActivationVolumePercentage (número inteiro, 0 a 100, opcional, padrão: 100): especifica o volume máximo de ativação como uma porcentagem.
  • invocationType (string, opcional, padrão: onPlaybackChanged): define as condições em que o volume mínimo e máximo de ativação é aplicado:

    • onBoot: aplicado apenas à primeira reprodução recém-ativada em um grupo de volumes após a inicialização.
    • onSourceChanged: aplicado apenas a uma reprodução ativa recentemente com uma origem de app ou UID alterada em um grupo de volume.
    • onPlaybackChanged: aplicado a cada reprodução recém-ativada em um grupo de volumes.

O CarAudioService gerencia a ativação mínima e máxima monitorando os seguintes subcomponentes de áudio ativos no momento:

  • Faixas de reprodução ativas atuais
  • Estado atual da chamada
  • Solicitação de seleção de áudio atual da HAL de controle de áudio em que a solicitação da HAL de controle de áudio indica que uma reprodução de áudio ativa está ocorrendo fora do Android.

A imagem a seguir mostra uma visão geral de alto nível do gerenciamento de volume mínimo e máximo de ativação:

imagem

Figura 1. Gerenciamento de volume mínimo e máximo de ativação de caminhos de dados de áudio ativos.

Com os valores especificados de minActivationVolumePercentage, maxActivationVolumePercentage e índice mínimo e máximo de ganho de volume, é possível calcular o índice mínimo e máximo de ganho de volume de ativação para cada grupo de volume. CarAudioService monitora cada reprodução recém-ativada e aplica o volume mínimo e máximo de ativação nas seguintes condições:

  • O tipo de invocação corresponde: o tipo de ativação da reprodução (derivado do Audio Manager, Audio Control HAL ou Telephony Manager) precisa corresponder ao invocationType especificado no activationVolumeConfigEntry associado ao grupo de volume.
  • Índice de volume fora do intervalo: o índice de ganho de volume atual do grupo de volume precisa estar fora do intervalo definido de índice de ganho de volume de ativação. Especificamente, uma das seguintes condições é verdadeira:

    • O índice é menor que o índice calculado de ganho mínimo de volume de ativação.

      OU

    • O índice é maior do que o ganho máximo calculado de volume de ativação.

Em uma correspondência de ativação, o índice de ganho de volume do grupo de volume será ajustado para um dos seguintes valores:

  • Índice mínimo de ganho de volume de ativação se for menor que o índice mínimo de ganho de volume de ativação

    OU

  • Índice máximo de ganho de volume de ativação se for maior que o índice máximo de ganho de volume de ativação

Além disso, um evento de grupo de volume de carro com o tipo EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED é enviado a todos os callbacks de eventos de grupo de volume registrados.

Processar eventos de tecla de volume

O Android define vários keycodes para controle de volume, incluindo:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Por padrão, o Android encaminha os eventos da tecla de volume para os apps. As implementações automotivas precisam forçar o processamento desses eventos principais por CarAudioService, que chama setGroupVolume ou setMasterMute, conforme apropriado. Para forçar esse comportamento, defina a flag config_handleVolumeKeysInWindowManager como true:

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

No momento, os eventos principais de volume não têm como distinguir para qual zona eles são destinados e são considerados associados à zona de áudio principal. Quando um evento de tecla de volume é recebido, o CarAudioService determina qual grupo de volume ajustar buscando os contextos de áudio dos players ativos e ajustando o grupo de volume que contém o dispositivo de saída associado ao contexto de áudio de maior prioridade. A priorização é determinada com base em uma ordenação fixa definida em CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.

Desaparecimento e balanço

As duas versões da HAL AudioControl incluem APIs para definir o fade e o balanceamento no veículo. As APIs do sistema correspondentes para CarAudioManager transmitem valores para a HAL AudioControl. Essas APIs exigem android.car.permission.CAR_CONTROL_AUDIO_VOLUME. As APIs AudioControl são:

  • setBalanceTowardRight(float value) muda o volume do alto-falante para o lado direito (+) ou esquerdo (-) do carro.

    • 0,0 é centralizado
    • +1,0 é totalmente correto
    • -1,0 é totalmente à esquerda
    • Um valor fora do intervalo de -1 a 1 é um erro.
  • setFadeTowardFront(float value) muda o volume do alto-falante para a frente (+) ou para trás (-) do carro.

    • 0,0 é centralizado
    • +1.0 é totalmente encaminhado
    • -1,0 é totalmente para trás
    • Um valor fora do intervalo de -1 a 1 é um erro.

Você decide como esses valores devem ser aplicados e como mostrá-los aos usuários. Elas podem ser aplicadas estritamente à mídia ou a todos os sons do Android. O Android 11 também introduziu suporte para aplicar efeitos de áudio a dispositivos de saída. Assim, é possível gerenciar o fade e o balanceamento usando efeitos de áudio nos dispositivos de saída adequados, em vez de usar essas APIs.

Redução de áudio

A redução de áudio ocorre quando o veículo diminui o ganho de um stream para que outro stream tocando simultaneamente possa ser ouvido com mais clareza. No AAOS, o ducking de áudio é implementado pelo HAL. O Android não tem controle sobre sons além do SO. No Android 11, a principal informação disponível para o HAL tomar decisões de redução é se dois dispositivos de saída têm streams ativos.

Quando se abaixar

Embora seja responsabilidade do OEM individual determinar como o ducking é processado pela HAL, recomendamos as seguintes diretrizes.

  • Vários streams sendo reproduzidos no Android geralmente ocorrem quando dois apps ou serviços mantêm o foco de áudio simultaneamente. Para saber quando o Android pode conceder foco simultâneo, consulte a matriz de interação em Tipos de restrição. Com a introdução do plug-in de áudio do carro, isso também depende do seu gerenciamento de AudioFocus.

  • Todas as transmissões combinadas pelo Android são feitas antes da aplicação de ganhos. Assim, qualquer stream que precise ser reduzida quando reproduzida simultaneamente com outra deve ser encaminhada para dispositivos de saída separados para que a HAL possa aplicar a redução antes de misturá-las.

A seguir, apresentamos possíveis interações simultâneas em que o ducking é recomendado.

Interação Ação
EMERGENCY Diminui ou desativa tudo, exceto SAFETY
SAFETY Esconde tudo, exceto EMERGENCY
NAVIGATION Faz ducking de tudo, exceto SAFETY e EMERGENCY
CALL Esquiva tudo, exceto SAFETY, EMERGENCY e NAVIGATION
VOICE Patos CALL_RING
VEHICLE_SOUNDS Você determina a importância do som ativo e se ele reduz outros sons.
MUSIC e ANNOUNCEMENT Evitado por tudo. As exceções são tons de interação por toque reproduzidos como SYSTEM_SOUND.

Considerações ao reduzir o áudio

Alguns apps e serviços, como navegação ou um assistente, podem usar vários players para realizar ações. Evite o unducking agressivo quando um fluxo de dados para de fluir pelos dispositivos de saída para garantir que a mídia não retorne ao volume total antes de ser reduzida antes3 do início da próxima reprodução pela navegação ou por um app assistente.

Em veículos com vários palcos de som e isolamento adequado, é possível direcionar o áudio para diferentes áreas do carro em vez de reduzir o volume. Por exemplo, as instruções de navegação podem ser direcionadas aos alto-falantes do encosto de cabeça do motorista enquanto a música continua tocando em toda a cabine em um volume normal.

Sons críticos de segurança

O Android 11 introduziu as APIs de foco de áudio HAL. A HAL garante que os sons críticos para a segurança sejam priorizados em relação a outros sons. Se a HAL mantiver o foco de áudio por USAGE_EMERGENCY, não há garantia de que apps e serviços do Android não vão tocar sons. O HAL determina quais streams do Android precisam ser misturados ou silenciados para reproduzir sons críticos para a segurança.

Configurar a interface de configurações de volume

O AAOS separa a interface das configurações de volume da configuração do grupo de volume. Eles podem ser sobrepostos conforme descrito em Configurar ganhos do grupo de volume. Essa separação garante que nenhuma mudança seja necessária se a configuração dos grupos de volumes mudar.

Na interface de configurações do carro, packages/apps/Car/Settings/res/xml/car_volume_items.xml contém os elementos da interface (recursos de título e ícone) associados a cada AudioAttributes.USAGE definido. Esse arquivo oferece uma renderização razoável do VolumeGroups definido usando recursos associados ao primeiro uso reconhecido contido em cada VolumeGroup.

Por exemplo, o exemplo a seguir define um VolumeGroup como incluindo voice_communication e voice_communication_signalling. A implementação padrão da interface de configurações do carro renderiza o VolumeGroup usando os recursos associados ao voice_communication, já que essa é a primeira correspondência no arquivo.

<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>

Os atributos e valores usados na configuração acima são declarados em packages/apps/Car/Settings/res/values/attrs.xml. A interface das configurações de volume usa as seguintes APIs CarAudioManager baseadas em VolumeGroup:

  • getVolumeGroupCount() para saber quantos controles devem ser extraídos.
  • getGroupMinVolume() e getGroupMaxVolume() para receber limites inferior e superior.
  • getGroupVolume() para saber o volume atual.
  • registerVolumeChangeObserver() para receber notificações sobre mudanças de volume.

Evento de grupo de volume de carros

Os casos de uso automotivo da atualização de volume e da ativação/desativação do modo silencioso têm fundamentos contextuais que podem definir as ações de determinados apps, como as configurações de volume. O volume atual e o callback de mudo da pilha de áudio do carro fornecem informações contextuais limitadas. Para atender melhor aos casos de uso automotivos e à escalonabilidade futura, o CarVolumeGroupEvent foi adicionado ao Android 14. Cada evento tem três tipos de informações importantes:

  • Lista de CarVolumeGroupInfo
  • EventTypes (bitmapped)
  • Lista de ExtraInfos

CarVolumeGroupInfo

O receptor do callback de evento tem acesso imediato à lista de informações do grupo de volume de carros afetados. Isso significa que o app não precisa fazer outras chamadas para o framework de áudio do carro para receber o estado mais recente. Ele pode simplesmente usar o CarVolumeGroupInfos recebido para atualizar a UI ou os estados internos. Para facilitar o trabalho dos apps, os aspectos que mudaram em um grupo de volume de carros também são fornecidos como parte de EventTypes, conforme explicado abaixo.

EventTypes

Define qual aspecto de CarVolumeGroupInfo mudou. Os apps podem usar isso para identificar mudanças e realizar as ações necessárias. Por exemplo, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED indica que o respectivo índice de ganho de volume máximo CarVolumeGroups mudou e pode ser consultado por CarVolumeGroupInfo.getMaxVolumeGainIndex().

A tabela a seguir mostra a relação entre EventType e CarVolumeGroupInfo.

EventType CarVolumeGroupInfo
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

ExtraInfos

Fornece mais informações sobre por que o CarVolumeGroup mudou. Os apps podem usar essas informações para fornecer mais contexto e alertar o usuário para agir ou notificar. Por exemplo, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL indica uma atenuação transitória ativa devido a uma sobrecarga térmica. O app pode informar ao usuário se ele tentar aumentar o volume.

Não aplicamos nenhum processo para ExtraInfos. Fica a seu critério determinar o processo com base em ExtraInfos. Por exemplo, se a atenuação estiver ativa devido a EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED, você também poderá optar por reduzir a interface da barra de volume inicialmente para impedir que o usuário mude o volume. Outros podem mostrar um aviso de que o ducking está ativo e permitir que o usuário mude o volume.

A estrutura de áudio do carro depende da HAL AudioControl IAudioGainCallback para fornecer o ExtraInfos sugerido. Para saber mais, consulte Callback de ganho de áudio.

O CarVolumeGroupEvent é dimensionado para atender às necessidades futuras da estrutura de áudio do carro. Pretendemos oferecer suporte a novos recursos apenas pelo CarVolumeGroupEvent. Recomendamos que os desenvolvedores de apps usem CarVolumeGroupEvent para processar mudanças de volume e silenciamento de grupos.

Callback de evento do grupo de volume do carro

O Android 14 oferece um novo callback para que apps privilegiados e da plataforma se registrem e recebam notificações sobre CarVolumeGroupEvents.

  • Para se registrar para um callback, use CarAudioManager#registerCarVolumeGroupEventCallback()

  • Para cancelar o registro do callback, use CarAudioManager#unregisterCarVolumeGroupEventCallback()

Se um app se registrar com o novo CarVolumeGroupEventCallback e o legado CarVolumeCallback, o evento CarVolumeGroupEventCallbacks terá prioridade. A pilha de áudio do carro não aciona mais CarVolumeCallback. Isso evita gatilhos duplicados para o mesmo app no mesmo evento.

Recomendamos usar CarVolumeGroupEventCallback para gerenciar o volume do grupo e as mudanças de mudo.

Callback de ganho de áudio

Desde o Android 13, a HAL AudioControl pode acionar um callback assíncrono para gerenciar atualizações de nível de volume devido a mudanças no sistema de áudio do carro.

API HAL

AIDL AudioControl @2.0

A versão 2.0 da HAL AIDL AudioControl adiciona a seguinte API:

API Finalidade
IAudioControl#registerGainCallback Registra uma instância de IAudioGainCallback com a HAL AudioControl.
IAudioGainCallback#onAudioDeviceGainsChanged Callback assíncrono para notificar mudanças na configuração de ganho de áudio.

O callback AudioControl HAL inclui listas de motivos e os respectivos AudioGainConfigInfo, que consistem em:

  • ID da zona
  • Endereço da porta do dispositivo
  • O índice de volume > índice pode ser um índice restrito ou de atualização.

Os motivos podem ser amplamente categorizados como:

  • Motivos da restrição. Mudança temporária no comportamento de volume e desativação do som.
  • Motivos da atualização. Mudança permanente no comportamento do volume.

Tipos de restrições

Desde AudioControl de HAL AIDL de V3, os seguintes são tipos de restrições aceitas:

  • Desativar som
  • Bloqueia o conteúdo
  • Limitação
  • Atenuação
Restrição ativa Mudança de volume iniciada pelo usuário Botão de ativar/desativar som acionado pelo usuário
Desativar som ❌ (ativar som)

✔ (desativar som)
Bloqueia o conteúdo
Limitação ❌ (acima do limite)

✔ (abaixo do limite)
Atenuação

A prioridade entre as restrições é: silenciar > bloquear > limitar > atenuação.

Restrições de silenciamento

As restrições de silenciamento são:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Internamente, a estrutura de áudio do carro mantém estes dois estados de mudo:

  • Silenciar usuário. Ativada com base na solicitação do usuário, seja por CarAudioManager ou eventos principais.

  • Desativar som da HAL. Alternado com base nas restrições de mudo recebidas pelo callback AudioGain.

Para listeners como o app Configurações, o estado geral de mudo do grupo de volume (CarVolumeGroupInfo.isMuted()) será baseado na ativação de um dos mudos acima.

Quando o HAL mute está ativado, todas as mudanças de volume e solicitações de ativação de grupo recebidas são ignoradas durante a restrição.

Caso de interação: a função de mudo da HAL está ativa e o usuário pede para ativar/desativar o mudo

Quando a HAL mute está ativada e a User mute está desativada:

  • O estado geral de mudo do grupo de volume foi alterado para true.
  • As solicitações do usuário para ativar o silenciamento serão processadas.
    • Motivo: os pedidos de silenciamento do usuário precisam ser atendidos sempre para preservar a privacidade dos usuários.

Quando o HAL e o usuário ativam o mudo:

  • O estado geral de mudo do grupo de volume foi alterado para true.

  • As solicitações do usuário para desativar o mudo NOT serão processadas. O estado de silenciamento do usuário em cache permanece ativado.

    • Motivo: as solicitações para ativar o som do usuário só serão atendidas se não houver restrições ativas.

    • Motivo: ativar o som de um usuário silenciado em cache pode causar uma explosão de som não intencional e colocar a segurança do usuário em risco. Isso é especialmente verdadeiro se o estado de mudo estiver ativado em vários ciclos de ignição, o que diminui a percepção dos usuários sobre o nível de som.

Caso de interação: o HAL Mute é ativado e desativado, enquanto o User mute não muda

Alternar o mudo da HAL muda o estado geral de mudo do grupo de volume. No entanto, ele não atualiza diretamente o estado de mudo do usuário. Quando a opção "Silenciar usuário" está desativada e o callback de silenciamento da HAL para ativar é recebido:

  • O estado geral de mudo do grupo de volume foi alterado para true.
  • As solicitações do usuário para mudar o volume NOT serão processadas enquanto o HAL mute estiver ativado.

    • Motivo: o usuário não consegue ouvir sons enquanto o modo silencioso está ativado. Permitir a mudança de volume pode resultar em uma explosão de som e colocar em risco a segurança do usuário.

    • Motivo: os apps de volume podem registrar callbacks e acionar um cancelamento do mudo (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) automaticamente sem intervenção do usuário, se esse for o comportamento esperado pelo OEM.

Quando a desativação do som da HAL e do usuário estão desativadas:

  • O estado de mudo do grupo de volume foi alterado para false.

    Motivo: tornar o estado de desativação persistente e pedir que o usuário ative o som pode interromper desnecessariamente o usuário quando os estados de desativação são alternados com frequência.

  • As solicitações dos usuários para mudar o volume serão processadas normalmente.

Bloqueia o conteúdo

As restrições de bloqueio são:

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE.

Quando as restrições de bloqueio estão ativas, os pedidos dos usuários para:

  • As mudanças de volume não serão processadas.
  • Ativar/desativar som são processados.

Limitação

As restrições de limitação são:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Quando as restrições de limitação estão ativas, as solicitações dos usuários para:

  • Mudar o volume:

    • Dentro da limitação são processados
    • Acima da limitação, os dados não são tratados
  • Ativar/desativar som são processados.

Atenuação

As restrições de atenuação são:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

Quando as restrições de atenuação estão ativas, os pedidos dos usuários para:

  • As mudanças de volume são processadas. O novo nível de volume atual é definido como o volume atenuado (em vez do volume anterior). As mudanças futuras de volume serão feitas a partir desse nível.

  • A ativação/desativação do som é processada.

Atualizar para o índice

O seguinte é considerado como a atualização assíncrona do índice de volume: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

Por esse motivo, a HAL AudioControl pode atualizar o índice atual do grupo de volume para o índice especificado. Isso é usado principalmente como feedback do sistema de áudio para a solicitação de mudança de volume do framework de áudio do carro. A atualização do índice também é comunicada aos apps como um callback CarVolumeGroupEvent para sincronizar o índice.

Exemplos

Caso de uso: o usuário atualiza o índice de volume para 30

  • O usuário usa o app Volume para mudar o índice de volume para 30.

  • Esse índice é convertido em ganho de volume e enviado para a HAL de áudio.

  • As implementações do fornecedor deAudio HAL recebem o novo ganho de volume e atualizam o sistema de áudio (como um amplificador externo).

  • O sistema de áudio responde que o nível de volume só é atualizado para o índice 15 (por motivos desconhecidos para o Android).

  • Implementações de acionadores AudioControl HAL do fornecedor:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • O serviço de áudio do carro consome o novo índice do callback usado para persistência e callbacks para o app de volume. O índice solicitado pelo usuário é 30. No entanto, o feedback assíncrono do sistema de áudio atualiza o índice para 15.

Caso de uso: primeira reprodução de áudio após sair da suspensão

  • O índice de volume antes da suspensão é definido como um nível alto de 95 (intervalo: [0-99]).

  • O Android entra em suspensão.

  • Quando o Android existir, suspenda (por exemplo, retome):

    • O fornecedor Audio HAL/AudioControl HAL aplica um índice seguro de 30 ao sistema de áudio localmente.

    • O fornecedor AudioControl HAL também aciona o callback para o índice seguro:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • O serviço de áudio do carro consome o novo índice do callback usado para persistência e os próprios callbacks para o app de volume, sincronizando o índice. O índice de volume antes da suspensão é 95. No entanto, depois da retomada, esse índice é definido para um nível de volume seguro de 30 pelo implementador do AudioControl HAL.

Configuração dinâmica de volume

Para esse recurso, consideramos os seguintes casos de uso principais:

  1. Configuração de fim de linha (EOL, na sigla em inglês) do veículo.

    • As montadoras preferem atualizar as configurações de volume no fim da vida útil com base na configuração do sistema de áudio do veículo. Normalmente, esse é um sideload sem atualizar a imagem do SW do Android.

    • As fabricantes de automóveis talvez precisem atualizar a configuração de volume durante um cronograma de serviços.

  2. Configuração do ambiente de execução. Os sistemas de áudio automotivos são compatíveis com configurações de amplificador externo, e essas ECUs podem hospedar as configurações de faixa de volume consultadas durante a inicialização.

  3. Configuração sob demanda. Oferecido para atender à crescente necessidade de recursos de áudio baseados em demanda, em que os usuários assinam o processamento de sinal aprimorado por um período. As novas configurações de intervalo de volume são válidas durante a vigência de uma assinatura.

Design

A configuração dinâmica de volume é feita em três etapas:

  • Descoberta. A implementação da HAL AudioControl do fornecedor descobre novas atualizações de intervalo de volume por um mecanismo IPC personalizado de propriedade do fornecedor.

    Depois da descoberta, um callback é gerado por AudioControl::IModuleChangeCallback.

  • Atualizar. A pilha de áudio do carro atualiza os estados do grupo de volume com os novos intervalos de volume.

    Fazemos o possível para manter o mesmo nível de volume após a atualização do intervalo. No entanto, se o índice estiver fora dos limites, o índice de volume atual será definido como um valor seguro. Por exemplo, o nível padrão fornecido pelo fornecedor durante o callback.

  • Callback.

    • Após as atualizações do intervalo do grupo de volume, a pilha de áudio do carro aciona um callback para apps registrados usando CarVolumeGroupEventCallback.

    • CarVolumeGroupEvent contém o CarVolumeGroupInfo atualizado, o tipo de evento (o que mudou) e as informações extras (por que mudou).

imagem

Figura 2. Configuração dinâmica de volume.

API HAL

AudioControl @ 3.0 AIDL

A versão 3.0 da HAL AIDL AudioControl introduz as seguintes APIs:

API
IAudioControl#setModuleChangeCallback Define uma instância de IModuleChangeCallback com a HAL AudioControl.
IAudioControl#clearModuleChangeCallback Limpa a instância de IModuleChangeCallback definida anteriormente com a HAL AudioControl.
IModuleChangeCallback#onAudioPortsChanged Callback para notificar mudanças em AudioPorts

Sequência

O diagrama de sequência da configuração dinâmica de volume é mostrado abaixo.

imagem

Figura 3. Diagrama de sequência para configuração dinâmica de volume.

Principais aspectos

Para otimizar esse recurso, considere o seguinte.

  • Os AudioPorts fornecidos como parte do callback precisam corresponder à definição do BUS automotivo:

    • Porta do dispositivo. IN_DEVICE, OUT_DEVICE
    • Conexão. BUS
    • Address. Definido na definição da HAL de áudio
    • Modo de ganho.JOINT
  • Os fornecedores precisam definir um superconjunto de definições de intervalo de volume na política de HAL de áudio e usar o callback para personalizar variantes de veículos. Consulte a definição de AIDL IModuleChangeCallbac para mais informações.

  • Quando mais de um BUS de áudio pertence ao mesmo grupo de volume, cada precisa ter definições de intervalo de volume idênticas. Caso contrário, a estrutura de áudio do carro vai rejeitar a nova definição de intervalo de volume.