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:
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 noactivationVolumeConfigEntry
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.
Comportamento recomendado para abaixar a cabeça
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()
egetGroupMaxVolume()
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 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
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:
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.
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.
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 oCarVolumeGroupInfo
atualizado, o tipo de evento (o que mudou) e as informações extras (por que mudou).
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.
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
- Porta do dispositivo.
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.