Áudio digital USB

Este artigo analisa o suporte do Android para áudio digital USB e recursos relacionados Protocolos baseados em USB.

Público-alvo

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 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 no Central de Ajuda do Nexus. Embora este artigo não seja direcionado a usuários finais, alguns consumidores audiófilos podem encontrar partes de interesse.

Visão geral do USB

O USB (Universal Serial Bus) é descrito informalmente no artigo da Wikipédia USB e é formalmente definida pelos padrões publicados pela Fórum de implementações de USB, Inc. (em inglês). Para facilitar, resumimos os principais conceitos de USB aqui, mas os padrões são a referência oficial.

Terminologia e conceitos básicos

USB é um ônibus com um único iniciador de operações de transferência de dados, chamado host. O host se comunica com periféricos via ônibus.

Observação: os termos dispositivo e acessório são sinônimos comuns para periférico. Evitamos esses termos aqui, porque eles podem ser confundidos com Dispositivo Android ou conceito específico do Android chamado modo de acessório.

Um papel de host crítico é enumeração: o processo de detecção de quais periféricos estão conectados ao barramento, e consultando as propriedades expressas por meio de descritores.

Um periférico pode ser um objeto físico mas implementar várias funções lógicas. Por exemplo, um periférico de webcams pode ter função de câmera e função de áudio do microfone.

Cada função de periférico tem uma interface que define o protocolo para se comunicar com essa função.

O host se comunica com um periférico por um pipe a um endpoint, uma fonte ou coletor de dados fornecido por uma das funções do periférico.

Há dois tipos de pipes: message e stream. O pipe de mensagem é usado para controle e status bidirecional. O pipe de stream é usado para transferência de dados unidirecional.

O host inicia todas as transferências de dados, por isso, os termos input e output 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.

Há três modos principais de transferência de dados: interrupt, Bulk e isochronous. O modo isócrono será discutido em mais detalhes no contexto do áudio.

O periférico pode ter terminais que se conectam ao mundo externo, além do próprio periférico. Dessa forma, o periférico veicula converter entre o protocolo USB e o "mundo real" sinais 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 é Fastboot Android (link em inglês) ou Android Debug Bridge (adb): Os protocolos fastboot e adb são sobrepostos no modo de transferência de dados em massa por USB.

Modo host

O Modo host foi introduzido no Android 3.1 (API de nível 12).

O dispositivo Android precisa atuar como host, e a maioria dos dispositivos Android inclui um conector micro USB que não permita diretamente a operação do host, um adaptador para dispositivos móveis (OTG) assim geralmente é necessário:

OTG

Figura 1. Adaptador para dispositivos móveis (OTG)

Um dispositivo Android pode não fornecer energia suficiente para operar um um periférico específico, dependendo de quanta energia ele precisa, e quanto o dispositivo Android é capaz de fornecer. Mesmo que alimentação adequada está disponível, a carga da bateria do dispositivo Android pode pode ser significativamente encurtado. Para essas situações, use um hub, como:

Hub alimentado

Figura 2. Hub alimentado

Modo de acessório

O modo de acessório foi introduzido no Android 3.1 (API de nível 12) e passou por backport para o Android 2.3.4. Neste modo, o dispositivo Android opera como um periférico USB, está sob o controle de outro dispositivo, como uma base que sirva como host. A diferença entre o modo de desenvolvimento e o modo de acessório é que outras funções USB ficam visíveis para o host, além do adb. O dispositivo Android começa no modo de desenvolvimento e depois passa para o modo de acessório por um processo de renegociação.

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

Áudio USB

Classes de USB

Cada função de periférico tem um documento de classe de dispositivo associado. que especifica o protocolo padrão da função. Isso permite funções de periféricos e hosts em conformidade com a classe interoperem, sem conhecimento detalhado do trabalho uns dos outros. O compliance de classe é fundamental se o host e o periférico forem fornecidos pelo entidades diferentes.

O termo sem driver é um sinônimo comum de compliance de classe, indicando que é possível utilizar os recursos padrão de um sem precisar de uma instalação específica driver para instalar. Podemos presumir que um periférico anunciado como "não é necessário motorista" para os principais sistemas operacionais de desktop será 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, aderir à classe de dispositivo 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

O USB inclui muitas outras classes de dispositivos, e algumas delas podem ser confundidas com a classe de áudio. A classe de armazenamento em massa (MSC) é usado para acesso à mídia por setor, enquanto Protocolo de transferência de mídia (MTP) serve para acesso total a arquivos de mídia. Tanto o MSC quanto o MTP podem ser usados para transferir arquivos de áudio, mas somente 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 do host. O ADC é uma origem de dados. para o host. Da mesma forma, o host envia uma sinal de áudio digital por protocolo USB ao periférico, onde conversor digital para analógico DAC converte e apresenta para um terminal de saída analógico. O DAC é um coletor para o host.

Canais

Um periférico com função de áudio pode incluir um terminal de origem, um terminal do coletor ou ambos. Cada direção pode ter um canal (mono) e dois canais (estéreo) ou mais. Os periféricos com mais de dois canais são chamados de multicanais. É comum interpretar que uma transmissão estereoscópica consiste em canais esquerdo e direito e, por extensão, para interpretar uma transmissão multicanal localizações espaciais correspondentes a cada canal. No entanto, também é bastante apropriado (especialmente para áudio USB, HDMI) para não atribuir nenhuma significado espacial padrão de cada canal. Nesse caso, cabe ao aplicativo e usuário para definir como cada canal é usado. Por exemplo, um stream de entrada USB de quatro canais pode ter os três primeiros conectados a vários microfones em uma sala, e o vídeo que recebe entrada de um rádio AM.

Modo de transferência isócrona

O áudio USB usa o modo de transferência isócrona devido às características em tempo real, em detrimento da recuperação de erros. No modo isócrono, a largura de banda é garantida, e a transmissão de dados os erros são detectados com uma verificação cíclica de redundância (CRC). Mas existe sem confirmação ou retransmissão de pacotes em caso de erro.

As transmissões isócronas ocorrem a cada período de início do frame (SOF, na sigla em inglês). O período de SOF é de 1 milissegundo para velocidade máxima e 125 microssegundos para de alta velocidade. Cada frame em alta velocidade carrega até 1.023 bytes de payload, e um frame de alta velocidade carrega até 1.024 bytes. Juntando tudo isso, calculamos a taxa de transferência máxima em 1.023.000 ou 8.192.000 bytes por segundo. Isso define um limite máximo teórico para a combinação de áudio taxa de amostragem, contagem de canais e profundidade de bits. O limite prático é menor.

No modo isócrono, há três submodos:

  • Adaptativo
  • Assíncrono
  • Síncrona

No submodo adaptável, o coletor de periféricos ou a origem 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 a origem determina a taxa de amostragem e o host acomoda. A principal vantagem teórica do submodo assíncrono é que a fonte o relógio USB do coletor ou do coletor está fisicamente e elemente mais perto (e pode ser igual ou derivado do relógio que orienta o DAC ou ADC. Essa proximidade significa que o submodo assíncrono deve ser menos suscetível à instabilidade do relógio. Além disso, o relógio usado pelo DAC ou ADC pode ser projetado para maior precisão e deslocamentos menores do que o relógio do host.

No submodo síncrono, um número fixo de bytes é transferido a cada período de SOF. A taxa de amostragem de áudio é derivada do relógio USB. O submodo síncrono não é comumente usado com áudio porque ambos host e periférico ficam à mera do relógio USB.

A tabela abaixo resume os submodos isócronos:

Submodo Contagem de bytes
por pacote
Taxa de amostragem
determinada por
Usado para áudio
adaptativo variável anfitrião sim
assíncrona variável periférico sim
síncrono consertou Relógio USB não

Na prática, o submodo é importante, mas outros fatores também devem ser consideradas.

Suporte do Android para a classe de áudio USB

Modo de desenvolvimento

O áudio USB não é compatível no modo de desenvolvimento.

Modo host

O Android 5.0 (API de nível 21) e versões posteriores são compatíveis com um subconjunto de recursos de áudio USB de classe 1 (UAC1):

  • O dispositivo Android precisa atuar como host
  • O formato de áudio precisa ser PCM (interface tipo I)
  • A profundidade de bits deve ser de 16, 24 ou 32 bits, em que 24 bits de dados de áudio úteis são justificados à esquerda dentro dos valores bits da palavra de 32 bits
  • A taxa de amostragem precisa ser 48, 44,1, 32, 24, 22,05, 16, 12, 11,025 ou 8 kHz
  • A contagem de canais precisa ser 1 (mono) ou 2 (estéreo)

Uma parte do código-fonte do framework do Android pode mostrar códigos adicionais além do mínimo necessário para oferecer suporte a esses recursos. Mas este código não foi validado, por isso recursos mais avançados ainda não foram reivindicados.

Modo de acessório

O Android 4.1 (API de nível 16) adicionou suporte limitado para reprodução de áudio no host. Nesse modo, o Android encaminha automaticamente a saída de áudio para USB. Ou seja, o dispositivo Android serve como uma fonte de dados para o host, por exemplo, uma base.

O áudio no modo acessório tem estes recursos:

  • O dispositivo Android precisa ser controlado por um host experiente que pode fazer a transição do dispositivo Android do modo de desenvolvimento para o modo de acessório, e depois transferir os dados de áudio do endpoint apropriado. Assim, o dispositivo Android não parece "sem driver" ao host.
  • A direção precisa ser input, expressa em relação ao host
  • O formato de áudio precisa ser PCM de 16 bits
  • A taxa de amostragem precisa ser de 44,1 kHz
  • A contagem de canais precisa ser 2 (estéreo)

O áudio no modo acessório não foi amplamente adotado, e não é recomendado para novos designs.

Aplicativos de áudio digital USB

Como o nome indica, o sinal de áudio digital USB é representado por um fluxo de dados digital e não analógico usado pelo padrão comum de TRS mini conector de fone de ouvido. Eventualmente, qualquer sinal digital precisa ser convertido em analógico antes de ser ouvido. Há vantagens e desvantagens em escolher onde colocar essa conversão.

Uma história sobre dois DACs

No diagrama de exemplo abaixo, comparamos dois designs. Primeiro, temos um dispositivo móvel com processador de aplicativo (AP), DAC integrado, amplificador, e o conector TRS analógico nos fones de ouvido. Também consideramos uma dispositivo móvel com USB conectado a um DAC e a um amplificador USB externos, também com fones de ouvido.

Comparação de DACs

Figura 3. Comparação de dois DACs

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

Observação:essa é uma comparação artificial, já que um dispositivo Android real provavelmente teria as duas opções disponíveis.

O primeiro design A é mais simples, mais barato, usa menos energia, e ter um design mais confiável quando há componentes igualmente confiáveis. No entanto, geralmente há vantagens e desvantagens relacionadas à qualidade do áudio em relação a outros requisitos. Por exemplo, se for um dispositivo de venda de massa, ele pode ser projetado para caber às necessidades do consumidor em geral, 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 de ao mercado em massa básico do dispositivo Android B. Sim, é um design mais caro, mas o custo só é absorvido por quem o quer.

Dispositivos móveis costumam ter densidade alta placas de circuito, o que pode resultar em mais oportunidades crosstalk (em inglês) que degrada sinais analógicos adjacentes. A comunicação digital é menos suscetível a ruído, mover o DAC do dispositivo Android A para uma placa de circuito externa C permite que os estágios analógicos finais sejam fisicamente e elétricos isolados da placa de circuito densa e com ruído, o que resulta em um áudio de maior fidelidade.

Por outro lado, o segundo é mais complexo e, com mais complexidade, vêm mais oportunidades para que as coisas falhem. Também há latência adicional dos controladores USB.

Aplicativos do modo host

Os aplicativos de áudio comuns no modo host USB incluem:

  • ouvir música
  • telefonia
  • mensagens instantâneas e bate-papo por voz
  • gravando

Para todos esses aplicativos, o Android detecta um conector USB e roteia automaticamente a reprodução e a 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 existem 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" do Configurações / Opções do desenvolvedor.

Depurar no modo host

No modo host USB, a depuração do adb por USB não está disponível. Consulte a seção Uso de redes sem fio. de Android Debug Bridge como 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:

  • projetar para conformidade de classe de áudio; no momento, o Android é direcionado à classe 1, mas é aconselhável planejar para a classe 2
  • evitar curiosidades
  • testar a interoperabilidade com referências e dispositivos Android populares
  • documentar claramente os recursos compatíveis, a conformidade com a classe de áudio, os requisitos de energia etc. para que os consumidores possam tomar decisões informadas

Recomendações para OEMs e fornecedores de SoC de dispositivos Android

Para oferecer suporte ao áudio digital USB, os OEMs de dispositivos e fornecedores de SoC precisam:

  • hardware projetado para oferecer suporte ao modo host USB
  • ativar o suporte a host USB genérico no nível do framework pela flag de recurso android.hardware.usb.host.xml
  • ativar 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
  • manter-se atualizado com os últimos lançamentos e patches do kernel; apesar do objetivo nobre de conformidade de classe, existem periféricos de áudio existentes com quirks, e os kernels recentes têm alternativas para essas peculiaridades
  • ative a política de áudio USB conforme descrito abaixo
  • Adição de audio.usb.default a PRODUCT_PACKAGES em device.mk
  • teste de interoperabilidade com periféricos de áudio USB comuns

Ativar a política de áudio USB

Para ativar o áudio USB, adicione uma entrada ao do arquivo de configuração da política de áudio. Isso normalmente ocorre localizado aqui:

device/oem/codename/audio_policy.conf

O componente do nome do caminho "oem" deve ser substituída pelo nome do OEM que fabrica o dispositivo Android, e "codename" deve ser substituído pelo codinome do dispositivo.

Confira um exemplo de entrada:

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

Camada de abstração de hardware (HAL) de áudio implementação de áudio USB pode ser encontrada aqui:

hardware/libhardware/modules/usbaudio/

A HAL de áudio USB depende muito tinyalsa, descrita em Terminologia de áudio. O áudio USB depende de transferências isócronas, isso é abstraído pela implementação da ALSA. Portanto, a HAL de áudio USB e a tinyalsa não precisam se preocupar com essa parte do protocolo USB.

Testar áudio USB

Para informações sobre testes CTS para áudio USB, consulte Testes do verificador CTS de áudio USB.