Roteamento combinado para dispositivos de áudio

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 com as APIs do sistema. Os apps podem descobrir mais recursos de dispositivos de áudio precisamente usando as APIs públicas fornecidas por esse recurso. Para as 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, 2 Fones de ouvido Bluetooth A2DP) conectados simultaneamente. O roteamento de áudio padrão também não permitem que os usuários selecionem vários dispositivos do mesmo tipo para um em 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 com áudio BLE ou ao selecionar várias placas de som USB ao mesmo tempo. Não é possível fazer o roteamento para vários dispositivos USB simultaneamente.

No Android 14 e versões mais recentes, o framework USB oferece suporte roteamento para vários dispositivos USB, desde que os dispositivos USB tenham áudios diferentes dispositivos diferentes e há suporte ao kernel e ao fornecedor para conectar vários dispositivos ao mesmo tempo.

Esta página mostra como implementar a compatibilidade com streaming de áudio para vários dispositivos de áudio e como validar sua implementação sobre esse recurso.

Suporte para streaming de áudio em vários dispositivos

Há dois conjuntos de APIs no Android 12 com suporte a esse recurso:

  • As APIs do sistema lidam com vários dispositivos preferidos para uma estratégia.
  • A interface HIDL, implementada pelo fornecedor como parte da HAL de áudio, informa os recursos do dispositivo.

As seções a seguir discutem cada uma dessas APIs em mais detalhes.

Lidar com vários dispositivos preferidos para uma estratégia

O Gerenciador de políticas de áudio oferece APIs do sistema para melhorar o suporte ao streaming de áudio para vários dispositivos de áudio ao mesmo tempo. Essas APIs do sistema permitem configurar, receber e remover vários dispositivos preferidos para uma determinada estratégia. Até o Android 12, esse recurso só podia ser usado em um único dispositivo.

O Gerenciador de políticas de áudio introduz o conceito de dispositivos de mídia ativos para descrevem os dispositivos que provavelmente serão escolhidos para reprodução de mídia. Quando quando um dispositivo removível estiver conectado, os streams de saída da HAL de áudio Pode ser necessário abrir e verificar os atributos compatíveis com o encaminhamento para este dispositivo.

É necessário especificar um dispositivo de áudio ao abrir um stream de saída. A fase dispositivo de mídia é o dispositivo usado quando os streams de saída são abertos nesse contexto.

A seleção ativa de dispositivos de mídia pode mudar dependendo dos dispositivos reais conectado ou desconectado. O Gerenciador de políticas de áudio usa as seguintes séries de regras para escolher os dispositivos de mídia ativos:

  1. Se todos os dispositivos preferidos de mídia estiverem disponíveis, todos eles serão escolhidos como dispositivos ativos.
  2. Caso contrário, o último dispositivo removível conectado será escolhido.
  3. Se não houver dispositivos removíveis conectados, as regras da política de áudio padrão para escolher dispositivos de saída são aplicados para escolher dispositivos ativos.

Um stream de saída precisa atender aos seguintes critérios para ser reaberto e roteado aos dispositivos ativos para escolher a melhor configuração 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 Gerenciador de políticas de áudio é fechado, reabre um stream de saída após a conexão do dispositivo se ele estiver inativo ou o adia para quando o stream de saída é colocado em espera.

O Gerenciador de políticas de áudio oferece a seguinte lista de APIs do sistema(conforme definido em AudioManager.java):

  • setPreferredDeviceForStrategy

    Define o dispositivo preferido para o roteamento de áudio para uma determinada estratégia. Observação para que o dispositivo não esteja disponível no momento definido, mas é usado depois de disponibilizado.

  • removePreferredDeviceForStrategy

    Remove os dispositivos de áudio preferenciais definidos anteriormente com setPreferredDeviceForStrategy ou setPreferredDevicesForStrategy.

  • getPreferredDeviceForStrategy

    Retorna o dispositivo preferido de uma estratégia de áudio definida anteriormente com setPreferredDeviceForStrategy ou setPreferredDevicesForStrategy.

  • setPreferredDevicesForStrategy

    Define os dispositivos preferidos para uma determinada estratégia.

  • getPreferredDevicesForStrategy

    Retorna os dispositivos preferidos de uma estratégia de áudio definida anteriormente com setPreferredDeviceForStrategy ou setPreferredDevicesForStrategy.

  • OnPreferredDevicesForStrategyChangedListener

    Define uma interface para notificação de mudanças no áudio preferencial para uma determinada estratégia de áudio.

  • addOnPreferredDevicesForStrategyChangedListener

    Adiciona um listener para receber notificações sobre mudanças no áudio com preferência pela estratégia dispositivo.

  • removeOnPreferredDevicesForStrategyChangedListener

    Remove um listener de mudanças adicionado anteriormente à estratégia preferencial. dispositivo de áudio.

Relatar recursos do dispositivo

Como parte da implementação da HAL de áudio, os fornecedores implementam as APIs com suporte enviando relatórios sobre os recursos do dispositivo. Esta seção explica os tipos e métodos de dados usado para informar as funcionalidades do dispositivo e lista algumas alterações feitas na HAL de áudio HIDL V7 para suportar vários dispositivos.

Tipos de dados

No áudio HIDL HAL V7, as funcionalidades do dispositivo são informadas usando o AudioProfile. e AudioTransport. A estrutura AudioTransport descreve 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. O A estrutura AudioProfile contém o formato de áudio, as taxas de amostragem compatíveis pelo perfil e pela lista de máscaras de canal, como mostrado no código a seguir bloquear 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 HIDL HAL V7 de áudio, o tipo de dados AudioPort é definido com a Estruturas AudioTransport e AudioProfile para descrever o recursos.

Métodos de HAL de áudio

O Gerenciador de políticas de áudio usa os métodos a seguir para consultar as configurações recursos:

  • getParameters:Um método genérico para recuperar o parâmetro específico do fornecedor como formatos de áudio compatíveis e as respectivas taxas de amostragem.
  • getAudioPort:Retorna a lista de atributos compatíveis (como amostragem) taxas, formatos, máscaras de canal, controladores de ganho) para uma determinada porta de áudio.

O código a seguir de IDevice.hal (em inglês) 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 um novo 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 uma nova API chamada get_audio_port_v7 para consultar as capacidades dos dispositivos usando a audio_port_v7.

O código a seguir de audio.h (em inglês) 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 na nova Formato AudioPort quando a versão legada da API for anterior à 3.2 e a HAL HIDL versão 7 ou superior. Nesse caso, todas as taxas de amostragem e canais Máscaras de get_audio_port são aceitas como compatíveis com todas as formatos, permitindo um mapeamento direto dos valores get_audio_port para os nova estrutura de AudioPort.

Exemplos de implementações da API

Esta seção descreve vários pacotes de testes contendo métodos que usam as APIs abordadas nas seções anteriores. Consulte esses métodos para conferir alguns exemplos de como essas APIs são implementadas e usadas.

Um exemplo de uso do setPreferredDevicesForStrategy: getPreferredDevicesForStrategy, removePreferredDeviceForStrategy e As APIs do sistema OnPreferredDevicesForStrategyChangedListener estão no PreferredDeviceRoutingTest, localizado no GTS.

Para ver um exemplo da nova estrutura em AudioDeviceInfo em uso, consulte o 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 em vários dispositivos.

Validação

Esta seção fornece informações sobre o CTS e validação do GTS (Pacote de testes dos Serviços do Google Mobile) do Gerenciador de áudio.

Testes CTS

Os testes CTS estão localizados em android.media.cts.AudioManagerTest.

Esta é 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 nivelado e antigo, mas estão no novo formato AudioProfile.

  • AudioManagerTest#testPreferredDevicesForStrategy e AudioManagerTest#testPreferredDeviceForCapturePreset

    Verifique se os dispositivos preferidos para estratégia e captura relacionados à predefinição Os testes de API foram concluídos.

Testes do GTS

Os testes do GTS estão localizados em com.google.android.gts.audioservice.AudioServiceHostTest.

Para validar se as APIs dos dispositivos preferidos para estratégia e captura predefinidas funcionar corretamente, execute os testes AudioServiceHostTest#testPreferredDeviceRouting e AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset.