Nova arquitetura do SCO gerenciado por áudio

Nesta página, descrevemos como ativar o framework de áudio e a HAL de áudio (AHAL) para gerenciar conexões síncronas orientadas à conexão (SCO, na sigla em inglês), um processo identificado como SCO gerenciado por áudio (AMSCO).

No Android 17 e mais recentes, o framework de áudio do Android usa o recurso de gerenciamento de SCO para gerenciar o roteamento de SCO, que era originalmente processado pelo framework Bluetooth (BT). Essa migração move o status da conexão SCO de um estado pertencente ao framework BT para uma consequência downstream da atividade de streaming de áudio.

Ao centralizar a propriedade do roteamento de áudio no framework de áudio, esse recurso alinha a implementação da camada de abstração de hardware de áudio (HAL) para SCO com outros perfis de BT, como o Advanced Audio Distribution Profile (A2DP) e o LE Audio. Essa refatoração simplifica a interação entre as pilhas de telecomunicações e BT, permitindo uma arquitetura de roteamento de áudio mais robusta e centralizada.

Visão geral da arquitetura

A arquitetura AMSCO centraliza o gerenciamento de conexões SCO no framework de áudio do Android, que baseia as decisões de roteamento na atividade de streaming de áudio. Essa arquitetura contrasta com o modelo anterior, em que a pilha de BT gerenciava as conexões. As funções de cada componente nessa arquitetura são as seguintes:

A AHAL inicia e suspende a sessão SCO somente se as seguintes condições forem atendidas:

  • Um stream ativo é corrigido para um dispositivo SCO.
  • O modo áudio está definido e existe um patch para um dispositivo SCO.

O framework de áudio impede que um dispositivo A2DP tenha um patch simultâneo quando esses critérios específicos são atendidos. O framework de áudio não envia mais mudanças de estado de SCO nem suspensões de A2DP para a AHAL.

O framework de áudio processa o gerenciamento de SCO, então a pilha de BT não chama mais o áudio de conexão ou desconexão. Em casos de desconexão ou erro de SCO preventivo, a pilha de BT informa o framework de áudio com AudioManager#onHfpAudioDisconnected.

Plano

Use as informações nesta seção para avaliar os seguintes requisitos de compatibilidade e arquitetura antes de implementar a refatoração do gerenciamento de SCO.

Compatibilidade com versões anteriores

Para permitir que o framework continue oferecendo suporte a dispositivos que podem receber atualizações do SO sem atualizar as AHALs ou AHALs de BT, use uma propriedade do sistema para indicar que o novo gerenciamento de SCO precisa ser ativado. O caminho legado é preservado por até seis anos nos casos em que a propriedade do sistema está desativada ou a versão da HAL está desatualizada.

Configurar a sessão HFP

A AHAL precisa usar o novo tipo de sessão de perfil mãos-livres (HFP) para iniciar ou suspender a reprodução, semelhante a outros tipos de sessão de BT. O estado do stream é gerenciado usando diferentes IBluetoothAudioProviders, que são enumerados e criados por uma classe Factory, dependendo dos caminhos disponíveis.

A pilha de BT usa um caminho de descarga de hardware sempre que possível. A preferência por codecs durante a negociação segue esta ordem: o hardware LC3 é preferível ao software LC3, seguido pelo hardware mSBC, depois o software mSBC e, por fim, o hardware CVSD é preferível ao software CVSD.

Os diagramas de sequência a seguir detalham as interações entre a AHAL e a pilha de BT necessárias para estabelecer o estado do stream.

Procedimento de descarga de hardware

A Figura 1 ilustra como a AHAL e a pilha de BT se coordenam para estabelecer um caminho de dados de hardware direto para o áudio SCO:

hw-offload-procedure

Figura 1. Procedimento de descarga de hardware.

Procedimento de caminho de dados de software

A Figura 2 ilustra o processo de tratamento de dados de áudio que exigem o processamento de software do sistema:

sw-data-path

Figura 2. Procedimento de caminho de dados de software.

Procedimento de renegociação de codec

Quando o gateway de áudio (AG) recebe um novo comando de codec disponível de BT (AT+BAC), o AG reinicia o procedimento de negociação de codec. A Figura 3 ilustra o procedimento de renegociação de codec:

codec-renego-process

Figura 3. Procedimento de renegociação de codec.

Impacto no HeadsetStateMachine

A máquina de estado do headset da camada Java (representada pela classe HeadsetStateMachine) permanece praticamente inalterada, com exceção do estado AUDIO_CONNECTED, que é controlado por eventos de pilha nativa. Na camada Java, o sistema não inicia mais connectAudioNative ou disconnectAudioNative. Em vez disso, o sistema responde a mudanças de estado de conexão de áudio da pilha nativa. Essas mudanças são acionadas pelos comandos da AHAL em IBluetoothAudioProvider ou IBluetoothAudioPort.

Implementação

Para integrar a refatoração do gerenciamento de SCO, atualize a comunicação entre a pilha de BT e o framework de áudio.

Siga estas etapas para implementar o recurso:

  1. Notifique o framework de áudio sobre mudanças no BT ativo para ajudar no gerenciamento adequado da iniciação e da desmontagem do SCO durante as conexões de dispositivos HFP e para processar mudanças de dispositivos ativos. Use AudioManager.handleBluetoothActiveDeviceChanged(HfpInfo) para fornecer essas informações ao framework de áudio.

    conn-hfp

    Figura 4. Conectar dispositivo HFP.

    O framework de áudio usa o callback AudioManagerAudioDeviceCallback#onAudioDevicesAdded em vez de transmissões legadas para indicar o estado do dispositivo de áudio.

  2. Implemente o controle de stream AHAL usando setCommunicationDevice(AudioDeviceInfodevice) como o ponto de controle principal para iniciar a conexão SCO.

    Se HfpTransport::StartRequest retornar BluetoothAudioCtrlAck::PENDING, a AHAL precisará tentar novamente a solicitação porque a máquina de estado HFP não está estabelecida.

Casos de uso

As seções a seguir descrevem as jornadas ideais do usuário (CUJs) típicas.

Fluxo de chamadas de telecomunicações

A refatoração do gerenciamento de SCO muda phoneStateChanged para uma função de bloqueio. Essa modificação faz com que a telecomunicações aguarde a execução de phoneStateChanged no método BluetoothInCallService.onCallAdded para ser concluída antes de invocar a API do framework de áudio para iniciar a criação de SCO.

call-telecom

Figura 5. Atender ou iniciar uma chamada por telecomunicações.

Fluxo de chamadas VOIP

O framework de áudio inicia o processo chamando o método BluetoothHeadset.startScoUsingVirtualVoiceCall. Depois que a pilha de BT fornece um resultado ao framework de áudio, o framework direciona a AHAL para executar startStream. A figura a seguir ilustra esse fluxo:

call-voip

Figura 6. Atender ou iniciar uma chamada por VOIP.

Reconhecimento de voz

Para o reconhecimento de voz iniciado por mãos-livres (HF) e AG, a pilha de BT precisa solicitar que o framework de áudio abra o SCO usando AudioManager.setCommunicationDevice. Isso é ilustrado na figura a seguir:

voice-recog

Figura 7. Iniciação de SCO de reconhecimento de voz.

Conexão de áudio

A pilha de BT inicia uma conexão SCO solicitando o framework de áudio com AudioManager.setCommunicationDevice(AudioDeviceInfo) durante o reconhecimento de voz. Se uma chamada estiver ativa, a pilha de BT solicitará BluetoothInCallService#requestBluetoothAudio da pilha de telecomunicações.

Esse processo é mostrado na figura a seguir:

audio-conn

Figura 8. Conexão de áudio.

Validação e teste

Para validar se o recurso está integrado corretamente e atende aos padrões de qualidade, os fabricantes de dispositivos precisam executar os seguintes testes:

  • CTS Verifier: use o CTS Verifier para testes interativos de roteamento de áudio durante chamadas.
  • Pacote de testes de fornecedor (VTS): valide as interações AHAL e BT AHAL usando o VTS.

Requisitos

Esse recurso está sujeito aos seguintes requisitos:

  • AHAL: a implementação exige uma AHAL compatível que ofereça suporte ao caminho de gerenciamento de SCO refatorado.