Gerenciamento de volume

O gerenciamento de volume está em CarAudioService, que usa volumes fixos com a expectativa de que os volumes sejam aplicados abaixo da HAL por um 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 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 for definida como false), Os apps podem chamar AudioManager.setStreamVolume() para mudar o volume por stream no mixer de software. Isso nem sempre é desejável devido a possíveis em outros aplicativos e ao fato de que a atenuação do volume no mixer de software pode resultar em menos bits significativos disponíveis no sinal quando recebido do amplificador de hardware.

Grupos de volumes

Os grupos gerenciam os volumes de uma coleção de dispositivos em um áudio zona. Para cada grupo de volumes, o volume pode ser controlado de forma independente. A Os ganhos resultantes são configurados nos dispositivos associados para serem aplicados amplificador do veículo. As configurações de volume são mantidas para o usuário e carregadas quando o usuário fizer 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 IP internos. Os endereços devem 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 da taxa de aprendizado com base nos valores configurados em audio_policy_configuration.xml para o de 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 do conjunto e configura o grupo da seguinte forma:

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

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

Identificadores do 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 volumes nessa zona. Dessa forma, os IDs dos grupos de volumes não são exclusivos entre zonas. Esses identificadores são usados para APIs CarAudioManager associadas. com grupos de volumes. Qualquer API que use um groupId sem um zoneId o padrão é 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 volume é associado a apenas 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 nessa zona. Essas configurações são específicas da zona, ou seja, se um usuário fizer login em um tela associada à zona principal e, depois, aos sinais em uma zona associadas a uma zona de áudio secundária, os níveis de volume carregados e mantidos por da primeira zona são diferentes das 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. Automóveis as implementações precisam forçar o processamento desses eventos CarAudioService, que então chama setGroupVolume ou setMasterMute, conforme apropriados. Para forçar esse comportamento, defina o Sinalização config_handleVolumeKeysInWindowManager para true:

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

No momento, os eventos de tecla de volume não têm como distinguir qual zona a que se destinam e são considerados associados à faixa de áudio. Quando um evento de tecla de volume é recebido, o CarAudioService determina qual grupo de volume será ajustado, buscando os contextos de áudio dos e ajustar o grupo de volumes que contém o dispositivo de saída associados 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

Ambas as versões da HAL AudioControl incluem APIs para definir esmaecimento e equilíbrio no veículo. APIs do sistema correspondentes para os valores passados do CarAudioManager à 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 na direção da 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
  • setFadeTowardFront(float value) muda o volume do alto-falante na direção da da frente (+) ou de 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 para usuários. Elas podem ser aplicadas estritamente à mídia ou em toda a empresa, Sons do Android. O Android 11 também introduziu suporte para aplicar efeitos de áudio a dispositivos de saída. Com isso, é possível como alternativa, gerencie o esmaecimento e o equilíbrio com efeitos de áudio no dispositivos de saída, e não por essas APIs.

Redução de áudio

A redução de áudio ocorre quando o veículo reduz o ganho de um stream para que outra transmissão simultânea pode ser ouvida com mais clareza. No AAOS, a redução de áudio é implementada pela HAL. O Android não tem controle sobre sons fora do SO. No Android 11, as principais informações para a HAL tomar decisões de redução de volume é se duas saídas têm streams ativos.

Quando se abaixar

Embora cabe ao OEM individual determinar como a redução de volume é processada pelo HAL, recomendamos as seguintes diretrizes.

  • Muitas vezes, vários streamings no Android ocorrem quando dois apps ou serviços manter a seleção de áudio pressionada simultaneamente. Para saber quando o Android pode conceder acesso 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 vai depender do seu Gerenciamento do AudioFocus.

  • Todos os streams misturados pelo Android são feitos antes que qualquer ganho seja aplicada. Dessa forma, todas as transmissões que precisam ser reduzidas ao serem reproduzidas simultaneamente e outra precisam ser roteadas para dispositivos de saída separados, de modo que a HAL possa aplicar a redução de volume antes de mesclá-los.

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 patos tudo, exceto SAFETY, EMERGENCY e e NAVIGATION
VOICE Patos CALL_RING
VEHICLE_SOUNDS Você determina a importância do som ativo e se ele patos outros sons.
MUSIC e ANNOUNCEMENT Duvido por tudo. Exceções são tons de interação de toque tocados SYSTEM_SOUND:

Considerações ao reduzir o volume

Alguns apps e serviços, como navegação ou assistente, podem usar várias para realizar 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 volte ao tamanho original. volume antes de ser reduzido antes3 da próxima reprodução da navegação ou Assistente será iniciado.

Em veículos com vários estágios de som com isolamento bom o suficiente, você pode: encaminhar o áudio para diferentes áreas do carro em vez de reduzir o volume. Por exemplo: as instruções de navegação podem ser encaminhadas aos alto-falantes do encosto de cabeça do motorista enquanto continuar a tocar música em todo o chalé em volume normal.

Sons críticos para a segurança

Lançamento do Android 11 APIs de foco de áudio HAL. A HAL garante sons críticos para a segurança são priorizados em relação a outros sons. Se a HAL reter áudio foco para USAGE_EMERGENCY, não podemos garantir que os apps e serviços do O Android não toca sons. A HAL determina quais streams do Android precisam ser misturados ou silenciados para reproduzir sons críticos;

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. Elas podem ser sobrepostas conforme descrito nas Configurar ganhos do grupo de volumes. Essa separação garante para 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 definido como AudioAttributes.USAGE. 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 que um VolumeGroup inclua voice_communication e voice_communication_signalling. O padrão A implementação da interface de configurações do carro renderiza o VolumeGroup usando o recursos associados a voice_communication, porque 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() e getGroupMaxVolume() 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 têm contexto que podem definir as ações de determinados aplicativos, como o volume configurações. 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 escalonabilidade, 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 à lista de carros afetados informações do grupo de volumes. Isso significa que o app não precisa fazer chamadas extras para o framework de áudio do carro para conferir o estado mais recente. Ela pode basta usar o CarVolumeGroupInfos recebido para atualizar a IU ou as instâncias estados. Para facilitar para os apps, os aspectos que mudaram em um volume de carro também são fornecidos como parte de EventTypes, conforme explicado abaixo.

EventTypes

Define qual aspecto do 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 O índice de ganho máximo de volume de CarVolumeGroups mudou e pode ser consultado pelo 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. Aplicativos pode usar essas informações para dar mais contexto e alertar o usuário 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 pode informar o usuário se ele tentar aumentar o volume.

Não aplicamos nenhum processo para ExtraInfos. A decisão é sua. para determinar o processo com base em ExtraInfos. Por exemplo, se a atenuação está ativo devido a EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED, você também pode 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 volume está ativa e permitir que o usuário para ajustar o volume.

O framework de áudio do carro depende do IAudioGainCallback da HAL AudioControl para forneça 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. Qa pretendem oferecer suporte a novos recursos somente por meio de CarVolumeGroupEvent. Qa é altamente recomendável que os desenvolvedores de apps usem CarVolumeGroupEvent para lidar agrupar as mudanças de volume e desativar o som.

Callback do evento do grupo de volume do carro

O Android 14 oferece um novo callback para usuários com privilégios para se registrar e receber notificações sobre CarVolumeGroupEvents.

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

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

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

Recomendamos que você use CarVolumeGroupEventCallback para gerenciar agrupar as mudanças de volume e desativar o som.

Callback de ganho de áudio

Desde o Android 13, a HAL AudioControl pode acionar uma callback assíncrono para gerenciar atualizações no nível do volume devido a alterações 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 os respectivos AudioGainConfigInfo, que consiste em:

  • ID da zona
  • Endereço da porta do dispositivo
  • Índice de volume > 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

Desde AudioControl HAL AIDL V3, os seguintes tipos de formatos compatíveis restrições:

  • 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, seja pelo CarAudioManager ou eventos principais.

  • Desativar som do HAL. Alternado com base nas restrições de silenciamento recebidas por AudioGain o retorno de chamada.

Para ouvintes, como o app Configurações, o som geral do grupo de volumes (CarVolumeGroupInfo.isMuted()) vai ser baseado se algum dos que as desativações de som acima estejam ativadas.

Quando o som do HAL estiver ativado, todos os volumes de entrada serão alterados e o som do grupo será ativado solicitações são ignoradas pela duração 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. Usuário armazenado em cache o estado mudo 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: ativar o som do usuário em cache pode causar explosão de som não intencional e colocar em risco a segurança do usuário. Isso é especialmente verdadeiro se o estado mudo estiver ativado nos ciclos de ignição, diminuindo o tempo consciência do nível de som e a percepção deles.

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 atualizam diretamente o estado de mudo do usuário. Quando o som do usuário está desativado e o som da HAL é desativado para ser ativado é 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 for desativado está ativado.

    • Motivo: o usuário não consegue perceber sons enquanto o mudo está ativado. Permitindo a mudança de volume pode resultar em uma explosão sonora e em risco para a segurança do usuário.

    • Motivo: apps de volume podem se registrar para callbacks e acionar o som (CarAudioManager.setVolumeGroup mute(...,/* mute=*/ true,..)) automaticamente sem a 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 mudo fixo e solicitar ao usuário para ativá-lo pode interromper desnecessariamente o usuário quando os estados de mudo alternar frequentemente.

  • 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 está definido como volume atenuado (em vez do volume anterior). Futuras mudanças de volume são feitas desse 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 ao í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 se comunica com 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 e atualização de volume pelo sistema de áudio (como 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 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 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 seus próprios callbacks para o aplicativo 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:

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

    • Fabricantes de automóveis preferem atualizar as configurações de volume na EOL com base no veículo configuração do sistema de áudio. Normalmente, isso é um sideload sem atualizar o Imagem do software do Android.

    • Os fabricantes de automóveis podem precisar atualizar a configuração de volume durante uma o cronograma de serviço.

  2. Configuração do ambiente de execução. Suporte a sistemas de áudio automotivos as configurações do amplificador e essas ECUs podem hospedar o intervalo de volume configurações que são consultadas durante a inicialização.

  3. Configuração sob demanda. para atender à crescente necessidade de recursos de áudio com base na demanda em que os usuários assinam sinal aprimorado por um período. As novas configurações de intervalo de volume são válidos pela duração da assinatura.

Design

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

  • Descoberta. A implementação da HAL AudioControl descobre um novo volume atualizações de intervalo de tempo através de um mecanismo de IPC personalizado de propriedade do fornecedor.

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

  • Atualizar. A pilha de áudio do carro atualiza os estados do grupo de volumes com as novas em intervalos de volume diferentes.

    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 fornecido 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 apps registrados pelo CarVolumeGroupEventCallback.

    • CarVolumeGroupEvent carrega o tipo de evento CarVolumeGroupInfo atualizado (o que mudou) e Informações extras (por que a mudança aconteceu).

imagem

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

imagem

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 às Definição de 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
  • Os fornecedores precisam definir um superconjunto de definições de intervalo de volume no arquivo de áudio Política da HAL e use o callback para personalizá-la para variantes de veículos. Consulte a IModuleChangeCallbac para mais informações.

  • Quando mais de um BUS de áudio pertence ao mesmo grupo de volumes, cada um deles precisa têm definições de intervalo de volume idênticas. Se isso não for feito, o carro vai ser aberto de áudio que rejeita a nova definição de intervalo de volume.