Audio digitale USB

Questo articolo esamina il supporto Android per l'audio digitale USB e i relativi protocolli basati su USB.

Pubblico

Il pubblico di destinazione di questo articolo è costituito da OEM di dispositivi Android, fornitori di SoC, fornitori di periferiche audio USB, sviluppatori di applicazioni audio avanzate e altri che cercano una comprensione dettagliata degli interni audio digitali USB su Android.

Gli utenti finali dei dispositivi Nexus dovrebbero invece consultare l'articolo Registrare e riprodurre l'audio utilizzando la modalità host USB nel Centro assistenza Nexus . Sebbene questo articolo non sia rivolto agli utenti finali, alcuni consumatori audiofili potrebbero trovare parti di interesse.

Panoramica dell'USB

L'Universal Serial Bus (USB) è descritto in modo informale nell'articolo USB di Wikipedia ed è definito formalmente dagli standard pubblicati dall'USB Implementers Forum, Inc. Per comodità, riassumiamo qui i concetti chiave dell'USB, ma gli standard sono il riferimento autorevole.

Concetti di base e terminologia

USB è un bus con un unico iniziatore delle operazioni di trasferimento dei dati, chiamato host . L'host comunica con le periferiche tramite il bus.

Nota: i termini dispositivo e accessorio sono sinonimi comuni di periferica . Evitiamo questi termini qui, in quanto potrebbero essere confusi con il dispositivo Android o il concetto specifico di Android chiamato modalità accessorio .

Un ruolo critico dell'host è l' enumerazione : il processo di rilevamento di quali periferiche sono connesse al bus e l'interrogazione delle loro proprietà espresse tramite i descrittori .

Una periferica può essere un oggetto fisico ma in realtà implementa più funzioni logiche. Ad esempio, una periferica webcam potrebbe avere sia una funzione fotocamera che una funzione audio microfono.

Ogni funzione periferica ha un'interfaccia che definisce il protocollo per comunicare con quella funzione.

L'host comunica con una periferica tramite una pipe verso un endpoint , un'origine dati o un sink fornito da una delle funzioni della periferica.

Esistono due tipi di pipe: message e stream . Una pipe di messaggi viene utilizzata per il controllo e lo stato bidirezionali. Una stream pipe viene utilizzata per il trasferimento dati unidirezionale.

L'host avvia tutti i trasferimenti di dati, quindi i termini input e output sono espressi in relazione all'host. Un'operazione di input trasferisce i dati dalla periferica all'host, mentre un'operazione di output trasferisce i dati dall'host alla periferica.

Esistono tre principali modalità di trasferimento dati: interrupt , bulk e isochronous . La modalità isocrona verrà discussa ulteriormente nel contesto dell'audio.

La periferica può avere terminali che si collegano al mondo esterno, al di là della periferica stessa. In questo modo, la periferica serve a tradurre tra protocollo USB e segnali del "mondo reale". I terminali sono oggetti logici della funzione.

Modalità USB Android

Modalità di sviluppo

La modalità di sviluppo è presente sin dal rilascio iniziale di Android. Il dispositivo Android appare come una periferica USB su un PC host che esegue un sistema operativo desktop come Linux, Mac OS X o Windows. L'unica funzione periferica visibile è Android fastboot o Android Debug Bridge (adb) . I protocolli fastboot e adb sono sovrapposti alla modalità di trasferimento dati bulk USB.

Modalità ospite

La modalità host è stata introdotta in Android 3.1 (livello API 12).

Poiché il dispositivo Android deve fungere da host e la maggior parte dei dispositivi Android include un connettore micro-USB che non consente direttamente il funzionamento dell'host, di solito è necessario un adattatore on-the-go ( OTG ) come questo:

OTG

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

Un dispositivo Android potrebbe non fornire energia sufficiente per far funzionare una particolare periferica, a seconda della quantità di energia richiesta dalla periferica e di quanto il dispositivo Android è in grado di fornire. Anche se è disponibile un'alimentazione adeguata, la carica della batteria del dispositivo Android potrebbe essere notevolmente ridotta. Per queste situazioni, utilizzare un hub alimentato come questo:

Mozzo alimentato

Figura 2. Hub alimentato

Modalità accessori

La modalità accessorio è stata introdotta in Android 3.1 (livello API 12) e trasferita su Android 2.3.4. In questa modalità, il dispositivo Android funziona come una periferica USB, sotto il controllo di un altro dispositivo come un dock che funge da host. La differenza tra la modalità di sviluppo e la modalità accessoria è che le funzioni USB aggiuntive sono visibili all'host, oltre ad adb. Il dispositivo Android inizia in modalità di sviluppo e quindi passa alla modalità accessori tramite un processo di rinegoziazione.

La modalità accessori è stata estesa con funzionalità aggiuntive in Android 4.1, in particolare l'audio descritto di seguito.

Audio USB

Classi USB

Ogni funzione periferica ha un documento di classe di dispositivo associato che specifica il protocollo standard per quella funzione. Ciò consente a host conformi alla classe e alle funzioni periferiche di interagire, senza una conoscenza dettagliata del funzionamento reciproco. La conformità della classe è fondamentale se l'host e la periferica sono forniti da entità diverse.

Il termine driverless è un sinonimo comune di class compliant , che indica che è possibile utilizzare le funzionalità standard di tale periferica senza richiedere l'installazione di un driver specifico del sistema operativo. Si può presumere che una periferica pubblicizzata come "nessun driver necessario" per i principali sistemi operativi desktop sarà conforme alla classe, sebbene possano esserci delle eccezioni.

Classe audio USB

Qui ci occupiamo solo di periferiche che implementano funzioni audio e quindi aderiscono alla classe dei dispositivi audio. Esistono due edizioni della specifica della classe audio USB: classe 1 (UAC1) e 2 (UAC2).

Confronto con altre classi

USB include molte altre classi di dispositivi, alcune delle quali possono essere confuse con la classe audio. La classe di archiviazione di massa (MSC) viene utilizzata per l'accesso ai media orientato al settore, mentre il protocollo MTP ( Media Transfer Protocol ) serve per l'accesso completo ai file. Sia MSC che MTP possono essere utilizzati per il trasferimento di file audio, ma solo la classe audio USB è adatta per lo streaming in tempo reale.

Terminali audio

I terminali di una periferica audio sono tipicamente analogici. Il segnale analogico presentato al terminale di ingresso della periferica viene convertito in digitale da un convertitore analogico-digitale (ADC) e trasferito tramite protocollo USB per essere consumato dall'host. L'ADC è un'origine dati per l'host. Allo stesso modo, l'host invia un segnale audio digitale tramite protocollo USB alla periferica, dove un convertitore digitale-analogico (DAC) converte e presenta a un terminale di uscita analogico. Il DAC è un dissipatore per l'host.

Canali

Una periferica con funzione audio può includere un terminale sorgente, un terminale sink o entrambi. Ogni direzione può avere un canale ( mono ), due canali ( stereo ) o più. Le periferiche con più di due canali sono chiamate multicanale . È comune interpretare un flusso stereo come costituito da canali sinistro e destro e, per estensione, interpretare un flusso multicanale come avente posizioni spaziali corrispondenti a ciascun canale. Tuttavia, è anche abbastanza appropriato (soprattutto per l'audio USB più che HDMI ) non assegnare alcun particolare significato spaziale standard a ciascun canale. In questo caso, spetta all'applicazione e all'utente definire come viene utilizzato ciascun canale. Ad esempio, un flusso di input USB a quattro canali potrebbe avere i primi tre canali collegati a vari microfoni all'interno di una stanza e il canale finale che riceve input da una radio AM.

Modalità di trasferimento isocrono

L'audio USB utilizza la modalità di trasferimento isocrono per le sue caratteristiche in tempo reale, a scapito del ripristino degli errori. In modalità isocrona, la larghezza di banda è garantita e gli errori di trasmissione dei dati vengono rilevati mediante un controllo di ridondanza ciclico (CRC). Ma non c'è riconoscimento del pacchetto o ritrasmissione in caso di errore.

Le trasmissioni isocrone si verificano ogni periodo SOF (Start Of Frame). Il periodo SOF è di un millisecondo per la massima velocità e di 125 microsecondi per l'alta velocità. Ogni frame a piena velocità trasporta fino a 1023 byte di payload e un frame ad alta velocità trasporta fino a 1024 byte. Mettendoli insieme, calcoliamo la velocità di trasferimento massima di 1.023.000 o 8.192.000 byte al secondo. Ciò imposta un limite massimo teorico per la frequenza di campionamento audio combinata, il numero di canali e la profondità di bit. Il limite pratico è inferiore.

All'interno della modalità isocrona, ci sono tre sotto-modalità:

  • Adattivo
  • Asincrono
  • Sincrono

Nella sottomodalità adattiva, il sink o la sorgente periferica si adatta a una frequenza di campionamento potenzialmente variabile dell'host.

Nella sottomodalità asincrona (chiamata anche feedback implicito), il sink o la sorgente determina la frequenza di campionamento e l'host si adatta. Il principale vantaggio teorico della modalità secondaria asincrona è che il clock USB sorgente o sink è fisicamente ed elettricamente più vicino (e in effetti può essere lo stesso o derivato da) il clock che guida il DAC o l'ADC. Questa vicinanza significa che la sottomodalità asincrona dovrebbe essere meno suscettibile al jitter del clock. Inoltre, il clock utilizzato dal DAC o dall'ADC può essere progettato per una maggiore precisione e una deriva inferiore rispetto al clock dell'host.

Nella sottomodalità sincrona, viene trasferito un numero fisso di byte per ogni periodo SOF. La frequenza di campionamento audio è effettivamente derivata dall'orologio USB. La modalità secondaria sincrona non è comunemente utilizzata con l'audio perché sia ​​l'host che la periferica sono in balia dell'orologio USB.

La tabella seguente riassume le sottomodalità isocrone:

Sottomodalità Conteggio byte
per pacchetto
Frequenza di campionamento
determinato da
Utilizzato per l'audio
adattivo variabile ospite
asincrono variabile periferica
sincrono fisso Orologio USB No

In pratica, la sottomodalità è ovviamente importante, ma dovrebbero essere considerati anche altri fattori.

Supporto Android per la classe audio USB

Modalità di sviluppo

L'audio USB non è supportato in modalità di sviluppo.

Modalità host

Android 5.0 (livello API 21) e versioni successive supportano un sottoinsieme di funzionalità audio USB di classe 1 (UAC1):

  • Il dispositivo Android deve fungere da host
  • Il formato audio deve essere PCM (interfaccia di tipo I)
  • La profondità di bit deve essere di 16 bit, 24 bit o 32 bit in cui 24 bit di dati audio utili sono giustificati a sinistra all'interno dei bit più significativi della parola a 32 bit
  • La frequenza di campionamento deve essere 48, 44,1, 32, 24, 22,05, 16, 12, 11,025 o 8 kHz
  • Il numero di canali deve essere 1 (mono) o 2 (stereo)

L'esame del codice sorgente del framework Android potrebbe mostrare codice aggiuntivo oltre il minimo necessario per supportare queste funzionalità. Ma questo codice non è stato convalidato, quindi le funzionalità più avanzate non sono ancora state rivendicate.

Modalità accessori

Android 4.1 (livello API 16) ha aggiunto un supporto limitato per la riproduzione audio all'host. In modalità accessori, Android instrada automaticamente la sua uscita audio su USB. Cioè, il dispositivo Android funge da origine dati per l'host, ad esempio un dock.

L'audio in modalità accessori ha queste caratteristiche:

  • Il dispositivo Android deve essere controllato da un host esperto che può prima trasferire il dispositivo Android dalla modalità di sviluppo alla modalità accessoria, quindi l'host deve trasferire i dati audio dall'endpoint appropriato. Pertanto il dispositivo Android non appare "senza conducente" all'host.
  • La direzione deve essere inserita , espressa rispetto all'host
  • Il formato audio deve essere PCM a 16 bit
  • La frequenza di campionamento deve essere di 44,1 kHz
  • Il numero di canali deve essere 2 (stereo)

L'audio in modalità accessoria non è stato ampiamente adottato e attualmente non è consigliato per i nuovi progetti.

Applicazioni dell'audio digitale USB

Come indica il nome, il segnale audio digitale USB è rappresentato da un flusso di dati digitali piuttosto che dal segnale analogico utilizzato dal comune mini connettore per cuffie TRS. Alla fine qualsiasi segnale digitale deve essere convertito in analogico prima che possa essere ascoltato. Ci sono dei compromessi nella scelta di dove posizionare quella conversione.

La storia di due DAC

Nel diagramma di esempio qui sotto, confrontiamo due design. Innanzitutto abbiamo un dispositivo mobile con Application Processor (AP), DAC integrato, amplificatore e connettore TRS analogico collegato alle cuffie. Consideriamo anche un dispositivo mobile con USB collegato a DAC USB esterno e amplificatore, anche con cuffie.

Confronto DAC

Figura 3. Confronto di due DAC

Quale disegno è migliore? La risposta dipende dalle tue esigenze. Ognuno ha vantaggi e svantaggi.

Nota: questo è un confronto artificiale, poiché un vero dispositivo Android avrebbe probabilmente entrambe le opzioni disponibili.

Il primo progetto A è più semplice, meno costoso, utilizza meno energia e sarà un progetto più affidabile assumendo componenti altrimenti ugualmente affidabili. Tuttavia, di solito ci sono compromessi sulla qualità audio rispetto ad altri requisiti. Ad esempio, se si tratta di un dispositivo per il mercato di massa, potrebbe essere progettato per soddisfare le esigenze del consumatore generale, non per l'audiofilo.

Nel secondo design, la periferica audio esterna C può essere progettata per una qualità audio superiore e una maggiore potenza in uscita senza influire sul costo del dispositivo Android B di base del mercato di massa. Sì, è un design più costoso, ma il costo viene assorbito solo da quelli che lo vogliono.

I dispositivi mobili sono noti per avere circuiti stampati ad alta densità, che possono comportare maggiori opportunità di diafonia che degrada i segnali analogici adiacenti. La comunicazione digitale è meno suscettibile al rumore , quindi lo spostamento del DAC dal dispositivo Android A a un circuito stampato esterno C consente agli stadi analogici finali di essere isolati fisicamente ed elettricamente dal circuito stampato denso e rumoroso, con conseguente audio ad alta fedeltà.

D'altra parte, il secondo progetto è più complesso, e con l'aggiunta di complessità ci sono maggiori possibilità che le cose falliscano. C'è anche una latenza aggiuntiva dai controller USB.

Applicazioni in modalità host

Le tipiche applicazioni audio in modalità host USB includono:

  • ascolto di musica
  • telefonia
  • messaggistica istantanea e chat vocale
  • registrazione

Per tutte queste applicazioni, Android rileva una periferica audio digitale USB compatibile e indirizza automaticamente la riproduzione audio e l'acquisizione in modo appropriato, in base alle regole dei criteri audio. Il contenuto stereo viene riprodotto sui primi due canali della periferica.

Non ci sono API specifiche per l'audio digitale USB. Per un utilizzo avanzato, il routing automatico potrebbe interferire con le applicazioni compatibili con USB. Per tali applicazioni, disabilita il routing automatico tramite il controllo corrispondente nella sezione Media di Impostazioni / Opzioni sviluppatore .

Debug in modalità host

In modalità host USB, il debug adb tramite USB non è disponibile. Vedere la sezione Utilizzo wireless di Android Debug Bridge per un'alternativa.

Implementazione dell'audio USB

Raccomandazioni per i fornitori di periferiche audio

Per interagire con i dispositivi Android, i fornitori di periferiche audio devono:

  • progettazione per la conformità alla classe audio; attualmente Android si rivolge alla classe 1, ma è consigliabile pianificare la classe 2
  • evitare stranezze
  • test per l'interoperabilità con dispositivi Android di riferimento e diffusi
  • documentare chiaramente le funzionalità supportate, la conformità alla classe audio, i requisiti di alimentazione, ecc. in modo che i consumatori possano prendere decisioni informate

Raccomandazioni per OEM di dispositivi Android e fornitori di SoC

Per supportare l'audio digitale USB, gli OEM di dispositivi e i fornitori di SoC devono:

  • progettare hardware per supportare la modalità host USB
  • abilitare il supporto host USB generico a livello di framework tramite il flag di funzionalità android.hardware.usb.host.xml
  • abilitare tutte le funzionalità del kernel necessarie: modalità host USB, audio USB, modalità di trasferimento isocrono; vedere Configurazione del kernel Android
  • tenersi aggiornati con i recenti rilasci e patch del kernel; nonostante il nobile obiettivo della conformità di classe, ci sono periferiche audio esistenti con stranezze e i kernel recenti hanno soluzioni alternative per tali stranezze
  • abilitare il criterio audio USB come descritto di seguito
  • aggiungi audio.usb.default a PRODUCT_PACKAGES in device.mk
  • test per l'interoperabilità con periferiche audio USB comuni

Come abilitare la politica audio USB

Per abilitare l'audio USB, aggiungi una voce al file di configurazione dei criteri audio. Solitamente si trova qui:

device/oem/codename/audio_policy.conf

Il componente del percorso "oem" deve essere sostituito dal nome dell'OEM che produce il dispositivo Android e "nome in codice" deve essere sostituito dal nome in codice del dispositivo.

Una voce di esempio è mostrata qui:

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

Codice sorgente

L'implementazione audio HAL (Hardware Abstraction Layer) per l'audio USB si trova qui:

hardware/libhardware/modules/usbaudio/

L'HAL audio USB fa molto affidamento su tinyalsa , descritto in Audio terminology . Sebbene l'audio USB si basi su trasferimenti isocroni, questo viene sottratto dall'implementazione ALSA. Quindi l'HAL audio USB e tinyalsa non devono occuparsi di questa parte del protocollo USB.

Test dell'audio USB

Per informazioni sui test CTS per l'audio USB, vedere Test del verificatore CTS audio USB .