O gerenciamento de volume está contido em CarAudioService
, que usa volumes fixos
com a expectativa de que os volumes sejam aplicados abaixo da HAL por um amplificador de
hardware em vez de no software. O CarAudioService
organiza os 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 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 sinalização config_useFixedVolume
não estiver definida (ou estiver definida como false
), os apps poderão chamar AudioManager.setStreamVolume()
para mudar o volume por tipo de stream 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 volumes gerenciam os volumes de uma coleção de dispositivos em 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 são 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 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 volumes
Cada grupo de volumes tem valores de ganho mínimo, máximo e padrão, bem como um
tamanho de etapa com base 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 maneira:
- Tamanho da etapa. Precisa ser o mesmo para todos os dispositivos controlados pelo grupo de volumes.
- Ganho mínimo. Menor ganho mínimo entre os dispositivos no grupo.
- Ganho máximo. Maior ganho máximo entre os dispositivos no grupo.
- Ganho padrão. Maior ganho padrão entre os dispositivos no grupo.
Pela forma como esses valores são configurados, é possível definir o ganho de um grupo de volumes fora do intervalo compatível com um dispositivo associado a esse grupo. 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 do intervalo.
Identificadores de grupo de volumes
Os grupos de volumes são identificados durante a execução na ordem definida no arquivo XML.
Os IDs variam de 0
a N-1
dentro de 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 entre as zonas. Esses identificadores são usados para APIs CarAudioManager
associadas
a grupos de volumes. Qualquer API que use um groupId
sem um zoneId
define como a zona de áudio principal.
Gerenciamento de volume de várias zonas
Cada zona de áudio precisa ter um ou mais grupos de volumes, e cada grupo
só é associado 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 ela. Essas configurações são específicas da zona, o que significa que, se um usuário fizer login em uma tela associada à zona primária e, depois, fizer login em uma zona associada a uma zona de áudio secundária, os níveis de volume carregados e mantidos na primeira zona serão diferentes dos da zona secundária.
Processar eventos de teclas de volume
O Android define vários códigos de tecla para o controle de volume, incluindo:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
Por padrão, o Android encaminha os eventos de tecla de volume para os apps. As implementações
automáticas precisam forçar esses eventos de teclas a serem processados por
CarAudioService
, que chama setGroupVolume
ou setMasterMute
, conforme
adequado. 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 a que zona
a que se destinam e são considerados associados à zona de
áudio principal. Quando um evento de tecla de volume é recebido, o CarAudioService
determina
qual grupo de volumes vai ser ajustado, buscando os contextos de áudio dos jogadores
ativos e ajustando o grupo 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
.
Esmaecer e equilibrar
As duas versões da HAL AudioControl incluem APIs para definir esmaecimento e balanceamento
no veículo. As APIs do sistema correspondentes ao CarAudioManager transmitem valores
para a HAL AudioControl. Essas APIs exigem
android.car.permission.CAR_CONTROL_AUDIO_VOLUME
. As APIs AudioControl são:
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 é totalmente restante
- Um valor fora do intervalo de -1 a 1 representa um erro
O
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 é totalmente atrás
- Um valor fora do intervalo de -1 a 1 representa um erro
Você decide como esses valores devem ser aplicados e como exibir os valores aos usuários. Eles podem ser aplicados estritamente à mídia ou em todos os aspectos a todos os sons do Android. O Android 11 também introduziu suporte à aplicação de efeitos de áudio em dispositivos de saída. Com isso, é possível gerenciar o esmaecimento e o balanceamento 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 stream reproduzido simultaneamente possa ser ouvido com mais clareza. Na AAOS, a redução de áudio é implementada pela HAL. O Android não tem controle sobre sons além do SO. No Android 11, as principais informações disponíveis para a HAL tomar decisões de redução de volume são se dois dispositivos de saída têm ou não streams ativos.
Quando se abaixar
Embora cabe ao OEM individual determinar como a redução de volume é processada pela HAL, recomendamos as diretrizes a seguir.
Vários streams reproduzidos no Android geralmente ocorrem quando dois apps ou serviços mantêm a seleção 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 do AudioFocus.
Todos os streams misturados pelo Android são feitos antes da aplicação de qualquer ganho. Dessa forma, qualquer stream que precise ser reduzido ao ser reproduzido simultaneamente com outro precisa ser roteado para dispositivos de saída separados para que a HAL possa aplicar a redução antes da mixagem.
Comportamento de redução de volume recomendado
Veja a seguir possíveis interações simultâneas recomendadas.
Interação | Ação |
---|---|
EMERGENCY
| Faz o gesto de pato ou silencia tudo, exceto SAFETY
|
SAFETY |
Pata tudo, exceto EMERGENCY |
NAVIGATION |
Faz pato de tudo, exceto SAFETY e EMERGENCY |
CALL |
Faz pato de tudo, exceto SAFETY , EMERGENCY
e NAVIGATION |
VOICE |
Patos CALL_RING |
VEHICLE_SOUNDS |
Você determina a importância do som ativo e se ele reduz ou não outros sons. |
MUSIC e ANNOUNCEMENT |
Duvido por tudo. As exceções são tons de interação de toque reproduzidos como
SYSTEM_SOUND .
|
Considerações ao reduzir o volume
Alguns apps e serviços, como navegação ou assistente, podem usar vários players para executar ações. Evite o fechamento 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 máximo antes de ser diminuída antes3 da próxima reprodução da navegação ou de um app assistente ser iniciado.
Em 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 reduzir o volume. Por exemplo, as instruções de navegação podem ser encaminhadas para os alto-falantes do encosto da cabeça do motorista enquanto continuam a tocar músicas em todo o chalé em um volume normal.
Sons críticos para a segurança
O Android 11 introduziu as
APIs de seleção de áudio HAL. A HAL garante
que os sons essenciais para a segurança sejam priorizados em relação a outros sons. Se a HAL tiver a seleção de áudio
para USAGE_EMERGENCY
, não é garantido que os apps e serviços do
Android não vão tocar sons. A HAL determina quais streams do Android precisam
ser misturados ou silenciados para tocar sons essenciais para a segurança.
Definir a interface de configurações de volume
O AAOS dissocia a interface das 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 seja necessária caso a configuração dos grupos de volumes mude.
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 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 a VolumeGroup
usando os
recursos associados a voice_communication
, já que essa é a primeira Matc
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 acessar os limites inferior e superior.getGroupVolume()
para saber o volume atual.registerVolumeChangeObserver()
para receber notificações sobre mudanças de volume.
Evento do grupo de volume de carros
Os casos de uso automotivos da atualização de volume e da alternância de som desativado têm bases contextuais que podem definir as ações de determinados apps, como as configurações de volume. O callback de volume atual e silenciamento da pilha de áudio do carro fornece informações contextuais limitadas. Para atender melhor aos casos de uso automotivos e à escalonabilidade futura, o CarVolumeGroupEvent foi adicionado ao Android 14. Cada evento contém três tipos críticos de informações:
- Lista de
CarVolumeGroupInfo
EventTypes
(bit-mapeado)- Lista de
ExtraInfos
Informações do GrupoCarVolume
O destinatário do callback do evento tem acesso pronto à lista de informações do
grupo de volumes do carro afetado. Isso significa que o app não precisa fazer
outras chamadas para o framework de áudio do carro para ter 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 volumes de
carro também são fornecidos como parte do EventTypes
, conforme explicado abaixo.
EventTypes
Define qual aspecto do CarVolumeGroupInfo
mudou. Eles 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 máximo de volume CarVolumeGroups
mudou e pode ser consultado por
CarVolumeGroupInfo.getMaxVolumeGainIndex()
.
A tabela a seguir mostra a relação entre EventType
e
CarVolumeGroupInfo
.
Tipo de evento | Informações do GrupoCarVolume |
---|---|
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.isMudo() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED | CarVolumeGroupInfo.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED | CarVolumeGroupInfo.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED | CarVolumeGroupInfo.getAudioAttributes() |
Informações extras
Fornece mais informações sobre o motivo da mudança do CarVolumeGroup
. Os apps
podem usar essas informações para dar mais contexto e alertar o usuário
para agir ou notificar. Por exemplo, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
indica uma atenuação temporária ativa devido a uma sobrecarga térmica. O app
poderá informar o usuário se ele tentar aumentar o volume.
Não aplicamos nenhum processo para ExtraInfos
. Você decide
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
esmaecer a interface da barra de volume inicialmente para evitar que o usuário mude o volume.
Outros podem optar por mostrar um aviso informando que a redução de áudio está ativa e permitir que o usuário
mude o volume.
O framework de áudio do carro depende do IAudioGainCallback
da HAL do AudioControl para
fornecer o ExtraInfos
sugerido. Para saber mais, consulte
Callback de ganho de áudio.
O CarVolumeGroupEvent
pode ser escalonado para atender às necessidades futuras do framework de áudio do carro. Pretendemos oferecer suporte a novos recursos somente por CarVolumeGroupEvent
. É
altamente recomendável que os desenvolvedores de apps usem CarVolumeGroupEvent
para processar
as mudanças de volume e silenciamento de grupos.
Callback do evento do grupo de volume do carro
O Android 14 oferece um novo callback para apps privilegiados e
de plataforma se registrarem e serem notificados sobre CarVolumeGroupEvents
.
Para se registrar para o callback, use
CarAudioManager#registerCarVolumeGroupEventCallback()
Para cancelar o registro do callback, use
CarAudioManager#unregisterCarVolumeGroupEventCallback()
Se um app for registrado com o novo CarVolumeGroupEventCallback
e o CarVolumeCallback
legado, o evento CarVolumeGroupEventCallbacks
será priorizado.
A pilha de áudio do carro não aciona mais CarVolumeCallback
. Isso evita
a duplicação de acionadores no mesmo app para o mesmo evento.
Recomendamos que você use CarVolumeGroupEventCallback
para gerenciar
o volume do grupo e silenciar as mudanças.
Callback de ganho de áudio
Desde o Android 13, a HAL AudioControl pode acionar um callback assíncrono para gerenciar atualizações no nível de volume devido a mudanças no sistema de áudio do carro.
API HAL
AIDL do AudioControl @2.0
A versão 2.0 da HAL AudioControl AIDL 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 alterações na configuração de ganho de áudio. |
O callback da HAL AudioControl 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:
- Motivos de restrição. Mudança temporária no volume e no comportamento de silenciamento.
- Motivos da atualização. Mudança permanente no comportamento do volume.
Tipos de restrição
A partir de AudioControl
HAL AIDL
V3
, estes 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 ativação do som acionado pelo usuário |
---|---|---|
Desativar som | ❌ | ❌ (silenciar) ✔ (silenciar) |
Bloqueia o conteúdo | ❌ | ✔ |
Limitação | ❌ (acima do limite) ✔ (abaixo do limite) |
✔ |
Atenuação | ✔ | ✔ |
A prioridade entre as restrições é Desativar som > Bloqueio > Limitação > Atenuação.
Silenciar restrições
Estas são as restrições:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
O framework de áudio do carro mantém internamente estes dois estados de silenciamento:
Desativar som do usuário. Alternado com base na solicitação do usuário, por meio de
CarAudioManager
ou de eventos de teclas.Desativar som do HAL. Alternado com base nas restrições de silenciamento recebidas pelo callback
AudioGain
.
Para listeners como o app Configurações, o estado geral de silenciamento
do grupo de volumes (CarVolumeGroupInfo.isMuted()
) vai ser baseado se uma das
sugestões de som acima estiver ativada.
Quando a desativação do som da HAL estiver ativada, todas as solicitações de mudança de volume de entrada e ativação do grupo serão ignoradas pelo período da restrição.
Caso de interação: o som da HAL está ativo e o usuário solicita a ativação desse recurso
Quando o silenciamento de HAL estiver ativado e o de usuário desativado:
- O estado geral de silenciamento do grupo de volumes é alterado para
true
. - As solicitações do usuário para ativar o som serão processadas.
- Motivo: as solicitações de silenciamento de usuários devem ser respeitadas em todos os momentos para preservar a privacidade dos usuários.
Quando o som da HAL e do usuário são desativados:
O estado geral de silenciamento do grupo de volumes é alterado para
true
.As solicitações do usuário para desativar o som serão
NOT
processadas. O estado de silenciamento do usuário armazenado em cache permanece ativado.Motivo: as solicitações de ativação de som do usuário só serão atendidas se não houver restrições ativas.
Motivo: desativar o som do usuário em cache pode causar explosão de som não intencional e colocar a segurança do usuário em risco. Isso é especialmente verdadeiro se o estado silenciado estiver ativado em ciclos de ignição, o que diminui a percepção dos usuários sobre a percepção do nível de som.
Caso de interação: o som do HAL ativado e desativado enquanto o silenciamento do usuário não tem mudanças
Ativar o som da HAL muda o estado geral do som do grupo de volumes. No entanto, ela não atualiza diretamente o estado de silenciamento do usuário. Quando o som do usuário é desativado e o callback para ativar o som da HAL é recebido:
- O estado geral de silenciamento do grupo de volumes é alterado para
true
. As solicitações do usuário para mudar o volume serão
NOT
processadas enquanto o som da HAL estiver ativado.Motivo: o usuário não consegue perceber sons enquanto o mudo está ativado. Permitir a mudança de volume pode resultar em uma explosão sonora e colocar em risco a segurança do usuário.
Motivo: apps de volume podem se registrar para callbacks e acionar um som (CarAudioManager.setVolumeGroup mute(...,/* mute=*/ true,..)) automaticamente sem intervenção do usuário, se esse for o comportamento esperado pelo OEM.
Quando o som do HAL estiver desativado e o do usuário estiver desativado:
O estado silenciado do grupo de volumes é alterado para
false
.Motivo: tornar o estado de som desativado e solicitar que o usuário o ative novamente pode interromper desnecessariamente o usuário quando esse estado alterna com frequência.
As solicitações de 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 é processado.
- A ativação do som foi processada.
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 volume:
- Dentro da limitação são processados
- A limitação acima não é processada
A ativação do som foi processada.
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 como o volume atenuado (em vez do volume anterior). Futuras alterações de volume são feitas nesse nível.
A ativação do som foi processada.
Atualizar para o índice
O seguinte é considerado a atualização do índice de volume assíncrona:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Por isso, a HAL AudioControl pode atualizar o índice atual do grupo de volumes
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 do volume para 30
O usuário usa o app Volume para mudar o índice do volume para 30.
Esse índice é convertido em ganho de volume e enviado para a HAL de áudio.
As implementações do fornecedor de
Audio HAL
recebem o novo ganho de volume e atualizam o sistema de áudio (como o 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 do fornecedor de acionadores
AudioControl HAL
:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
O serviço de áudio para carros 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 depois de sair da suspensão
O índice de volume antes da suspensão é definido como um nível alto de 95 (intervalo: [0 a 99]).
O Android entra em suspensão.
Depois que o Android for suspenso (por exemplo, retomar):
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 dos 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 de volume dinâmico
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 SW do Android.
Os fabricantes de automóveis podem precisar atualizar a configuração de volume durante um cronograma de serviços.
Configuração do ambiente de execução. Os sistemas de áudio automotivos oferecem suporte a configurações de amplificadores externos, e essas ECUs podem hospedar as configurações de intervalo de volume que são consultadas durante o tempo de inicialização.
Configuração sob demanda. Oferecer suporte à crescente necessidade de recursos de áudio com base na 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 pela 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 no intervalo de volume usando um mecanismo de IPC personalizado do fornecedor.
Depois de descoberto, um callback é gerado usando
AudioControl::IModuleChangeCallback
.Atualizar. A pilha de áudio do carro atualiza os estados do grupo de volume com os novos intervalos de volume.
Fazemos esforços 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 informado pelo fornecedor durante o callback.
Callback.
Após as atualizações do intervalo do grupo de volumes, a pilha de áudio do carro aciona um callback para os apps registrados pelo
CarVolumeGroupEventCallback
.CarVolumeGroupEvent
carrega oCarVolumeGroupInfo
atualizado, o tipo de evento (o que mudou) e o Extra-info (por que ele mudou).
Figura 1. Configuração de volume dinâmico.
API HAL
AudioControl com AIDL da versão 3.0
A versão 3.0 da HAL AudioControl AIDL introduz as seguintes APIs:
API | |
---|---|
IAudioControl#setModuleChangeCallback | Define uma instância de IModuleChangeCallback com a HAL de AudioControl. |
IAudioControl#clearModuleChangeCallback | Limpa a instância do IModuleChangeCallback definido anteriormente com a HAL AudioControl. |
IModuleChangeCallback#onAudioPortsChanged | Chamada de retorno para notificar alterações no AudioPorts |
Sequência
Confira abaixo o diagrama de sequência da configuração de volume dinâmico.
Figura 2. Diagrama de sequência para configuração de volume dinâmico.
Principais aspectos
Para otimizar esse recurso, considere o seguinte.
Os AudioPorts fornecidos como parte do callback precisam corresponder à definição do Automotive BUS:
- Porta do dispositivo.
IN_DEVICE
,OUT_DEVICE
- Conexão.
BUS
- Endereço. Definida na definição da HAL de áudio
- Modo de ganho.
JOINT
- Porta do dispositivo.
Os fornecedores precisam definir um superconjunto de definições de intervalo de volume na política da HAL de áudio e usar o callback para personalizá-lo para 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 volumes, cada um precisa ter definições de intervalo de volume idênticas. Se isso não for feito, o framework de áudio do carro vai rejeitar a nova definição de intervalo de volume.