Gerenciamento de volumes

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

Volumes fixos

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

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

Quando o sinalizador config_useFixedVolume não está definido (ou está definido como false ), os aplicativos podem chamar AudioManager.setStreamVolume() para alterar o volume por tipo de stream no mixer de software. Isso pode nem sempre ser desejável devido aos possíveis efeitos em outros aplicativos e ao fato de que a atenuação do 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 volumes gerenciam os volumes de um conjunto de dispositivos dentro de uma zona de áudio. Para cada grupo de volumes, 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

CarAudioService usa grupos de volumes definidos em 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>

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

Configurar ganhos de grupo de volumes

Cada grupo de volumes possui valores de ganho mínimo, máximo e padrão, bem como um tamanho de passo baseado nos valores configurados em audio_policy_configuration.xml para os dispositivos associados ao grupo de volumes.

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

  • Tamanho do passo. Deve ser o mesmo para todos os dispositivos controlados pelo grupo de volumes.
  • Ganho mínimo. Menor ganho mínimo entre os dispositivos do grupo.
  • Ganho máximo. Maior ganho máximo entre os dispositivos do grupo.
  • Ganho padrão. Maior ganho padrão entre os dispositivos do grupo.

Dada a forma como estes valores estão configurados, é possível definir o ganho de um grupo de volumes fora da faixa suportada por um dispositivo associado ao grupo de volumes. Nesse caso, para esse dispositivo, o ganho é definido como o valor de ganho mínimo ou máximo do dispositivo, dependendo se o valor do grupo de volumes está abaixo ou acima da faixa.

Identificadores de grupos 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 dentro de uma zona de áudio, onde N é o número de grupos de volumes nessa zona. Dessa forma, os IDs de grupos de volumes não são exclusivos entre zonas. Esses identificadores são usados ​​para APIs CarAudioManager associadas a grupos de volumes. Qualquer API que receba um groupId sem um zoneId assume como padrão a zona de áudio primária.

Gerenciamento de volume multizona

Espera-se que cada zona de áudio tenha um ou mais grupos de volume, e cada grupo de volume está associado apenas a uma única zona de áudio. Esse relacionamento é definido 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 essa zona. Essas configurações são específicas da zona, o que significa que se um usuário fizer login em um monitor associado à zona primária e, posteriormente, entrar em uma zona associada a uma zona de áudio secundária, os níveis de volume carregados e persistidos para a primeira zona serão diferentes daqueles para a zona secundária.

Lidar com eventos de chave de volume

O Android define vários códigos-chave para controle de volume, incluindo:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Por padrão, o Android roteia os eventos de teclas de volume para aplicativos. As implementações automotivas devem forçar o processamento desses eventos principais por CarAudioService , que então chama setGroupVolume ou setMasterMute , conforme apropriado. Para forçar esse comportamento, defina o sinalizador config_handleVolumeKeysInWindowManager como true :

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

Atualmente, os eventos de teclas de volume não têm como distinguir a qual zona se destinam e presume-se que todos estejam associados à zona de áudio primária. Quando um evento de chave de volume é recebido, CarAudioService determina qual grupo de volume ajustar, buscando os contextos de áudio para os players ativos e, em seguida, 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 ordem fixa definida em CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY .

Desvanecimento e equilíbrio

Ambas as versões do AudioControl HAL incluem APIs para definir fade e equilíbrio no veículo. APIs de sistema correspondentes para CarAudioManager passam valores para o AudioControl HAL. Essas APIs requerem 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 está centralizado
    • +1,0 está totalmente certo
    • -1,0 está totalmente restante
    • 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 está centralizado
    • +1,0 está totalmente avançado
    • -1.0 está 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 exibi-los aos usuários. Eles podem ser aplicados estritamente à mídia ou de maneira geral a todos os sons do Android. O Android 11 também introduziu suporte para aplicação de efeitos de áudio em dispositivos de saída. Com isso, é possível gerenciar alternativamente o fade e o equilíbrio por meio de efeitos de áudio nos dispositivos de saída apropriados, em vez de por meio dessas APIs.

Esquiva de áudio

A redução de áudio ocorre quando o veículo reduz o ganho de um fluxo para que outro fluxo reproduzido simultaneamente possa ser ouvido com mais clareza. No AAOS, a redução de áudio é implementada pelo HAL. O Android não tem controle sobre sons além do sistema operacional. 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 ou não fluxos ativos.

Quando se abaixar

Embora caiba ao OEM individual determinar como o ducking é tratado pelo HAL, recomendamos as seguintes diretrizes.

  • Vários streams reproduzidos no Android geralmente ocorrem quando dois aplicativos ou serviços mantêm simultaneamente o foco do áudio. 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 plugin de áudio automotivo, isso também depende do gerenciamento do AudioFocus.

  • Quaisquer fluxos misturados pelo Android são feitos antes de quaisquer ganhos serem aplicados. Como tal, qualquer fluxo que deva ser reduzido quando reproduzido simultaneamente com outro deve ser roteado para dispositivos de saída separados para que o HAL possa aplicar o redução antes de misturá-los.

A seguir estão possíveis interações simultâneas que são recomendadas.

Interação Ação
EMERGENCY Reduz ou silencia tudo, exceto SAFETY
SAFETY Evita tudo, exceto EMERGENCY
NAVIGATION Abafa tudo, exceto SAFETY e EMERGENCY
CALL Evita tudo, exceto SAFETY , EMERGENCY e NAVIGATION
VOICE Patos CALL_RING
VEHICLE_SOUNDS Você determina a importância do som ativo e se ele evita ou não outros sons.
MUSIC e ANNOUNCEMENT Abaixado por tudo. As exceções são os tons de interação por toque reproduzidos como SYSTEM_SOUND .

Considerações ao se esquivar

Alguns aplicativos e serviços, como navegação ou assistente, podem usar vários players para executar ações. Evite uma redução agressiva quando um fluxo de dados parar de fluir através dos dispositivos de saída para garantir que a mídia não retorne ao volume máximo antes de ser reduzida antes3 da próxima reprodução da navegação ou de um aplicativo assistente ser iniciado.

Para veículos com vários estágios de som com isolamento bom o suficiente, você pode direcionar o áudio para diferentes áreas do carro em vez de se abaixar. Por exemplo, as instruções de navegação podem ser encaminhadas para os alto-falantes do encosto de cabeça do motorista enquanto continua a tocar música em toda a cabine em um volume normal.

Sons críticos de segurança

O Android 11 introduziu APIs de foco de áudio HAL . O HAL garante que os sons críticos para a segurança sejam priorizados em relação a outros sons. Se o HAL mantiver o foco de áudio para USAGE_EMERGENCY , não será garantido que os aplicativos e serviços do Android não reproduzam sons. O HAL determina quais fluxos do Android devem ser mixados ou silenciados para reproduzir sons críticos para a segurança.

Configurar a IU de configurações de volume

AAOS desacopla a UI de configurações de volume da configuração do grupo de volumes. Eles podem ser sobrepostos conforme descrito em Configurar ganhos do grupo de volumes . Essa separação garante que nenhuma alteração será necessária caso a configuração dos grupos de volumes seja alterada.

Na IU de configurações do carro, packages/apps/Car/Settings/res/xml/car_volume_items.xml contém os elementos da IU (recursos de título e ícone) associados a cada AudioAttributes.USAGE definido. Este arquivo fornece uma renderização razoável dos VolumeGroups definidos 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 do usuário de configurações do carro renderiza o VolumeGroup usando os recursos associados a voice_communication , pois é 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 IU de configurações de volume usa as seguintes APIs CarAudioManager baseadas em VolumeGroup :

  • getVolumeGroupCount() para saber quantos controles devem ser desenhados.
  • getGroupMinVolume() e getGroupMaxVolume() para obter os limites inferior e superior.
  • getGroupVolume() para obter o volume atual.
  • registerVolumeChangeObserver() para ser notificado sobre alterações de volume.

Evento de grupo de volume de carros

Os casos de uso automotivo de atualização de volume e alternância de mudo têm bases contextuais que podem definir as ações de determinados aplicativos, como as configurações de volume. O retorno de chamada de volume e mudo atual da pilha de áudio do carro fornece informações contextuais limitadas. Para melhor atender aos casos de uso automotivo e à escalabilidade futura, CarVolumeGroupEvent foi adicionado ao Android 14. Cada evento carrega três tipos críticos de informações:

  • Lista de CarVolumeGroupInfo
  • EventTypes (mapeado em bits)
  • Lista de ExtraInfos

CarVolumeGroupInfo

O receptor do retorno de chamada do evento tem acesso imediato à lista de informações do grupo de volumes de carros impactados. Isso significa que o aplicativo não precisa fazer chamadas adicionais para a estrutura de áudio do carro para obter o estado mais recente. Ele pode simplesmente usar o CarVolumeGroupInfos recebido to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of EventTypes`, conforme explicado abaixo.

Tipos de eventos

Define qual aspecto do CarVolumeGroupInfo foi alterado. Os aplicativos podem usar isso para identificar alterações e tomar as ações necessárias. Por exemplo, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED indica que o CarVolumeGroups' maximum volume gain index has changed and can be queried by CarVolumeGroupInfo.getMaxVolumeGainIndex()`.

A tabela a seguir mostra o relacionamento entre EventType e CarVolumeGroupInfo .

Tipo de evento 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 informações adicionais sobre por que o CarVolumeGroup foi alterado. Os aplicativos podem usar essas informações para fornecer contexto adicional para alertar o usuário para agir ou para notificar. Por exemplo, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL indica uma atenuação transitória ativa devido a uma sobrecarga térmica. O aplicativo pode informar ao usuário caso ele tente aumentar o volume.

Não aplicamos nenhum processo para ExtraInfos . Fica a seu critério determinar o processo com base no ExtraInfos . Por exemplo, se a atenuação estiver ativa devido a EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED , você também pode optar por atenuar inicialmente a interface da barra de volume para evitar que o usuário altere o volume. Outros podem optar por mostrar um brinde informando que o abaixamento está ativo e permitir que o usuário altere o volume.

A estrutura de áudio do carro depende do AudioControl HAL IAudioGainCallback para fornecer os ExtraInfos sugeridos. Para saber mais, consulte Retorno de chamada de ganho de áudio .

CarVolumeGroupEvent é dimensionado para atender às necessidades futuras da estrutura de áudio automotivo. Pretendemos oferecer suporte a novos recursos apenas por meio de CarVolumeGroupEvent . Recomendamos fortemente que os desenvolvedores de aplicativos usem CarVolumeGroupEvent para lidar com o volume do grupo e silenciar alterações.

Retorno de chamada de evento de grupo de volume de carro

O Android 14 fornece um novo retorno de chamada para aplicativos privilegiados e de plataforma se registrarem e serem notificados sobre CarVolumeGroupEvents .

  • Para se registrar para retorno de chamada, use CarAudioManager#registerCarVolumeGroupEventCallback()

  • Para cancelar o registro do retorno de chamada, use CarAudioManager#unregisterCarVolumeGroupEventCallback()

Se um aplicativo for registrado no novo CarVolumeGroupEventCallback e no legado CarVolumeCallback , o evento CarVolumeGroupEventCallbacks será priorizado. A pilha de áudio do carro não aciona mais CarVolumeCallback . Isso evita gatilhos duplicados para o mesmo aplicativo para o mesmo evento.

Recomendamos fortemente que você use CarVolumeGroupEventCallback para gerenciar o volume do grupo e silenciar alterações.

Retorno de chamada de ganho de áudio

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

API HAL

Controle de Áudio @2.0 AIDL

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

API Propósito
IAudioControl#registerGainCallback Registra uma instância de IAudioGainCallback com o AudioControl HAL.
IAudioGainCallback#onAudioDeviceGainsChanged Retorno de chamada assíncrono para notificar alterações na configuração de ganho de áudio.

O retorno de chamada AudioControl HAL inclui listas de motivos e o respectivo AudioGainConfigInfo , que consiste em:

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

Os motivos podem ser amplamente categorizados como:

  • Razões de restrição. Mudança transitória no volume e comportamento mudo.
  • Motivos de atualização. Mudança permanente no comportamento do volume.

Tipos de restrição

A partir do AudioControl HAL AIDL V3 , os seguintes são os tipos de restrições suportadas:

  • Mudo
  • Bloqueio
  • Limitação
  • Atenuação
Restrição ativa Alteração de volume acionada pelo usuário Alternância de mudo acionada pelo usuário
Mudo ❌ (ativar som)

✔ (mudo)
Bloqueio
Limitação ❌ (acima do limite)

✔ (sob limite)
Atenuação

A prioridade entre as restrições é Mute > Blocking > Limitation > Attenuation.

Restrições de silenciamento

As restrições de silêncio são:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

A estrutura de áudio do carro mantém internamente estes dois estados mudos:

  • Usuário mudo. Alternado com base na solicitação do usuário, seja por meio CarAudioManager ou de eventos principais.

  • HAL mudo. Alternado com base nas restrições de mudo recebidas por meio do retorno de chamada AudioGain .

Para ouvintes como o aplicativo Configurações, o estado mudo geral do grupo de volume ( CarVolumeGroupInfo.isMuted() ) será baseado se algum dos mudos acima estiver habilitado.

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

Caso de interação: HAL mudo está ativo e solicitações do usuário para mudo alternam

Quando o silenciamento HAL está ativado e o silenciamento do usuário está desativado:

  • O estado mudo geral do grupo de volumes é alterado para true .
  • Solicitações do usuário para ativar o mudo serão processadas.
    • Motivo: as solicitações de silenciamento do usuário devem ser sempre atendidas para preservar a privacidade dos usuários.

Quando o silenciamento HAL está ativado e o silenciamento do usuário está ativado:

  • O estado mudo geral do grupo de volumes é alterado para true .

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

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

    • Motivo: A ativação do mudo em cache do usuário pode causar explosão de som não intencional e colocar em risco a segurança do usuário. Isto é especialmente verdadeiro se o estado mudo estiver ativado durante os ciclos de ignição, o que diminui a consciência dos usuários sobre a percepção do nível sonoro.

Caso de interação: HAL Mute ativado e desativado enquanto User mute não tem alterações

Alternar o mudo HAL mudará o estado mudo geral do grupo de volume. No entanto, ele não atualiza diretamente o estado mudo do usuário. Quando o mudo do usuário está desabilitado e o retorno de chamada de mudo HAL para habilitação é recebido:

  • O estado mudo geral do grupo de volumes é alterado para true .
  • Solicitações do usuário para alterar o volume NOT serão processadas enquanto o HAL mute estiver ativado.

    • Motivo: o usuário não consegue perceber o som enquanto o mudo está ativado. Permitir a alteração do volume pode resultar em uma explosão sonora e colocar em risco a segurança do usuário.

    • Motivo: os aplicativos de volume podem se registrar para retornos de chamada e ativar o som (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) automaticamente sem intervenção do usuário, se esse for o comportamento esperado pelo OEM.

Quando o silenciamento HAL está desativado enquanto o silenciamento do usuário está desativado:

  • O estado mudo do grupo de volumes é alterado para false .

    Motivo: tornar o estado mudo fixo e solicitar que o usuário ative o som pode interromper desnecessariamente o usuário quando os estados mudo alternam com frequência.

  • Solicitações de usuários para alteração de volume serão processadas normalmente.

Bloqueio

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, as solicitações dos usuários para:

  • O volume de alterações não será processado.
  • Alternar mudo 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:

  • Alterar volume:

    • Dentro da Limitação são processados
    • Limitações acima não são processadas
  • Alternar mudo 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, as solicitações dos usuários para:

  • O volume de alterações é processado. O novo nível de volume atual é definido para o volume atenuado (em vez do volume anterior). As futuras alterações de volume serão feitas a partir deste nível.

  • A alternância de mudo é processada.

Atualizar para índice

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

Por esse motivo, o AudioControl HAL pode atualizar o índice atual do grupo de volumes para o índice especificado. Isto é usado principalmente como feedback do sistema de áudio para a solicitação de alteração de volume da estrutura de áudio do carro. A atualização do índice também é comunicada aos Apps como um retorno de chamada CarVolumeGroupEvent para sincronizar o índice.

Exemplos

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

  • O usuário usa o aplicativo Volume para alterar o índice de volume para 30.

  • Este índice é convertido em ganho de volume e enviado para Audio HAL.

  • As implementações do fornecedor de Audio 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 do Android).

  • Implementações de fornecedores de gatilhos AudioControl HAL :

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • O serviço de áudio automotivo consome o novo índice do retorno de chamada usado para persistência e retornos de chamada para o aplicativo 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 para um nível alto de 95 (intervalo: [0-99]).

  • Android entra em suspensão.

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

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

    • O fornecedor AudioControl HAL também aciona o retorno de chamada para o índice seguro:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • O serviço de áudio automotivo consome o novo índice do retorno de chamada usado para persistência e seus próprios retornos de chamada para o aplicativo de volume que sincroniza o índice. O índice de volume antes da suspensão é 95. Entretanto, após a retomada, esse índice é definido para um nível de volume seguro de 30 pelo implementador AudioControl HAL .

Configuração de volume dinâmico

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

  1. Configuração de fim de linha (EOL) do veículo.

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

    • As montadoras podem precisar atualizar a configuração do volume durante uma programação de serviço.

  2. Configuração de tempo de execução. Os sistemas de áudio automotivo suportam configurações de amplificadores externos e essas ECUs podem hospedar as configurações de faixa de volume que são consultadas durante o tempo de inicialização.

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

Projeto

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

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

    Uma vez descoberto, um retorno de chamada é gerado por meio de AudioControl::IModuleChangeCallback .

  • Atualizar. A pilha de áudio automotivo atualiza os estados do grupo de volume com as novas faixas de volume.

    Esforços são feitos para manter o mesmo nível de volume após a atualização da faixa de volume. No entanto, se o índice sair dos limites, o índice de volume atual será definido com um valor seguro. Por exemplo, o nível padrão fornecido pelo fornecedor durante o retorno de chamada.

  • Ligar de volta.

    • Após as atualizações do intervalo do grupo de volume, a pilha de áudio do carro aciona um retorno de chamada para aplicativos registrados por meio de CarVolumeGroupEventCallback .

    • CarVolumeGroupEvent carrega CarVolumeGroupInfo , Event-type (o que mudou) e Extra-info atualizados (por que mudou).

imagem

Figura 1. Configuração de volume dinâmico.

API HAL

Controle de Áudio @ 3.0 AIDL

A versão 3.0 do AudioControl AIDL HAL apresenta as seguintes APIs:

API
IAudioControl#setModuleChangeCallback Define uma instância de IModuleChangeCallback com AudioControl HAL.
IAudioControl#clearModuleChangeCallback Limpa a instância de IModuleChangeCallback definida anteriormente com o AudioControl HAL.
IModuleChangeCallback#onAudioPortsChanged Retorno de chamada para notificar alterações em AudioPorts

Seqüência

O diagrama de sequência da configuração do volume dinâmico é exibido abaixo.

imagem

Figura 2. Diagrama de sequência para configuração de volume dinâmico.

Aspectos chaves

Para otimizar esse recurso, considere o seguinte.

  • AudioPorts fornecidos como parte do retorno de chamada devem corresponder à definição do Automotive BUS:

    • Porta do dispositivo. IN_DEVICE , OUT_DEVICE
    • Conexão. BUS
    • Endereço. Definido na definição HAL de áudio
    • Modo de ganho. JOINT
  • Os fornecedores devem definir um superconjunto de definições de faixa de volume na política HAL de áudio e usar o retorno de chamada para personalizá-lo para variantes de veículos. Consulte a definição AIDL IModuleChangeCallbac para obter mais informações.

  • Quando mais de um BUS de áudio pertence ao mesmo grupo de volume, cada um deve ter definições de faixa de volume idênticas. Não fazer isso resulta na rejeição da nova definição de faixa de volume pela estrutura de áudio do carro.