Audio digitale USB

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

Pubblico

Il pubblico a cui è rivolto questo articolo sono gli OEM di dispositivi Android, i fornitori di SoC, i fornitori di periferiche audio USB, gli sviluppatori di applicazioni audio avanzate e altri che cercano una comprensione dettagliata degli interni dell'audio digitale 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

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 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 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, poiché potrebbero essere confusi con il dispositivo Android o con il concetto specifico di Android chiamato modalità accessorio .

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

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

Ciascuna funzione periferica dispone di un'interfaccia che definisce il protocollo per comunicare con tale 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. Per il trasferimento dati unidirezionale viene utilizzata una stream pipe.

L'host avvia tutti i trasferimenti di dati, quindi i termini input e output sono espressi rispetto 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 isocrono . La modalità isocrona verrà 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 il protocollo USB e i segnali del "mondo reale". I terminali sono oggetti logici della funzione.

Modalità USB Android

Modalità di sviluppo

La modalità di sviluppo è presente sin dalla versione iniziale di Android. Il dispositivo Android viene visualizzato come 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 di massa 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 OTG (on-the-go).

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

Hub alimentato

Figura 2. Hub alimentato

Modalità accessoria

La modalità accessoria è stata introdotta in Android 3.1 (livello API 12) ed è stata trasferita su Android 2.3.4. In questa modalità, il dispositivo Android funziona come 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à di sviluppo e poi 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

Lezioni USB

A ciascuna funzione periferica è associato un documento di classe del dispositivo 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 driverless è un sinonimo comune di conforme alla classe , indicando 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 sia conforme alla classe, sebbene possano esserci delle eccezioni.

Classe audio USB

Qui ci occupiamo solo delle periferiche che implementano funzioni audio e quindi rientrano nella 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 potrebbero 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 Media Transfer Protocol (MTP) serve per l'accesso completo ai file ai media. Sia MSC che MTP possono essere utilizzati per trasferire 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 trasportato tramite il protocollo USB per essere utilizzato 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) lo converte e lo 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 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 per l'HDMI ) non assegnare alcun particolare significato spaziale standard 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. Nella 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 o ritrasmissione del pacchetto in caso di errore.

Le trasmissioni isocrone si verificano in ciascun periodo di inizio frame (SOF). Il periodo SOF è di un millisecondo per la massima velocità e di 125 microsecondi per l'alta velocità. Ciascun frame a piena velocità trasporta fino a 1023 byte di carico utile e un frame ad alta velocità trasporta fino a 1024 byte. Mettendo insieme questi dati, calcoliamo la velocità di trasferimento massima pari a 1.023.000 o 8.192.000 byte al secondo. Ciò imposta un limite superiore teorico sulla frequenza di campionamento audio combinata, sul conteggio dei canali e sulla profondità di bit. Il limite pratico è inferiore.

Nella modalità isocrona esistono tre sottomodalità:

  • 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 (detta anche feedback implicito), il sink o la sorgente determinano la frequenza di campionamento e l'host la adatta. Il principale vantaggio teorico della sottomodalità asincrona è che l'orologio USB sorgente o dissipatore è fisicamente ed elettricamente più vicino (e in effetti potrebbe essere lo stesso o derivato da) l'orologio che pilota 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 host.

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

La tabella seguente riassume le sottomodalità isocrone:

Sottomodalità Conteggio dei 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 ha importanza, 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à ospite

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 tipo I)
  • La profondità in bit deve essere 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 conteggio dei 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à accessoria

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

L'audio in modalità accessori presenta le seguenti funzionalità:

  • Il dispositivo Android deve essere controllato da un host esperto che possa prima far passare il dispositivo Android dalla modalità di sviluppo alla modalità accessorio, 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 immessa , 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à accessori 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 mini auricolare TRS. Alla fine qualsiasi segnale digitale deve essere convertito in analogico prima di poter essere ascoltato. Ci sono dei compromessi nella scelta di dove posizionare la conversione.

Una storia di due DAC

Nel diagramma di esempio seguente, confrontiamo due progetti. Innanzitutto abbiamo un dispositivo mobile con processore applicativo (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 tra due DAC

Quale disegno è migliore? La risposta dipende dalle tue esigenze. Ognuno presenta 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 presupponendo componenti altrimenti altrettanto affidabili. Tuttavia, di solito ci sono dei compromessi sulla qualità audio rispetto ad altri requisiti. Ad esempio, se si tratta di un dispositivo destinato al mercato di massa, potrebbe essere progettato per soddisfare le esigenze del consumatore generale, non dell'audiofilo.

Nel secondo progetto, la periferica audio esterna C può essere progettata per una qualità audio più elevata e una maggiore potenza in uscita senza incidere sul costo del dispositivo Android B di base del mercato di massa. Sì, è un progetto 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 una scheda di circuito esterna C consente agli stadi analogici finali di essere fisicamente ed elettricamente isolati dalla scheda di circuito densa e rumorosa, con conseguente audio di maggiore fedeltà.

D’altro canto, il secondo progetto è più complesso e, con l’aggiunta della complessità, aumentano le 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 della 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 della policy audio. Il contenuto stereo viene riprodotto sui primi due canali della periferica.

Non esistono 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, disattivare il routing automatico tramite il controllo corrispondente nella sezione Media di Impostazioni/Opzioni sviluppatore .

Eseguire il debug in modalità host

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

Implementa l'audio USB

Raccomandazioni per i fornitori di periferiche audio

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

  • progettazione per la conformità alla classe audio; attualmente Android punta alla classe 1, ma è saggio pianificare la classe 2
  • evitare stranezze
  • testare 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 gli OEM di dispositivi Android e i fornitori di SoC

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

  • progettare l'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
  • mantenersi aggiornati con le versioni e le patch recenti del kernel; nonostante il nobile obiettivo della conformità alla classe, esistono periferiche audio esistenti con peculiarità e i kernel recenti hanno soluzioni alternative per tali peculiarità
  • abilitare la politica audio USB come descritto di seguito
  • aggiungi audio.usb.default a PRODUCT_PACKAGES in device.mk
  • test di interoperabilità con le comuni periferiche audio USB

Abilita criterio audio USB

Per abilitare l'audio USB, aggiungi una voce al file di configurazione della politica 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 Terminologia audio . Sebbene l'audio USB si basi su trasferimenti isocroni, questo viene eliminato dall'implementazione ALSA. Pertanto l'HAL audio USB e tinyalsa non devono preoccuparsi di questa parte del protocollo USB.

Prova l'audio USB

Per informazioni sui test CTS per l'audio USB, consulta Test di verifica CTS audio USB .