Por: Vitor Valeri
Recurso para ativação da transmissão bit-perfect no app USB Audio Player Pro (Imagem: Vitor Valeri/Hi-Fi Hub)
Existem dois caminhos possíveis para o áudio seguir em dispositivos Android. O primeiro é utilizando o DAC interno e o segundo é conectando um DAC externo via USB ou S/PDIF. Como o sistema operacional (SO) do Google pode alterar as características dos arquivos de música e o volume, os audiófilos procuram soluções para evitar isso. Felizmente, existem formas de evitar essas mudanças e quando se consegue manter os dados intactos, chamamos isso de “bit-perfect”.
Antes de começar a explicar sobre como o fluxo de áudio caminha no Android, irei explicar sobre a função de um DAC. Isso é essencial para compreender tudo o que acontece durante o processamento de um arquivo de música.
O DAC é um chip soldado na placa de circuito impresso (PCB) de um dispositivo eletrônico como um smartphone, por exemplo. Sua função é converter o sinal digital (dados binários) em analógico (tensão ou corrente). Essa conversão de sinais é necessária para fazer com que fones de ouvido ou caixas de som possam gerar som.

É importante mencionar que além do DAC, é necessário utilizar um amplificador (amp). O sinal analógico gerado pelo DAC é muito fraco e o diafragma do alto-falante não se movimento sem a ajuda de um amp. Por esse motivo, um sistema de amplificação é utilizado para aumentar (amplificar) a amplitude do sinal analógico (tensão ou corrente).
Há duas direções que o áudio pode seguir no Android. A primeira é utilizando o chip DAC que está soldado na placa do smartphone ou do DAP (Digital Audio Player). A segunda é conectando via USB um DAC externo. Cada um destes caminhos segue etapas diferentes, embora haja algumas semelhanças.
A transmissão dos dados dos arquivos de áudio normalmente sofre alterações. Isso acontece em dispositivos Android que não são dedicados à reprodução de música. Um exemplo disso são os smartphones e tablets com sistema operacional Android. O principal responsável pelas modificações é o AudioFlinger.
O AudioFlinger é o serviço do framework de áudio do Android. Uma de suas funções é a de mixer de áudio, que consiste em controlar o volume do som dos apps, a profundidade de bits (exemplo: 16-bit/24-bit) e a taxa de amostragem (exemplo: 44,1kHz, 48kHz, 192kHz).
O mixer é realiza a conversão de fluxos PCM [1] com diferentes especificações para uma única que tenha uma taxa de amostragem de 48 kHz. A conversão para uma única especificação tem como propósito proporcionar estabilidade, auxiliar no processamento multitarefa e garantir compatibilidade.

Ao customizar o AudioFlinger, é possível fazer o by-pass do SCR (sample rate conversion) do Android. Porém, é importante que a HAL também seja modificada para permitir que estas alterações cheguem até o driver, conforme será explicado mais à frente.
[1] O PCM (Pulse Code Modulation) é um formato utilizado para representar sinais de áudio digital.
Há duas situações diferentes em que há necessidades distintas para se garantir o bit-perfect. A primeira é quando se utiliza um dispositivo Android comum como, por exemplo, smartphones e tablets. A segunda é o caso da utilização de dispositivos dedicados à reprodução de música como, por exemplo, os DAPs (Digital Audio Players).
No caso de smartphones e tablets, a melhor solução é conectar um DAC externo via USB, pois não há mais saída para fones de ouvido. Mas fazer somente isso não basta, pois é necessário que o desenvolvedor do app de música faça algumas implementações. Pensando nisso, Marcelo Silva desenvolveu o “decent-player”, um driver de áudio USB que permite evita as alterações realizadas pelo framework de áudio do Android.
O “decent-player” pode ser implementado gratuitamente por qualquer desenvolvedor de app de música e está disponível no GitHub. Ele possibilita que mais aplicativos possam oferecer a transmissão bit-perfect, além de apps como USB Audio Player Pro (UAPP) e Hiby Music.
Para entender o que o “decent-player” faz, é necessário compreender como funciona o caminho do áudio no cenário descrito acima.
Recomendação de artigo para leitura: USB Audio Player Pro (UAPP) em celulares e DAPs Android
Em um dispositivo Android comum, o ideal para garantir o bit-perfect é utilizar uma AudioSink customizada e um driver de áudio USB customizado. Desta forma se garante que o fluxo PCM enviado pelo app de música seja enviado para o driver USB, que também deve ser customizado.
A transmissão direta dos dados PCM para o driver de áudio USB permite o by-pass do AudioFlinger e da HAL (Hardware Abstraction Layer). Ambos alteram e limitam o processamento dos arquivos das músicas.
Como o driver de áudio USB faz a comunicação direta com o hardware do DAC externo, a música não tem suas características alteradas. Desta forma, o arquivo de áudio fica inalterado comparado ao que saiu do app de reprodução.
Abaixo um diagrama com o fluxo padrão do áudio em um dispositivo Android comum.

O AudioSink é a interface do responsável por receber o PCM decodificado do ExoPlayer e enviar o áudio ao sistema operacional Android. Ele que define se o fluxo de áudio vai para uma API (AudioTrack, AAudio) ou envia direto para o driver de áudio USB ou transmite para um sistema de DSP (Digital Signal Processing).
O ExoPlayer é uma biblioteca de reprodução multimidia criada pela Google para o Android. Ela é utilizada por apps de reprodução de música local e de streaming de música. Sua função é fazer a leitura e decodificação de arquivos em formatos como MP3 e FLAC para PCM com 16-bit/24-bit/32-bit e 44,1Khz/48kHz/96kHz/192kHz.
HAL significa “Hardware Abstraction Layer”. Ela quem decide as taxas de amostragem o hardware aceita e quais o sistema operacional mostra ao app de música. A HAL pode fixar tudo em 48 kHz, bloquear a mudança automática de taxa de amostragem e limitar o modo exclusivo de envio de dados.
A base da HAL é feita por fabricantes de SoC como Qualcomm e MediaTek. As empresas de celulares podem modificar essa HAL, alterando políticas e adicionando recursos. Por esse motivo há diferenças no comportamento entre diferentes smartphones.
O driver de áudio USB de comunica diretamente com o hardware do DAC USB externo enviando pacotes de dados. Ele tem como funções, por exemplo, controlar a taxa de amostragem e fazer a sincronização de clock, além de outras funções. Além disso, também é responsável por implementar a especificação UAC (USB Audio Class), que possui as versões 1.0 (UAC1) e 2.0 (UAC2).
Como as fabricantes de DAPs tem controle sobre o hardware e o firmware, elas podem customizar o AudioFlinger e a HAL. Além disso geralmente há customização dos drivers, que fazem a comunicação com o hardware do DAC, seja ele interno ou externo.
Note que um desenvolvedor de app de música não pode realizar as alterações acima normalmente. A alternativa para este cenário está no desenvolvimento de um AudioSink customizado e drivers customizados, que é o caso do “decent-player”.
Parte da customização do Android em DAPs consiste na alteração do funcionamento do AudioFlinger, impedindo que haja modificações nos fluxos PCM dos arquivos de música reproduzidos. Além disso, também são implementadas personalizações na HAL, permitindo que os dados das faixas cheguem até o driver, que se comunica com o DAC.
O driver I²S permite que o DAC interno do DAP consiga se comunicar corretamente com um chipset Qualcomm Snapdragon, por exemplo. Já o driver USB proporciona a conexão do SoC com o DAC externo. Ambos os drivers geralmente são customizados pela fabricante do Digital Audio Player.
Abaixo um diagrama com o fluxo padrão do áudio em um DAP (Digital Audio Player).

De acordo com o fundador e CEO da FiiO, são comprados módulos com “processador, memória RAM e flash, chip de gerenciamento de energia e outros componentes comuns, além de um firmware SDK pronto para uso”. James explicou que dependendo do que for necessário modificar, sua empresa (FiiO) não tem permissão. Porém, é possível pedir ao fornecedor do módulo a implementação das alterações que a companhia necessita.
“A FiiO, ao receber o módulo e o pacote de software, solicita ao fabricante a liberação do código-fonte de certas funções para adaptá-lo às suas necessidades. Algumas funções não temos permissão de acessar, aí o fabricante do módulo precisa implementar para nós.”

Abaixo uma captura de tela mostrando o módulo Quectel SC200V aberto. Veja que há um chipset da Qualcomm, mas há também chips de memória RAM da CXMT (ChangXin Memory Technologies). É interessante mencionar que este tipo de módulo é produzido por empresas de soluções de hardware para IoT (Internet of Things).
Recomendação de artigo para leitura: A evolução dos chipsets e a otimização do Android em DAPs

Compartilhe: