O recurso de roteamento combinado de dispositivo de áudio adiciona suporte a streaming de áudio para vários dispositivos de áudio simultaneamente. Com esse recurso, os apps privilegiados podem selecionar vários dispositivos preferidos para uma estratégia específica usando APIs do sistema. Os apps podem descobrir recursos de dispositivos de áudio com mais precisão usando as APIs públicas fornecidas por esse recurso. Nas versões 11 e anteriores do Android, a implementação do framework de áudio tem suporte limitado para vários dispositivos de áudio do mesmo tipo (por exemplo, dois fones de ouvido Bluetooth A2DP) conectados simultaneamente. As regras de roteamento de áudio padrão também não permitem que os usuários selecionem vários dispositivos do mesmo tipo para um determinado caso de uso.
A partir do Android 12, essas limitações foram removidas para permitir novos casos de uso, como transmissão de áudio, multicast para um grupo de fones de ouvido de áudio BLE ou seleção de várias placas de som USB simultaneamente. Não é possível encaminhar para vários dispositivos USB ao mesmo tempo.
A partir do Android 14, o framework USB oferece suporte ao roteamento para vários dispositivos USB, desde que sejam de tipos de áudio diferentes e haja suporte do kernel e do fornecedor para conectar vários dispositivos USB simultaneamente.
Esta página aborda como implementar o suporte a streaming de áudio para vários dispositivos de áudio e como validar a implementação do recurso.
Oferecer suporte a streaming de áudio para vários dispositivos de áudio
Há dois conjuntos de APIs no Android 12 que oferecem suporte a esse recurso:
- As APIs do sistema processam vários dispositivos preferidos para uma estratégia.
- A interface HIDL, implementada pelo fornecedor como parte do HAL de áudio, informa os recursos do dispositivo.
As seções a seguir discutem cada uma dessas APIs com mais detalhes.
Processar vários dispositivos preferidos para uma estratégia
O gerenciador de políticas de áudio oferece APIs do sistema para oferecer melhor suporte ao streaming de áudio para vários dispositivos de áudio simultaneamente. Essas APIs do sistema permitem definir, receber e remover vários dispositivos preferidos para uma determinada estratégia. Até o Android 12, esse recurso era compatível apenas com um único dispositivo.
O gerenciador de políticas de áudio apresenta o conceito de dispositivos de mídia ativos para descrever os dispositivos que têm mais chances de serem escolhidos para a reprodução de mídia. Quando um dispositivo destacável é conectado, os streams de saída HAL de áudio que podem ser encaminhados para esse dispositivo podem precisar ser abertos e testados para verificar os atributos compatíveis.
Um dispositivo de áudio precisa ser especificado ao abrir um stream de saída. O dispositivo de mídia ativo é o dispositivo usado quando os streams de saída são abertos nesse contexto.
A seleção de dispositivos de mídia ativa pode mudar dependendo dos dispositivos conectados ou desconectados. O Gerenciador de políticas de áudio usa a seguinte série de regras para escolher dispositivos de mídia ativos:
- Se todos os dispositivos preferidos para mídia estiverem disponíveis, eles serão escolhidos como ativos.
- Caso contrário, o último dispositivo removível conectado é escolhido.
- Se não houver dispositivos removíveis conectados, as regras padrão da política de áudio para escolher dispositivos de saída serão aplicadas para escolher dispositivos ativos.
Um stream de saída precisa atender aos seguintes critérios para ser reaberto e roteado para os dispositivos ativos, de modo que a melhor configuração seja escolhida para a reprodução:
- O stream de saída precisa oferecer suporte aos dispositivos ativos.
- O stream de saída precisa oferecer suporte a perfis dinâmicos.
- O stream de saída não pode ser roteado para dispositivos ativos no momento.
Para aplicar uma nova seleção de dispositivo, o Audio Policy Manager fecha e reabre um stream de saída após a conexão do dispositivo se o stream de saída estiver inativo ou adiar para quando o stream de saída for colocado em modo de espera.
O gerenciador de políticas de áudio oferece a lista de APIs do sistema a seguir(conforme definido em
AudioManager.java
):
setPreferredDeviceForStrategy
Define o dispositivo preferido para o roteamento de áudio de uma determinada estratégia. O dispositivo pode não estar disponível no momento em que o dispositivo preferencial é definido, mas será usado quando estiver disponível.
removePreferredDeviceForStrategy
Remove os dispositivos de áudio preferidos definidos anteriormente com
setPreferredDeviceForStrategy
ousetPreferredDevicesForStrategy
.getPreferredDeviceForStrategy
Retorna o dispositivo preferencial para uma estratégia de áudio definida anteriormente com
setPreferredDeviceForStrategy
ousetPreferredDevicesForStrategy
.setPreferredDevicesForStrategy
Define os dispositivos preferidos para uma determinada estratégia.
getPreferredDevicesForStrategy
Retorna os dispositivos preferidos para uma estratégia de áudio definida anteriormente com
setPreferredDeviceForStrategy
ousetPreferredDevicesForStrategy
.OnPreferredDevicesForStrategyChangedListener
Define uma interface para notificação de mudanças nos dispositivos de áudio preferidos que são definidos para uma determinada estratégia de áudio.
addOnPreferredDevicesForStrategyChangedListener
Adiciona um listener para receber notificações sobre mudanças no dispositivo de áudio preferencial da estratégia.
removeOnPreferredDevicesForStrategyChangedListener
Remove um listener adicionado anteriormente de mudanças no dispositivo de áudio preferencial da estratégia.
Relatar recursos do dispositivo
Como parte da implementação da HAL de áudio, os fornecedores implementam as APIs que oferecem suporte ao envio de relatórios de recursos do dispositivo. Esta seção explica os tipos e métodos de dados usados para informar os recursos do dispositivo e lista algumas mudanças feitas no HAL V7 de áudio HIDL para oferecer suporte a vários dispositivos.
Tipos de dados
No HAL de áudio HIDL V7, os recursos do dispositivo são informados usando as estruturas AudioProfile
e AudioTransport
. A estrutura AudioTransport
descreve a
capacidade de uma porta de áudio com AudioProfile
para formatos de áudio conhecidos ou com
descritores de hardware brutos para formatos que não são conhecidos pela plataforma. A
estrutura AudioProfile
contém o formato de áudio, as taxas de amostragem aceitas
pelo perfil e a lista de máscaras de canal, conforme mostrado no bloco de código
a seguir de types.hal
:
/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
AudioFormat format;
/** List of the sample rates (in Hz) supported by the profile. */
vec<uint32_t> sampleRates;
/** List of channel masks supported by the profile. */
vec<AudioChannelMask> channelMasks;
};
No HAL V7 do audio HIDL, o tipo de dados AudioPort
é definido com as
estruturas AudioTransport
e AudioProfile
para descrever os recursos
do dispositivo.
Métodos da HAL de áudio
O gerenciador de políticas de áudio usa os seguintes métodos para consultar os recursos do dispositivo:
getParameters:
Um método genérico para extrair valores de parâmetro específicos do fornecedor, como formatos de áudio compatíveis e as respectivas taxas de amostragem.getAudioPort:
Retorna a lista de atributos aceitos (como taxas de amostragem, formatos, máscaras de canal, controladores de ganho) para uma porta de áudio específica.
O código a seguir de IDevice.hal
mostra a interface do método getAudioPort
:
/**
* Returns the list of supported attributes for a given audio port.
*
* As input, 'port' contains the information (type, role, address etc...)
* needed by the HAL to identify the port.
*
* As output, 'resultPort' contains possible attributes (sampling rates,
* formats, channel masks, gain controllers...) for this port.
*
* @param port port identifier.
* @return retval operation completion status.
* @return resultPort port descriptor with all parameters filled up.
*/
getAudioPort(AudioPort port)
generates (Result retval, AudioPort resultPort);
Mudanças na API legada
Para oferecer suporte a vários perfis de áudio, a versão 3.2 da API legada adiciona uma nova
estrutura chamada audio_port_v7
. Consulte o código-fonte
para mais detalhes.
Devido à adição de audio_port_v7
, a versão 3.2 da API legada adiciona uma
nova API chamada get_audio_port_v7
para consultar os recursos dos dispositivos usando a
estrutura audio_port_v7
.
O código a seguir de audio.h
mostra a definição da API get_audio_port_v7
:
/**
* Fills the list of supported attributes for a given audio port.
* As input, "port" contains the information (type, role, address etc...)
* needed by the HAL to identify the port.
* As output, "port" contains possible attributes (sampling rates,
* formats, channel masks, gain controllers...) for this port. The
* possible attributes are saved as audio profiles, which contains audio
* format and the supported sampling rates and channel masks.
*/
int (*get_audio_port_v7)(struct audio_hw_device *dev,
struct audio_port_v7 *port);
Os dados da API get_audio_port
legada precisam ser preenchidos no novo
formato AudioPort
quando a versão da API legada for inferior a 3.2 e a versão do HAL do HIDL
for 7 ou mais recente. Nesse caso, todas as taxas de amostra e máscaras de canal
informadas de get_audio_port
são consideradas compatíveis com todos os formatos
retornados, permitindo um mapeamento simples dos valores de get_audio_port
para a
nova estrutura AudioPort
.
Exemplos de implementações de API
Esta seção descreve várias séries de testes com métodos que usam as APIs abordadas nas seções anteriores. Consulte estes métodos para conferir alguns exemplos de como essas APIs são implementadas e usadas.
Um exemplo de uso das APIs do sistema setPreferredDevicesForStrategy
,
getPreferredDevicesForStrategy
, removePreferredDeviceForStrategy
e
OnPreferredDevicesForStrategyChangedListener
está no
método PreferredDeviceRoutingTest
, localizado no GTS.
Para conferir um exemplo da nova estrutura em AudioDeviceInfo
em uso, consulte o
método AudioManagerTest#testGetDevices
, localizado no CTS.
Um exemplo da implementação de get_audio_port_v7
está localizado em
audio_hal.c
e mostra como os recursos são consultados para vários dispositivos.
Validação
Esta seção fornece informações sobre a validação do CTS e do GTS (Google Mobile Services Test Suite) do Gerenciador de áudio.
Testes CTS
Os testes do CTS estão localizados em android.media.cts.AudioManagerTest
.
Confira a seguir a lista de testes disponíveis do Gerenciador de áudio:
AudioManagerTest#testGetDevices
Verifica os recursos exatos do dispositivo de áudio. Ele também verifica se os perfis de áudio retornados na estrutura
AudioDeviceInfo
preservam o conteúdo do formato de matriz antiga e simplificada, mas estão no novo formatoAudioProfile
.AudioManagerTest#testPreferredDevicesForStrategy
eAudioManagerTest#testPreferredDeviceForCapturePreset
Verifique se os dispositivos preferidos para estratégia e captura de testes de API predefinidos relacionados são concluídos.
Testes GTS
Os testes GTS estão localizados em com.google.android.gts.audioservice.AudioServiceHostTest
.
Para validar se as APIs de dispositivos preferidos para estratégia e captura de predefinição
funcionam corretamente, execute os testes AudioServiceHostTest#testPreferredDeviceRouting
e AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset
.