Bit-Perfect no Android: como funciona o caminho do áudio

Por: Vitor Valeri

Hobbysta de fones há mais de 15 anos, fundou o site Hi-Fi Hub e é administrator dos grupos Fones High-End e Fones Low-End no Facebook.
Comentários 3
Salvar
Publicado em: 01/06/26 às 22:18 - Atualizado em: 01/06/26 às 22:39
Imagem - Bit-Perfect no Android: como funciona o caminho do áudio 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 que é um DAC e qual a sua função

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.

Placa de circuito impresso do DAC dedicado de mesa Topping D70S (Imagem: Sandu Vitalie/Sound News)

A necessidade de um amplificador (amp)

É 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).

O caminho do áudio no Android

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.

Transmissão do áudio utilizando dispositivos Android

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 culpado por impedir a transmissão bit-perfect

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.

As funções realizadas pelo mixer do AudioFlinger no Android (Imagem: Vitor Valeri/Hi-Fi Hub)

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.

O que fazer para garantir o bit-perfect

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).

O bit-perfect em smartphones e tablets com Android

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

O cenário de uso de um dispositivo Android comum

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.

Diagrama do fluxo padrão do áudio em um dispositivo Android comum (Imagem: Vitor Valeri/Hi-Fi Hub)

O que é o AudioSink?

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 que é o ExoPlayer?

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.

O que é a HAL?

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 que é o driver de áudio USB?

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).

O bit-perfect em DAPs (Digital Audio Players)

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”.

A customização do Android feita pelas fabricantes de DAPs

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).

Diagrama do fluxo padrão do áudio em um Digital Audio Player (Imagem: Vitor Valeri/Hi-Fi Hub)

Uma limitação que acaba causando problemas

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.”

Módulo Quectel SC200V com SoC Qualcomm Snapdragon 680 e chip CXMT 6XD85CCBM (Imagem: Reprodução/FiiO)

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

Módulo Quectel SC200V com SoC Qualcomm SM6225 e chip CXMT 6XD85CCBM (Imagem: Reprodução/FiiO)

Tags desse Artigo:

#Android - #bit-perfect

Compartilhe:

COMENTÁRIOS:

A
Antonio Setz
O artigo é muito técnico, difícil para quem não tem um mínimo de conhecimento. Afinal, dá para perceber audivelmente degradação no áudio por ser convertido para 48 kHz? Eu acredito que não. De qualquer forma, a partir do Android 14, o bit-perfect já está disponível nativamente para DACs externos USB. A implementação da função fica a critério do fabricante do celular.
V
Vitor Valeri
Olá Antonio, sim o artigo é realmente bem técnico, mas não vi outra forma de abordar o tema se não ficaria muito superficial. Inclusive, resumi bem diversos pontos para não ficar ainda mais complicado de entender. Ouvir audivelmente a degradação vai depender do hardware do SoC e de como foi feita a placa do fabricante do smartphone ou DAP, além de alterações em serviços do Android e drivers. A implementação faz muita diferença. Sobre o Android 14, infelizmente não é tão fácil, já que depende da HAL base disponibilizada pela Qualcomm (ou outra fabricante de SoC), por exemplo, e da HAL desenvolvida pelo fabricante do celular ou smartphone. Além da questão da HAL, ainda é necessário que o desenvolvedor do app implemente bibliotecas e serviços para permitir a comunicação adequada com a HAL (para cada fabricante de celular ou DAP). Inclusive essa questão do bit-perfect no Android 14 está como não resolvida no forum de desenvolvedores do Android.
P
Pedro Rossi
Artigo top demais e tirou bastante das dúvidas que eu tinha da razão de utilizar DACs com o celular ou não

*Campos obrigatórios