O gerenciamento de volume está contido em CarAudioService
, que usa volumes fixos
com a expectativa de que os volumes sejam aplicados abaixo do 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
mixador de software. Para evitar efeitos colaterais, defina a flag config_useFixedVolume
como
true
(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 transmissão no mixer de software. Isso nem sempre é desejável devido a 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. O volume de cada grupo 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 são carregadas quando o usuário faz login.
Definir grupos de volume
O CarAudioService usa grupos de volume 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 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 de grupos 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 volume verifica os valores de ganho dos dispositivos associados e configura o grupo da seguinte maneira:
- Tamanho do passo. Precisa ser o mesmo para todos os dispositivos controlados pelo grupo de volume.
- Ganho mínimo. Menor ganho mínimo entre os dispositivos do grupo.
- Ganho máximo. Ganho máximo mais alto entre os dispositivos do grupo.
- Ganho padrão. Ganho padrão mais alto 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 ao grupo de volume. Nesse caso, o ganho é definido como o valor mínimo ou máximo de ganho do dispositivo com base no valor do grupo de volume abaixo ou acima do intervalo.
Identificadores de grupos de volumes
Os grupos de volumes são identificados no momento da 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 de grupo de volume não são exclusivos
em todas as zonas. Esses identificadores são usados para APIs CarAudioManager
associadas
a grupos de volume. Qualquer API que receba um groupId
sem um zoneId
usa a zona de áudio principal por padrão.
Gerenciamento de volume de várias zonas
Cada zona de áudio precisa ter um ou mais grupos de volume, e cada grupo
de volume é associado apenas a uma 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 essa zona. Essas configurações são específicas da zona, ou seja, se um usuário fizer login em uma tela associada à zona principal e depois fizer login 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 zona secundária.
Processar eventos de teclas 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 esses eventos principais a serem processados 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 de tecla de volume não têm como distinguir para qual zona
eles se destinam e são considerados associados à zona de áudio
principal. Quando um evento de tecla de volume é recebido, CarAudioService
determina
qual grupo de volume ajustar, recuperando 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 ordem fixa definida em
CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
.
Desvanecimento e equilíbrio
As duas versões da HAL AudioControl incluem APIs para definir o fade e o equilíbrio
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 está centralizado
- +1,0 está 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 está centralizado
- +1.0 é 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 exibir os valores para os usuários. Elas podem ser aplicadas apenas a mídia ou a todos os sons do Android. O Android 11 também introduziu o suporte para aplicar efeitos de áudio a dispositivos de saída. Com isso, é possível gerenciar o desbotamento e o equilíbrio de forma alternativa 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 reduz o ganho de um stream para que outro que está tocando ao mesmo tempo possa ser ouvido com mais clareza. No AAOS, a atenuação automática de áudio é implementada pelo HAL. O Android não tem controle sobre os sons fora do SO. No Android 11, a principal informação disponível para o HAL para tomar decisões de muting é se dois dispositivos de saída têm streams ativos ou não.
Quando se abaixar
Embora o OEM individual determine como o ducking é processado pelo HAL, recomendamos as diretrizes a seguir.
Várias transmissões em execução 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 gerenciamento de AudioFocus.
Todas as transmissões combinadas pelo Android são feitas antes de qualquer ganho ser aplicado. Portanto, qualquer transmissão que precise ser reduzida quando reproduzida simultaneamente com outra precisa ser roteada para dispositivos de saída separados para que a HAL possa aplicar a redução antes de misturá-las.
Comportamento de abatimento recomendado
As seguintes interações simultâneas em potencial são recomendadas.
Interação | Ação |
---|---|
EMERGENCY
| Oculta ou silencia tudo, exceto SAFETY
|
SAFETY |
Oculta tudo, exceto EMERGENCY |
NAVIGATION |
Oculta tudo, exceto SAFETY e EMERGENCY |
CALL |
Oculta tudo, exceto SAFETY , EMERGENCY e NAVIGATION . |
VOICE |
Patos CALL_RING |
VEHICLE_SOUNDS |
Você determina a importância do som ativo e se ele silencia outros sons. |
MUSIC e ANNOUNCEMENT |
Tudo passou por mim. As exceções são tons de interação por toque reproduzidos como
SYSTEM_SOUND .
|
Considerações ao usar o recurso de abatimento
Alguns apps e serviços, como navegação ou um assistente, podem usar vários players para realizar ações. Evite a desativação agressiva quando um fluxo de dados parar de fluir pelos dispositivos de saída para garantir que a mídia não volte ao volume máximo antes de ser reduzida antes da próxima reprodução da navegação ou de um app de assistente.
Para veículos com vários estágios de som com isolamento suficiente, é possível encaminhar o áudio para diferentes áreas do carro em vez de abaixá-lo. 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 todo o carro em um volume normal.
Sons de segurança essenciais
O Android 11 introduziu
APIs de foco de áudio HAL. O HAL garante
que os sons críticos de 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 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 à segurança.
Configurar a interface das configurações de volume
O AAOS separa a interface de configurações de volume da configuração do grupo de volume. Elas podem ser sobrepostas, conforme descrito em Configurar ganhos de grupo de volume. Essa separação garante que nenhuma mudança seja necessária se a configuração dos grupos de volume mudar.
Na interface de configurações do carro, packages/apps/Car/Settings/res/xml/car_volume_items.xml
contém os elementos da interface (título e recursos de ícone) associados a cada
AudioAttributes.USAGE
definido. Esse arquivo fornece 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 a voice_communication
, já que esse é o primeiro parâmetro
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 de configurações de volume usa
as seguintes APIs CarAudioManager baseadas em VolumeGroup
:
getVolumeGroupCount()
para saber quantos controles precisam ser desenhados.getGroupMinVolume()
egetGroupMaxVolume()
para receber os limites inferior e superior.getGroupVolume()
para saber o volume atual.registerVolumeChangeObserver()
para receber notificações sobre mudanças no volume.
Evento de grupo de volume do carro
Os casos de uso automotivos da atualização de volume e do botão de silenciar têm fundamentos contextuais que podem definir as ações de determinados apps, como as configurações de volume. O callback de volume e mudo atual da pilha de áudio do carro fornece informações contextuais limitadas. Para atender melhor aos casos de uso automotivo e à escalabilidade futura, o CarVolumeGroupEvent foi adicionado ao Android 14. Cada evento tem três tipos de informações importantes:
- Lista de
CarVolumeGroupInfo
EventTypes
(mapeado em bits)- Lista de
ExtraInfos
CarVolumeGroupInfo
O receptor do callback do evento tem acesso imediato à lista de informações do grupo de volume do carro afetado. Isso significa que o app não precisa fazer mais
chamadas para o framework de áudio do carro para receber o estado mais recente. Ele pode
simplesmente usar o CarVolumeGroupInfos
recebido para atualizar a interface ou os estados
internos. Para facilitar para os apps, os aspectos que mudaram em um grupo de volume
de carro 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 índice de ganho de volume máximo
CarVolumeGroups
foi alterado 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
foi alterado. Os apps
podem usar essas informações para fornecer mais contexto e alertar o usuário
para que ele aja ou notifique. 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
. Cabe a você 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á
desfocar a IU da barra de volume inicialmente para impedir que o usuário mude o volume.
Outros podem optar por mostrar uma mensagem curta informando que o ducking está ativo e permitir que o usuário
mude o volume.
O framework de áudio do carro depende da IAudioGainCallback
da HAL AudioControl para
fornecer a ExtraInfos
sugerida. Para saber mais, consulte
Callback de ganho de áudio.
O CarVolumeGroupEvent
é dimensionado para atender às necessidades futuras do framework de áudio para carros. Nosso
objetivo é oferecer suporte a novos recursos somente com CarVolumeGroupEvent
. É
altamente recomendável que os desenvolvedores de apps usem CarVolumeGroupEvent
para processar
mudanças de volume e mudo de grupo.
Callback do evento de grupo de volume do carro
O Android 14 oferece um novo callback para que apps privilegiados e
de plataforma se registrem e sejam notificados sobre CarVolumeGroupEvents
.
Para registrar o callback, use
CarAudioManager#registerCarVolumeGroupEventCallback()
.Para cancelar o registro do callback, use
CarAudioManager#unregisterCarVolumeGroupEventCallback()
.
Se um app se registrar com o novo CarVolumeGroupEventCallback
e o CarVolumeCallback
legado, o CarVolumeGroupEventCallbacks
do evento será priorizado.
A pilha de áudio do carro não aciona mais CarVolumeCallback
. Isso evita
gatilhos duplicados para o mesmo app para o mesmo evento.
Recomendamos o uso de CarVolumeGroupEventCallback
para gerenciar
mudanças de volume e mudo de grupo.
Callback de ganho de áudio
Desde o Android 13, a HAL AudioControl pode acionar um callback assíncrono para gerenciar atualizações do 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 | Objetivo |
---|---|
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 do HAL AudioControl inclui listas de motivos e o respectivo
AudioGainConfigInfo
, que consiste em:
- ID da zona
- Endereço da porta do dispositivo
- O índice de volume > pode ser um índice restrito ou de atualização.
Os motivos podem ser divididos em:
- Motivos da restrição. Mudança temporária no comportamento de volume e mudo.
- Atualizar os motivos. Mudança permanente no comportamento do volume.
Tipos de restrição
A partir de AudioControl
HAL AIDL
V3
, os seguintes são os tipos de restrições
com suporte:
- Desativar som
- Bloqueia o conteúdo
- Limitação
- Atenuação
Restrição ativa | Mudança de volume acionada pelo usuário | Botão de desativação do microfone 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
O framework de áudio de carro mantém internamente estes dois estados de silenciamento:
Silenciar usuário. Ativado com base na solicitação do usuário, seja por
CarAudioManager
ou eventos de tecla.Desativar som do HAL. Alternada com base nas restrições de silenciamento recebidas pelo callback
AudioGain
.
Para listeners como o app Configurações, o estado de desativação geral do grupo de volume
(CarVolumeGroupInfo.isMuted()
) será baseado na ativação de qualquer um dos
desativações acima.
Quando o silenciamento de HAL está ativado, todas as mudanças de volume recebidas e solicitações de ativação de grupo são ignoradas durante a restrição.
Caso de interação: o modo silencioso do HAL está ativo e o usuário solicita a alternância do modo silencioso
Quando o recurso "Desativar som" do HAL está ativado e o recurso "Desativar som" do usuário está desativado:
- O estado de mudo geral do grupo de volume foi alterado para
true
. - As solicitações do usuário para ativar o modo mudo serão processadas.
- Motivo: as solicitações de silenciamento do usuário precisam ser atendidas o tempo todo para preservar a privacidade dos usuários.
Quando o silêncio do HAL e do usuário estão ativados:
O estado de mudo geral do grupo de volume foi alterado para
true
.As solicitações do usuário para desativar o silenciamento serão
NOT
processadas. O estado de silenciamento 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: ativar o som do usuário 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 silêncio estiver ativado em ciclos de ignição, o que reduz a percepção dos usuários sobre o nível do som.
Caso de interação: o recurso "Silenciar usuário" está ativado e desativado, enquanto o recurso "Silenciar usuário" não tem alterações.
Alternar o silenciamento do HAL muda o estado de silenciamento geral do grupo de volume. No entanto, ele não atualiza diretamente o estado de silenciamento do usuário. Quando o modo de silêncio do usuário está desativado e o callback de silêncio do HAL para ativar é recebido:
- O estado de mudo geral do grupo de volume foi alterado para
true
. As solicitações do usuário para mudar o volume serão
NOT
processadas enquanto o modo mudo do HAL estiver ativado.Motivo: o usuário não consegue ouvir o som enquanto o recurso de silenciamento está ativado. Permitir a mudança de volume pode resultar em uma explosão de som e colocar a segurança do usuário em risco.
Motivo: os apps de volume podem se registrar para callbacks e acionar um desativamento (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) automaticamente sem intervenção do usuário, se esse for o comportamento esperado pelo OEM.
Quando o recurso "Desativar som" do HAL está desativado e o recurso "Desativar som" do usuário está desativado:
O estado de silenciamento do grupo de volume foi alterado para
false
.Motivo: tornar o estado de desativação do som fixo e solicitar que o usuário desative o som pode interromper o usuário desnecessariamente quando os estados de desativação do som alternam 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, as solicitações dos usuários para:
- O volume de mudança não será processado.
- O recurso de ativar/desativar som foi processado.
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 do limite, são processados
- As limitações acima não são processadas
O recurso de ativar/desativar som foi processado.
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 mudança é processado. O novo nível de volume atual é definido como o volume atenuado (em vez do volume anterior). As mudanças de volume futuras serão feitas a partir desse nível.
A ativação/desativação do som foi processada.
Atualizar para o índice
A atualização assíncrona do índice de volume é considerada como:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Por esse motivo, a HAL AudioControl pode atualizar o índice atual do grupo de volume
para o índice especificado. Ele é 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 com os 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 o HAL de áudio.
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 para o Android).
Implementações de acionadores de
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 do modo de 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 é suspenso (por exemplo, retomado):
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 seus próprios callbacks para o app de volume que sincroniza o índice. O índice de volume antes da suspensão é 95. No entanto, após a retomada, esse índice é definido como um nível de volume seguro de 30 pelo implementador
AudioControl HAL
.
Configuração dinâmica de volume
Para esse recurso, consideramos os seguintes casos de uso principais:
Configuração de fim de linha (EOL) do veículo.
Os fabricantes de automóveis preferem atualizar as configurações de volume no EOL com base na configuração do sistema de áudio do veículo. Normalmente, esse é um sideload sem atualizar a imagem do SO Android.
Os fabricantes de automóveis podem precisar atualizar a configuração do volume durante uma programação de serviço.
Configuração do ambiente de execução. Os sistemas de áudio automotivo oferecem suporte a configurações de amplificador externo, e essas ECUs podem hospedar as configurações de faixa de volume que são consultadas durante a inicialização.
Configuração sob demanda. Oferecido para atender à necessidade crescente de recursos de áudio sob demanda em que os usuários se inscrevem no processamento de sinal aprimorado por um período. As novas configurações de intervalo de volume são válidas durante a duração de uma assinatura.
Design
A configuração de volume dinâmico é feita em três etapas:
Descoberta. A implementação da HAL AudioControl do fornecedor descobre novas atualizações de faixa de volume usando um mecanismo IPC personalizado do fornecedor.
Depois de descoberta, um callback é gerado pelo
AudioControl::IModuleChangeCallback
.Atualize. A pilha de áudio do carro atualiza os estados do grupo de volume com os novos intervalos de volume.
Esforços são feitos para manter o mesmo nível de volume após a atualização do intervalo de volume. No entanto, se o índice sair dos limites, o índice de volume atual será definido como um valor seguro. Por exemplo, o nível padrão fornecido pelo fornecedor durante a chamada de retorno.
Callback.
Depois de postar atualizações de intervalo de grupo de volume, a pilha de áudio do carro aciona um callback para apps registrados pelo
CarVolumeGroupEventCallback
.CarVolumeGroupEvent
carrega oCarVolumeGroupInfo
atualizado, o tipo de evento (o que mudou) e o Extra-info (por que mudou).
Figura 1. Configuração de volume dinâmica.
API HAL
AIDL AudioControl @ 3.0
A versão 3.0 da HAL AIDL AudioControl apresenta 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 de volume dinâmico é mostrado abaixo.
Figura 2. Diagrama de sequência para a configuração de volume dinâmico.
Aspectos principais
Para otimizar esse recurso, considere o seguinte.
As AudioPorts fornecidas como parte do callback precisam corresponder à definição de BUS do Automotive:
- Porta do dispositivo.
IN_DEVICE
,OUT_DEVICE
- Conexão.
BUS
- Endereço. Definido na definição da HAL de áudio
- Modo de ganho.
JOINT
- Porta do dispositivo.
Os fornecedores precisam definir um superconjunto de definições de faixa de volume na política HAL de áudio e usar o callback para personalizá-la para variantes de veículo. Consulte a definição AIDL de
IModuleChangeCallbac
para mais informações.Quando mais de um BUS de áudio pertence ao mesmo grupo de volume, cada um precisa ter definições de faixa de volume idênticas. Caso contrário, o framework de áudio do carro vai rejeitar a nova definição do intervalo de volume.