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 sono 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 audio utilizzando la modalità host USB nel Centro assistenza Nexus . Sebbene questo articolo non sia orientato agli utenti finali, alcuni consumatori audiofili potrebbero trovare parti di interesse.

Panoramica dell'USB

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

Concetti di base e terminologia

USB è un bus con un unico iniziatore delle operazioni di trasferimento 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 collegate al bus e interrogazione delle loro proprietà espresse tramite descrittori .

Una periferica può essere un oggetto fisico ma implementa effettivamente più funzioni logiche. Ad esempio, una periferica della webcam potrebbe avere sia una funzione fotocamera che una funzione audio del 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 a un endpoint , un'origine dati o un sink fornito da una delle funzioni della periferica.

Esistono due tipi di pipe: messaggio e flusso . Una pipe di messaggio viene utilizzata per il controllo e lo stato bidirezionali. Un tubo di flusso viene utilizzato per il trasferimento di 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.

Sono disponibili tre principali modalità di trasferimento dati: interrupt , bulk e isocrono . La modalità isocrona sarà discussa ulteriormente nel contesto dell'audio.

La periferica può avere terminali che si collegano al mondo esterno, oltre la 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 stratificati sulla modalità di trasferimento dati in blocco USB.

Modalità host

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 è richiesto un adattatore on-the-go ( OTG ) come questo:

OTG

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

Un dispositivo Android potrebbe non fornire potenza sufficiente per far funzionare una particolare periferica, a seconda di quanta potenza ha bisogno la periferica e di quanta è in grado di fornire il dispositivo Android. Anche se è disponibile una potenza adeguata, la carica della batteria del dispositivo Android potrebbe essere notevolmente ridotta. Per queste situazioni, utilizzare un hub alimentato come questo:

Hub alimentato

Figura 2. Hub alimentato

Modalità accessori

La modalità accessori è 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 adb. Il dispositivo Android inizia in modalità sviluppo e quindi passa alla modalità accessorio 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 agli host conformi alla classe e alle funzioni periferiche di interagire, senza una conoscenza dettagliata del funzionamento reciproco. La conformità alla classe è fondamentale se l'host e la periferica sono forniti da entità diverse.

Il termine senza driver è un sinonimo comune di conforme alla classe , a indicare che è possibile utilizzare le funzionalità standard di una periferica di questo tipo 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 potrebbero esserci delle eccezioni.

Classe audio USB

Qui ci occupiamo solo di periferiche che implementano funzioni audio e quindi aderiscono alla classe dei dispositivi audio. Sono disponibili 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 orientato al settore al supporto, mentre il protocollo MTP ( Media Transfer Protocol ) è per l'accesso completo ai file al supporto. 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 viene trasferito tramite il protocollo USB per essere consumato dall'host. L'ADC è una fonte di 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 sink per l'host.

Canali

Una periferica con funzione audio può includere un terminale sorgente, un terminale sink o entrambi. Ciascuna 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 composto da canali sinistro e destro e, per estensione, interpretare un flusso multicanale come avente posizioni spaziali corrispondenti a ciascun canale. Tuttavia, è anche abbastanza appropriato (specialmente per l'audio USB più che HDMI ) non assegnare alcun significato spaziale standard particolare a ciascun canale. In questo caso, spetta all'applicazione e all'utente definire la modalità di utilizzo di ciascun canale. Ad esempio, un flusso di ingresso 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 l'ingresso 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 isocrono si verificano in ogni periodo SOF (Start Of Frame). Il periodo SOF è di un millisecondo per la massima velocità e 125 microsecondi per l'alta velocità. Ogni frame ad alta 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 come 1.023.000 o 8.192.000 byte al secondo. Questo imposta un limite superiore teorico per la frequenza di campionamento audio combinata, il conteggio dei canali e la profondità di bit. Il limite pratico è inferiore.

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

  • Adaptive
  • 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 vantaggio teorico principale della sottomodalità 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 prossimità significa che la sottomodalità asincrona dovrebbe essere meno suscettibile al jitter del clock. Inoltre, l'orologio utilizzato dal DAC o dall'ADC può essere progettato per una maggiore precisione e una deriva inferiore rispetto all'orologio host.

Nella sottomodalità sincrona, un numero fisso di byte viene trasferito a ogni periodo SOF. La frequenza di campionamento audio è effettivamente derivata dal clock USB. La modalità secondaria sincrona non è comunemente utilizzata con l'audio perché sia ​​l'host che la periferica sono alla mercé del clock USB.

La tabella seguente riassume i sottomodalità isocrona:

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 è necessario considerare 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à di classe audio USB 1 (UAC1):

  • Il dispositivo Android deve fungere da host
  • Il formato audio deve essere PCM (tipo di interfaccia I)
  • La profondità di bit deve essere di 16 bit, 24 bit o 32 bit dove 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)

La lettura del codice sorgente del framework Android può 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à accessorio, 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 possa 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 driver" 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 44,1 kHz
  • Il numero di canali deve essere 2 (stereo)

L'audio in modalità accessorio 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 anziché dal segnale analogico utilizzato dal comune connettore per mini auricolari TRS. Alla fine, qualsiasi segnale digitale deve essere convertito in analogico prima di poter essere ascoltato. Ci sono dei compromessi nello scegliere dove collocare quella conversione.

Una storia di due DAC

Nel diagramma di esempio seguente, confrontiamo due design. Per prima cosa 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 design è migliore? La risposta dipende dalle tue esigenze. Ognuno ha vantaggi e svantaggi.

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

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

Nel secondo progetto, 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 di base del mercato di massa B. 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à, il che può comportare maggiori opportunità di diafonia che degrada i segnali analogici adiacenti. La comunicazione digitale è meno suscettibile al rumore , quindi spostare il DAC dal dispositivo Android A a un circuito stampato esterno C consente di isolare fisicamente ed elettricamente gli stadi analogici finali dal circuito denso e rumoroso, con conseguente maggiore fedeltà audio.

D'altra parte, il secondo progetto è più complesso e con l'aggiunta di complessità arrivano maggiori opportunità di fallimento. 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 instrada automaticamente la riproduzione e l'acquisizione dell'audio 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 che supportano USB. Per tali applicazioni, disabilitare il routing automatico tramite il controllo corrispondente nella sezione Media di Impostazioni / Opzioni sviluppatore .

Debug in modalità host

In modalità host USB, il debug di adb su 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 dovrebbero:

  • 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 i dispositivi Android di riferimento e più 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 dovrebbero:

  • progettare hardware per supportare la modalità host USB
  • abilitare il supporto host USB generico a livello di framework tramite il flag della funzione 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 le recenti versioni e patch del kernel; nonostante il nobile obiettivo della conformità alla classe, ci sono periferiche audio esistenti con stranezze e 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 le comuni periferiche audio USB

Come abilitare la politica audio USB

Per abilitare l'audio USB, aggiungere una voce al file di configurazione dei criteri audio. Normalmente 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.

Di seguito viene mostrata una voce di esempio:

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 HAL (Hardware Abstraction Layer) audio per l'audio USB si trova qui:

hardware/libhardware/modules/usbaudio/

L'HAL audio USB si basa molto su tinyalsa , descritto in Audio Terminology . Sebbene l'audio USB si basi su trasferimenti isocroni, questo viene astratto dall'implementazione ALSA. Quindi l'audio USB HAL e tinyalsa non devono preoccuparsi 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 .