Este artigo analisa o suporte do Android para áudio digital USB e protocolos baseados em USB relacionados.
Público
O público-alvo deste artigo são OEMs de dispositivos Android, fornecedores de SoC, fornecedores de periféricos de áudio USB, desenvolvedores de aplicativos de áudio avançados e outros que buscam uma compreensão detalhada dos componentes internos de áudio digital USB no Android.
Os usuários finais de dispositivos Nexus devem consultar o artigo Gravar e reproduzir áudio usando o modo host USB na Central de Ajuda do Nexus . Embora este artigo não seja voltado para usuários finais, alguns consumidores audiófilos podem encontrar partes de seu interesse.
Visão geral do USB
Universal Serial Bus (USB) é descrito informalmente no artigo USB da Wikipedia e é formalmente definido pelos padrões publicados pelo USB Implementers Forum, Inc. Por conveniência, resumimos aqui os principais conceitos de USB, mas os padrões são a referência oficial.
Conceitos básicos e terminologia
USB é um barramento com um único iniciador de operações de transferência de dados, denominado host . O host se comunica com os periféricos através do barramento.
Nota: Os termos dispositivo e acessório são sinônimos comuns de periférico . Evitamos esses termos aqui, pois eles podem ser confundidos com dispositivo Android ou com o conceito específico do Android chamado modo acessório .
Uma função crítica do host é a enumeração : o processo de detectar quais periféricos estão conectados ao barramento e consultar suas propriedades expressas por meio de descritores .
Um periférico pode ser um objeto físico, mas na verdade implementa múltiplas funções lógicas. Por exemplo, um periférico de webcam pode ter uma função de câmera e uma função de áudio de microfone.
Cada função periférica possui uma interface que define o protocolo de comunicação com aquela função.
O host se comunica com um periférico por meio de um canal para um terminal , uma fonte de dados ou coletor fornecido por uma das funções do periférico.
Existem dois tipos de pipes: message e stream . Um canal de mensagens é usado para controle e status bidirecionais. Um stream pipe é usado para transferência de dados unidirecional.
O host inicia todas as transferências de dados, portanto os termos entrada e saída são expressos em relação ao host. Uma operação de entrada transfere dados do periférico para o host, enquanto uma operação de saída transfere dados do host para o periférico.
Existem três modos principais de transferência de dados: interrupção , em massa e isócrona . O modo isócrono será discutido mais adiante no contexto do áudio.
O periférico pode ter terminais que se conectam ao mundo exterior, além do próprio periférico. Desta forma, o periférico serve para traduzir entre o protocolo USB e os sinais do “mundo real”. Os terminais são objetos lógicos da função.
Modos USB do Android
Modo de desenvolvimento
O modo de desenvolvimento está presente desde o lançamento inicial do Android. O dispositivo Android aparece como um periférico USB para um PC host executando um sistema operacional de desktop como Linux, Mac OS X ou Windows. A única função periférica visível é Android fastboot ou Android Debug Bridge (adb) . Os protocolos fastboot e adb são colocados em camadas no modo de transferência de dados em massa USB.
Modo anfitrião
O modo host é introduzido no Android 3.1 (API de nível 12).
Como o dispositivo Android deve atuar como host, e a maioria dos dispositivos Android inclui um conector micro-USB que não permite diretamente a operação do host, geralmente é necessário um adaptador on-the-go ( OTG ) como este:
Um dispositivo Android pode não fornecer energia suficiente para operar um periférico específico, dependendo de quanta energia o periférico precisa e de quanta energia o dispositivo Android é capaz de fornecer. Mesmo que esteja disponível energia adequada, a carga da bateria do dispositivo Android pode ser significativamente reduzida. Para essas situações, use um hub alimentado como este:
Modo acessório
O modo acessório foi introduzido no Android 3.1 (API de nível 12) e portado para o Android 2.3.4. Neste modo, o dispositivo Android funciona como um periférico USB, sob o controle de outro dispositivo, como um dock, que serve como host. A diferença entre o modo de desenvolvimento e o modo acessório é que funções USB adicionais são visíveis para o host, além do adb. O dispositivo Android começa no modo de desenvolvimento e depois passa para o modo acessório por meio de um processo de renegociação.
O modo acessório foi estendido com recursos adicionais no Android 4.1, em particular o áudio descrito abaixo.
Áudio USB
Aulas USB
Cada função periférica possui um documento de classe de dispositivo associado que especifica o protocolo padrão para aquela função. Isso permite que hosts e funções periféricas compatíveis com a classe interoperem, sem conhecimento detalhado do funcionamento de cada um. A conformidade de classe é crítica se o host e o periférico forem fornecidos por entidades diferentes.
O termo driverless é um sinônimo comum para compatível com classe , indicando que é possível usar os recursos padrão de tal periférico sem a necessidade de instalação de um driver específico do sistema operacional. Pode-se presumir que um periférico anunciado como “sem necessidade de driver” para os principais sistemas operacionais de desktop será compatível com a classe, embora possa haver exceções.
Aula de áudio USB
Aqui nos preocupamos apenas com periféricos que implementam funções de áudio e, portanto, aderem à classe de dispositivos de áudio. Existem duas edições da especificação de classe de áudio USB: classe 1 (UAC1) e 2 (UAC2).
Comparação com outras classes
USB inclui muitas outras classes de dispositivos, algumas das quais podem ser confundidas com a classe de áudio. A classe de armazenamento em massa (MSC) é usada para acesso orientado ao setor à mídia, enquanto o Media Transfer Protocol (MTP) é para acesso total aos arquivos da mídia. Tanto o MSC quanto o MTP podem ser usados para transferir arquivos de áudio, mas apenas a classe de áudio USB é adequada para streaming em tempo real.
Terminais de áudio
Os terminais de um periférico de áudio são normalmente analógicos. O sinal analógico apresentado no terminal de entrada do periférico é convertido em digital por um conversor analógico-digital (ADC) e transportado pelo protocolo USB para ser consumido pelo host. O ADC é uma fonte de dados para o host. Da mesma forma, o host envia um sinal de áudio digital através do protocolo USB para o periférico, onde um conversor digital para analógico (DAC) converte e apresenta para um terminal de saída analógica. O DAC é um coletor para o host.
Canais
Um periférico com função de áudio pode incluir um terminal de fonte, um terminal coletor ou ambos. Cada direção pode ter um canal ( mono ), dois canais ( estéreo ) ou mais. Periféricos com mais de dois canais são chamados de multicanais . É comum interpretar um fluxo estéreo como consistindo em canais esquerdo e direito e, por extensão, interpretar um fluxo multicanal como tendo localizações espaciais correspondentes a cada canal. No entanto, também é bastante apropriado (especialmente para áudio USB mais do que HDMI ) não atribuir nenhum significado espacial padrão específico a cada canal. Neste caso, cabe à aplicação e ao usuário definir como cada canal será utilizado. Por exemplo, um fluxo de entrada USB de quatro canais pode ter os três primeiros canais conectados a vários microfones em uma sala e o canal final recebendo entrada de um rádio AM.
Modo de transferência isócrona
O áudio USB usa o modo de transferência isócrona para suas características em tempo real, em detrimento da recuperação de erros. No modo isócrono, a largura de banda é garantida e os erros de transmissão de dados são detectados por meio de uma verificação de redundância cíclica (CRC). Mas não há reconhecimento de pacote ou retransmissão em caso de erro.
As transmissões isócronas ocorrem a cada período de início do quadro (SOF). O período SOF é de um milissegundo para velocidade total e 125 microssegundos para alta velocidade. Cada quadro de velocidade total transporta até 1.023 bytes de carga útil, e um quadro de alta velocidade transporta até 1.024 bytes. Juntando tudo isso, calculamos a taxa de transferência máxima como 1.023.000 ou 8.192.000 bytes por segundo. Isso define um limite superior teórico para a taxa de amostragem de áudio combinada, contagem de canais e profundidade de bits. O limite prático é menor.
Dentro do modo isócrono, existem três submodos:
- Adaptativo
- Assíncrono
- Síncrono
No submodo adaptativo, o coletor ou fonte periférico se adapta a uma taxa de amostragem potencialmente variável do host.
No submodo assíncrono (também chamado de feedback implícito), o coletor ou fonte determina a taxa de amostragem e o host acomoda. A principal vantagem teórica do submodo assíncrono é que o relógio USB fonte ou coletor está física e eletricamente mais próximo (e de fato pode ser o mesmo ou derivado) do relógio que aciona o DAC ou ADC. Essa proximidade significa que o submodo assíncrono deve ser menos suscetível ao jitter do clock. Além disso, o relógio usado pelo DAC ou ADC pode ser projetado para maior precisão e menor desvio do que o relógio host.
No submodo síncrono, um número fixo de bytes é transferido a cada período SOF. A taxa de amostragem de áudio é efetivamente derivada do relógio USB. O submodo síncrono não é comumente usado com áudio porque tanto o host quanto o periférico estão à mercê do relógio USB.
A tabela abaixo resume os submodos isócronos:
Submodo | Contagem de bytes por pacote | Taxa de amostragem determinado por | Usado para áudio |
---|---|---|---|
adaptativo | variável | hospedar | sim |
assíncrono | variável | periférico | sim |
síncrono | fixo | Relógio USB | não |
Na prática, o submodo é obviamente importante, mas outros factores também devem ser considerados.
Suporte Android para classe de áudio USB
Modo de desenvolvimento
O áudio USB não é compatível com o modo de desenvolvimento.
Modo anfitrião
O Android 5.0 (API de nível 21) e superior oferece suporte a um subconjunto de recursos de áudio USB classe 1 (UAC1):
- O dispositivo Android deve atuar como host
- O formato de áudio deve ser PCM (interface tipo I)
- A profundidade de bits deve ser de 16 bits, 24 bits ou 32 bits, onde 24 bits de dados de áudio úteis são justificados à esquerda dentro dos bits mais significativos da palavra de 32 bits
- A taxa de amostragem deve ser 48, 44,1, 32, 24, 22,05, 16, 12, 11,025 ou 8 kHz
- A contagem de canais deve ser 1 (mono) ou 2 (estéreo)
A leitura do código-fonte da estrutura do Android pode mostrar código adicional além do mínimo necessário para oferecer suporte a esses recursos. Mas este código não foi validado, pelo que ainda não foram reivindicadas funcionalidades mais avançadas.
Modo acessório
O Android 4.1 (API de nível 16) adicionou suporte limitado para reprodução de áudio ao host. Enquanto estiver no modo acessório, o Android roteia automaticamente sua saída de áudio para USB. Ou seja, o dispositivo Android serve como fonte de dados para o host, por exemplo, um dock.
O áudio do modo acessório possui estes recursos:
- O dispositivo Android deve ser controlado por um host experiente que possa primeiro fazer a transição do dispositivo Android do modo de desenvolvimento para o modo acessório e, em seguida, o host deve transferir dados de áudio do endpoint apropriado. Assim, o dispositivo Android não parece “sem driver” para o host.
- A direção deve ser inserida , expressa em relação ao host
- O formato de áudio deve ser PCM de 16 bits
- A taxa de amostragem deve ser de 44,1 kHz
- A contagem de canais deve ser 2 (estéreo)
O modo de áudio acessório não foi amplamente adotado e atualmente não é recomendado para novos designs.
Aplicações de áudio digital USB
Como o nome indica, o sinal de áudio digital USB é representado por um fluxo de dados digital em vez do sinal analógico usado pelo mini conector de fone de ouvido TRS comum. Eventualmente, qualquer sinal digital deve ser convertido em analógico antes de poder ser ouvido. Existem desvantagens na escolha de onde colocar essa conversão.
Uma história de dois DACs
No diagrama de exemplo abaixo, comparamos dois designs. Primeiro, temos um dispositivo móvel com processador de aplicativos (AP), DAC integrado, amplificador e conector TRS analógico conectado aos fones de ouvido. Consideramos também um dispositivo móvel com USB conectado a um DAC USB externo e amplificador, também com fones de ouvido.
Qual design é melhor? A resposta depende de suas necessidades. Cada um tem vantagens e desvantagens.
Nota: Esta é uma comparação artificial, já que um dispositivo Android real provavelmente teria as duas opções disponíveis.
O primeiro projeto A é mais simples, menos caro, usa menos energia e será um projeto mais confiável, assumindo componentes igualmente confiáveis. No entanto, geralmente existem compensações na qualidade do áudio em relação a outros requisitos. Por exemplo, se este for um dispositivo de mercado de massa, pode ser concebido para atender às necessidades do consumidor em geral e não para o audiófilo.
No segundo design, o periférico de áudio externo C pode ser projetado para maior qualidade de áudio e maior saída de energia sem impactar o custo do dispositivo Android B básico do mercado de massa. Sim, é um design mais caro, mas o custo é absorvido apenas por aqueles que querem.
Os dispositivos móveis são conhecidos por terem placas de circuito de alta densidade, o que pode resultar em mais oportunidades de diafonia que degrada os sinais analógicos adjacentes. A comunicação digital é menos suscetível a ruídos , portanto, mover o DAC do dispositivo Android A para uma placa de circuito externa C permite que os estágios analógicos finais sejam isolados física e eletricamente da placa de circuito densa e barulhenta, resultando em áudio de maior fidelidade.
Por outro lado, o segundo design é mais complexo e, com o aumento da complexidade, surgem mais oportunidades para que as coisas falhem. Também há latência adicional dos controladores USB.
Aplicativos em modo host
As aplicações típicas de áudio no modo host USB incluem:
- ouvindo música
- telefonia
- mensagens instantâneas e bate-papo por voz
- gravação
Para todos esses aplicativos, o Android detecta um periférico de áudio digital USB compatível e roteia automaticamente a reprodução e a captura de áudio de forma adequada, com base nas regras da política de áudio. O conteúdo estéreo é reproduzido nos dois primeiros canais do periférico.
Não há APIs específicas para áudio digital USB. Para uso avançado, o roteamento automático pode interferir em aplicativos compatíveis com USB. Para tais aplicativos, desative o roteamento automático por meio do controle correspondente na seção Mídia de Configurações/Opções do desenvolvedor .
Depurar no modo host
Enquanto estiver no modo host USB, a depuração adb por USB não estará disponível. Consulte a seção Uso sem fio do Android Debug Bridge para obter uma alternativa.
Implementar áudio USB
Recomendações para fornecedores de periféricos de áudio
Para interoperar com dispositivos Android, os fornecedores de periféricos de áudio devem:
- design para conformidade com classe de áudio; atualmente o Android tem como alvo a classe 1, mas é aconselhável planejar a classe 2
- evite peculiaridades
- testar a interoperabilidade com dispositivos Android populares e de referência
- documentar claramente os recursos suportados, conformidade com a classe de áudio, requisitos de energia, etc. para que os consumidores possam tomar decisões informadas
Recomendações para OEMs de dispositivos Android e fornecedores de SoC
Para oferecer suporte ao áudio digital USB, os OEMs de dispositivos e os fornecedores de SoC devem:
- projetar hardware para suportar o modo host USB
- habilite o suporte de host USB genérico no nível da estrutura por meio do sinalizador de recurso
android.hardware.usb.host.xml
- habilite todos os recursos necessários do kernel: modo host USB, áudio USB, modo de transferência isócrona; consulte Configuração do kernel do Android
- mantenha-se atualizado com versões e patches recentes do kernel; apesar do nobre objetivo de conformidade de classe, existem periféricos de áudio com peculiaridades , e kernels recentes têm soluções alternativas para tais peculiaridades
- habilite a política de áudio USB conforme descrito abaixo
- adicione audio.usb.default a PRODUCT_PACKAGES em device.mk
- testar a interoperabilidade com periféricos de áudio USB comuns
Habilitar política de áudio USB
Para ativar o áudio USB, adicione uma entrada ao arquivo de configuração da política de áudio. Normalmente está localizado aqui:
device/oem/codename/audio_policy.conf
O componente do nome do caminho "oem" deve ser substituído pelo nome do OEM que fabrica o dispositivo Android e "nome do código" deve ser substituído pelo nome do código do dispositivo.
Um exemplo de entrada é mostrado aqui:
audio_hw_modules { ... usb { outputs { usb_accessory { sampling_rates 44100 channel_masks AUDIO_CHANNEL_OUT_STEREO formats AUDIO_FORMAT_PCM_16_BIT devices AUDIO_DEVICE_OUT_USB_ACCESSORY } usb_device { sampling_rates dynamic channel_masks dynamic formats dynamic devices AUDIO_DEVICE_OUT_USB_DEVICE } } inputs { usb_device { sampling_rates dynamic channel_masks AUDIO_CHANNEL_IN_STEREO formats AUDIO_FORMAT_PCM_16_BIT devices AUDIO_DEVICE_IN_USB_DEVICE } } } ... }
Código fonte
A implementação de áudio Hardware Abstraction Layer (HAL) para áudio USB está localizada aqui:
hardware/libhardware/modules/usbaudio/
O HAL de áudio USB depende muito do tinyalsa , descrito em Terminologia de áudio . Embora o áudio USB dependa de transferências isócronas, isso é abstraído pela implementação do ALSA. Portanto, o áudio USB HAL e o tinyalsa não precisam se preocupar com esta parte do protocolo USB.
Testar áudio USB
Para obter informações sobre testes CTS para áudio USB, consulte Testes de verificação de CTS de áudio USB .