O Google está comprometido em promover a equidade racial para as comunidades negras. Veja como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

Áudio digital USB

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 avançados de aplicativos de áudio e outros que buscam entender detalhadamente os internos de áudio digital USB no Android.

Os usuários finais dos dispositivos Nexus devem ver 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 interesse.

Visão geral do USB

O Universal Serial Bus (USB) é descrito informalmente no artigo da Wikipedia USB 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, chamado host . O host se comunica com os periféricos via 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 o dispositivo Android ou 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 várias 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 para se comunicar com essa função.

O host se comunica com um periférico através de um tubo para um ponto final , uma fonte de dados ou coletor fornecido por uma das funções do periférico.

Existem dois tipos de canais : mensagem e fluxo . Um canal de mensagens é usado para controle e status bidirecionais. Um tubo de fluxo é 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ócrono . O modo isócrono será discutido mais adiante no contexto do áudio.

O periférico pode ter terminais que se conectam ao mundo externo, além do próprio periférico. Dessa maneira, 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 é o Android fastboot ou o Android Debug Bridge (adb) . Os protocolos fastboot e adb estão em camadas no modo de transferência de dados em massa USB.

Modo host

O modo host é introduzido no Android 3.1 (API 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:

OTG

Figura 1. Adaptador On-the-go (OTG)

Um dispositivo Android pode não fornecer energia suficiente para operar um periférico específico, dependendo da quantidade de energia que o periférico precisa e de quanto o dispositivo Android é capaz de fornecer. Mesmo se houver energia adequada, a carga da bateria do dispositivo Android pode ser significativamente reduzida. Para essas situações, use um hub com energia como este:

Hub alimentado

Figura 2. Hub alimentado

Modo acessório

O modo Acessório foi introduzido no Android 3.1 (API nível 12) e portado para o Android 2.3.4. Nesse modo, o dispositivo Android opera 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 inicia no modo de desenvolvimento e depois passa para o modo acessório por meio de um processo de renegociação.

O modo de acessório foi estendido com recursos adicionais no Android 4.1, em particular o áudio descrito abaixo.

Áudio USB

Classes USB

Cada função periférica possui um documento de classe de dispositivo associado que especifica o protocolo padrão para essa função. Isso permite que hosts compatíveis com a classe e funções periféricas interoperem, sem conhecimento detalhado do funcionamento um do outro. A conformidade de classe é crítica se o host e o periférico forem fornecidos por diferentes entidades.

O termo driverless é um sinônimo comum de compatibilidade de classe , indicando que é possível usar os recursos padrão de um periférico sem exigir a instalação de um driver específico do sistema operacional. Pode-se supor que um periférico anunciado como "nenhum driver necessário" para os principais sistemas operacionais de desktop seja compatível com a classe, embora possa haver exceções.

Classe de áudio USB

Aqui nos preocupamos apenas com periféricos que implementam funções de áudio e, assim, aderem à classe de dispositivos de áudio. Há duas edições da especificação da classe de áudio USB: classe 1 (UAC1) e 2 (UAC2).

Comparação com outras classes

O 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 MTP ( Media Transfer Protocol ) é para acesso completo à 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 transmissão em tempo real.

Terminais de áudio

Os terminais de um periférico de áudio são tipicamente 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 em 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 origem, terminal de dissipador 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 multicanal . É comum interpretar um fluxo estéreo como composto pelos canais esquerdo e direito e, por extensão, interpretar um fluxo multicanal como tendo locais 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. Nesse caso, cabe ao aplicativo e ao usuário definir como cada canal é usado. Por exemplo, um fluxo de entrada USB de quatro canais pode ter os três primeiros canais conectados a vários microfones dentro de uma sala e o canal final recebendo entrada de um rádio AM.

Modo de transferência isócrono

O áudio USB usa o modo de transferência isócrona para suas características em tempo real, às custas 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 usando uma verificação de redundância cíclica (CRC). Mas não há reconhecimento ou retransmissão de pacotes 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 máxima e 125 microssegundos para alta velocidade. Cada quadro de velocidade total transporta até 1023 bytes de carga útil, e um quadro de alta velocidade transporta até 1024 bytes. Juntando isso, calculamos a taxa máxima de transferência 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, a contagem de canais e a profundidade de bits. O limite prático é mais baixo.

No modo isócrono, existem três submodos:

  • Adaptativo
  • Assíncrono
  • Síncrono

No submodo adaptativo, o coletor ou fonte periférica se adapta a uma taxa de amostra potencialmente variável do host.

No submodo assíncrono (também chamado de feedback implícito), o coletor ou a fonte determina a taxa de amostragem e o host é acomodado. A principal vantagem teórica do submodo assíncrono é que o relógio USB de origem 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 à tremulação do relógio. 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 do 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 o host e 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
adaptável variável hospedeiro sim
assíncrono variável periférico sim
síncrono fixo Relógio USB não

Na prática, o submodo obviamente importa, mas outros fatores também devem ser considerados.

Suporte Android para classe de áudio USB

Modo de desenvolvimento

O áudio USB não é suportado no modo de desenvolvimento.

Modo host

O Android 5.0 (nível de API 21) e superior suporta um subconjunto de recursos da classe de áudio USB 1 (UAC1):

  • O dispositivo Android deve atuar como host
  • O formato de áudio deve ser PCM (tipo de interface 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 nos 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 esse código não foi validado, portanto, recursos mais avançados ainda não foram reivindicados.

Modo acessório

O Android 4.1 (nível 16 da API) adicionou suporte limitado para reprodução de áudio ao host. Enquanto no modo acessório, o Android roteia automaticamente sua saída de áudio para USB. Ou seja, o dispositivo Android serve como uma fonte de dados para o host, por exemplo, um dock.

O áudio do modo acessório possui os seguintes recursos:

  • O dispositivo Android deve ser controlado por um host com conhecimento 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 ponto de extremidade apropriado. Portanto, 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 44,1 kHz
  • A contagem de canais deve ser 2 (estéreo)

O áudio do modo acessório não foi amplamente adotado e atualmente não é recomendado para novos modelos.

Aplicações de áudio digital USB

Como o nome indica, o sinal de áudio digital USB é representado por um fluxo de dados digitais em vez do sinal analógico usado pelo conector comum do mini fone de ouvido TRS. Eventualmente, qualquer sinal digital deve ser convertido em analógico antes de poder ser ouvido. Existem vantagens em escolher onde colocar essa conversão.

Um conto de dois CAD

No diagrama de exemplo abaixo, comparamos dois projetos. Primeiro, temos um dispositivo móvel com Application Processor (AP), DAC integrado, amplificador e conector TRS analógico conectado aos fones de ouvido. Também consideramos um dispositivo móvel com USB conectado ao DAC e amplificador USB externos, também com fones de ouvido.

Comparação DAC

Figura 3. Comparação de dois DACs

Qual design é melhor? A resposta depende das suas necessidades. Cada um tem vantagens e desvantagens.

Nota: Esta é uma comparação artificial, pois um dispositivo Android real provavelmente teria as duas opções disponíveis.

O primeiro projeto A é mais simples, mais barato, consome menos energia e será um projeto mais confiável, assumindo componentes igualmente confiáveis. No entanto, geralmente existem trocas de qualidade de áudio versus outros requisitos. Por exemplo, se este é um dispositivo de mercado de massa, ele pode ser projetado para atender às necessidades do consumidor em geral, não para o audiófilo.

No segundo projeto, o periférico de áudio externo C pode ser projetado para maior qualidade de áudio e maior potência, sem afetar o custo do dispositivo Android básico do mercado de massa B. Sim, é um projeto mais caro, mas o custo é absorvido apenas por quem quiser.

Os dispositivos móveis são notórios por possuir placas de circuito de alta densidade, o que pode resultar em mais oportunidades de diafonia que degradam os sinais analógicos adjacentes. A comunicação digital é menos suscetível a ruído , 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 maior complexidade, surgem mais oportunidades para que as coisas falhem. Também há latência adicional nos controladores USB.

Aplicativos no modo host

Os aplicativos de áudio típicos no modo USB incluem:

  • ouvir 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 captura de áudio de acordo com as 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 com aplicativos compatíveis com USB. Para esses aplicativos, desative o roteamento automático por meio do controle correspondente na seção Mídia de Configurações / Opções do desenvolvedor .

Depurando enquanto estiver no modo host

Enquanto estiver no modo host USB, a depuração adb por USB não está disponível. Consulte a seção Uso sem fio do Android Debug Bridge para uma alternativa.

Implementando á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 a classe de áudio; atualmente o Android tem como alvo a classe 1, mas é aconselhável planejar a classe 2
  • evitar peculiaridades
  • teste de interoperabilidade com referência e dispositivos Android populares
  • documentar claramente os recursos suportados, a conformidade da classe de áudio, os 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 do dispositivo e os fornecedores de SoC devem:

  • projetar hardware para suportar o modo host USB
  • ativar o suporte a host USB genérico no nível da estrutura por meio do sinalizador de recurso android.hardware.usb.host.xml
  • habilite todos os recursos do kernel necessários: modo host USB, áudio USB, modo de transferência isócrona; consulte Configuração do kernel do Android
  • mantenha-se atualizado com os lançamentos e patches recentes do kernel; apesar do objetivo nobre da conformidade de classe, existem periféricos de áudio existentes com peculiaridades , e os kernels recentes têm soluções alternativas para essas peculiaridades
  • ative a política de áudio USB, conforme descrito abaixo
  • adicione audio.usb.default a PRODUCT_PACKAGES em device.mk
  • teste de interoperabilidade com periféricos de áudio USB comuns

Como habilitar a política de áudio USB

Para ativar o áudio USB, adicione uma entrada ao arquivo de configuração da política de áudio. Isso geralmente 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 "codename" deve ser substituído pelo nome do código do dispositivo.

Uma entrada de exemplo é mostrada 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 da camada de abstração de hardware (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 tinyalsa não precisam se preocupar com essa parte do protocolo USB.

Testando áudio USB

Para obter informações sobre o teste CTS para áudio USB, consulte Testes do USB Audio CTS Verifier .