Limite de tipo de dispositivo

No áudio do Android, audio_devices_t é usado para representar o tipo de dispositivo de áudio. É amplamente utilizado no código-fonte de áudio como um campo de bits para filtrar ou selecionar um ou mais dispositivos especificados. Antes do Android 11, havia um limite de 30 tipos de dispositivos de entrada/saída de áudio e nenhum slot sobressalente para adicionar novos tipos de dispositivos de áudio. Removemos o limite no número de tipos de dispositivos de áudio para permitir a adição de novos tipos de dispositivos de áudio.

Para remover o limite do número de tipos de dispositivos de áudio, os tipos de dispositivos de áudio agora são valores enumerados em vez de máscaras de bits.

Todos os tipos de dispositivos de áudio existentes são mantidos como estão. AUDIO_DEVICE_BIT_IN ainda é usado para distinguir dispositivos de entrada ou saída. Ao adicionar novos tipos de dispositivos de áudio, eles são valores enumerados nas lacunas entre os valores existentes.

Os OEMs não devem usar audio_devices_t como uma máscara de bits, pois isso pode causar resultados inesperados quando novos tipos de dispositivos de áudio enumerados são adicionados.

Exemplos e fonte

Antes do Android 11, havia dois usos típicos de tipos de dispositivos de áudio como máscaras de bits.

  • Usando o valor audio_devices_t para representar vários dispositivos de áudio.
  • Verificando se o valor audio_devices_t contém tipos de dispositivos de áudio de uma categoria especificada.

Para representar vários tipos de dispositivos de áudio, é usada uma classe chamada DeviceTypeSet no /libaudiofoundation/include/media/AudioContainers.h , que é um contêiner std::set de audio_devices_t . A classe é declarada na biblioteca libaudiofoundation disponível no fornecedor. Para representar vários tipos de dispositivos de áudio em código C, uma matriz ou uma lista de audio_devices_t pode ser usada.

Para verificar se um único tipo de dispositivo é de uma categoria especificada, use as funções auxiliares audio_is_.*_device em /system/media/audio/include/system/audio.h . Para o caso de vários tipos de dispositivos de áudio, use funções auxiliares em libaudiofoundation . Por exemplo, use areAllOfSameDeviceType (DeviceTypeSet, std::function ) areAllOfSameDeviceType (DeviceTypeSet, std::function ) em AudioContainers.h para verificar se todos os tipos de dispositivos de áudio fornecidos são do mesmo tipo.

Implementação

Os OEMs precisam remover a representação do campo de bits do tipo de dispositivo de áudio da implementação de HAL de áudio.

  1. Remova todo o armazenamento de dispositivos em um campo de bits.

    audio_devices_t não deve ser usado para representar vários tipos de dispositivos de áudio. Em vez disso, use uma lista ou vetor.

  2. Pare de usar operações de bit para comparações de tipos de dispositivo.

    Antes do Android 11, os tipos de dispositivos de áudio podem ser usados ​​como um campo de bits. Nesse caso, é comum usar operações de bits para comparações de tipos de dispositivos. Quando novos tipos de dispositivos de áudio enumerados são adicionados, as operações de bits podem causar resultados inesperados. Em vez disso, use funções auxiliares como alternativa. Se houver um único tipo de dispositivo de áudio, use a comparação direta para comparar os dois valores. Para verificar se um tipo de dispositivo de áudio é de uma categoria especificada, use as funções auxiliares em /system/media/audio/include/system/audio.h . Por exemplo, audio_is_output_device(audio_devices_t device) .

  3. Pare de usar valores predefinidos para grupos de tipos de dispositivos de áudio.

    Existem alguns valores predefinidos para grupos de tipos de dispositivos de áudio, AUDIO_DEVICE_OUT_ALL , em system/media/audio/include/system/audio-base-utils.h . Todos esses valores são reservados, mas podem ser preteridos, pois não estarão corretos quando novos tipos de dispositivos de áudio enumerados forem adicionados. Existem novos grupos de tipos de dispositivos de áudio definidos em audio-base-utils.h , que são arrays de tipos de dispositivos de áudio, como AUDIO_DEVICE_OUT_ALL_ARRAY .

  4. Implemente os métodos create_audio_patch() e release_audio_patch() para roteamento em vez de set_parameters .

    O método set_parameters usa tipos de dispositivos de áudio como um campo de bits, portanto, pode haver resultados inesperados se novos tipos de dispositivos de áudio enumerados forem adicionados.

    Atualmente, são necessários dois tipos de patches de áudio:

    • Mix para patches de dispositivo, para reprodução
    • Dispositivo para mixar patches, para gravação

    Em atualizações subsequentes, patches adicionais podem ser necessários para dispositivo a dispositivo.

    Ao criar um patch de áudio, se o identificador de patch não for especificado, o áudio HAL será necessário para gerar um identificador de patch exclusivo que possa identificar o patch de áudio. Caso contrário, o HAL de áudio deve usar o identificador de patch de áudio fornecido para atualizar o patch de áudio.

    Se estiver usando um HAL de áudio herdado e o wrapper HIDL AOSP, o HAL de áudio herdado deve definir a versão HAL principal como 3.0.

    Para habilitar o recurso de patch de áudio, o HAL de áudio deve definir a versão principal do HAL para 3.0 ou superior. Consulte Device::supportsAudioPatches() na implementação padrão do HIDL para obter mais informações, que também podem ser encontradas no áudio HAL para Cuttlefish.

Costumização

Não é possível desativar o recurso ou reverter a refatoração do dispositivo de áudio na estrutura que possibilita adicionar tipos de dispositivo de áudio.

Todos os tipos de dispositivos de áudio adicionados permitem representar um tipo de dispositivo com um único conjunto de bits, portanto, as implementações HAL atuais ainda funcionam.

Se novos tipos de dispositivos de áudio forem adicionados e os OEMs quiserem usá-los, eles precisam atualizar sua implementação de HAL de áudio e passar para o HIDL versão 6.0 ou superior. É obrigatório atualizar a versão principal do HAL para 3.0 e implementar os métodos create_audio_patch e release_audio_patch , pois o uso de set_parameters para rotear o fluxo pode causar resultados inesperados quando novos tipos de dispositivos de áudio são adicionados.

Validação

O trabalho necessário para OEMs é atualizar suas implementações de HAL. VTS para áudio HAL pode ser usado para validar se a implementação funciona como pretendido. Todos os testes podem ser encontrados nos arquivos VTS .