Audio digitale USB

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

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 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 di USB

Universal Serial Bus (USB) è descritto in modo informale nell'articolo di Wikipedia USB ed è formalmente definito 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, poiché 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 di interrogazione delle loro proprietà espresse tramite 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.

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 a un endpoint , un'origine dati o un sink fornito da una delle funzioni della periferica.

Esistono due tipi di pipe: message e stream . Una message pipe viene utilizzata per il controllo e lo stato bidirezionali. Un tubo di flusso viene utilizzato per il trasferimento unidirezionale dei dati.

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 dei 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 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 dalla versione iniziale di Android. Il dispositivo Android viene visualizzato 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 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 ):

OTG

Figura 1. Adattatore in movimento (OTG).

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 quanto 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) 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à di sviluppo e quindi passa alla modalità accessoria tramite un processo di rinegoziazione.

La modalità accessoria è 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 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 driverless è un sinonimo comune di class compliant , a indicare 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 potrebbero esserci delle eccezioni.

Classe audio USB

Qui ci occupiamo solo di periferiche che implementano funzioni audio e quindi aderiscono alla classe del dispositivo 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 Media Transfer Protocol (MTP) è per l'accesso completo ai file ai media. 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 trasportato sul 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 lavandino per l'host.

Canali

Una periferica con funzione audio può includere un terminale sorgente, terminale sink o entrambi. Ciascuna direzione può avere un canale ( mono ), due canali ( stereo ) o più. Le periferiche con più di due canali sono dette 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 significato spaziale standard particolare a ciascun canale. In questo caso, spetta all'applicazione e all'utente definire come utilizzare 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 l'input da una radio AM.

Modalità di trasferimento isocrona

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 di inizio del frame (SOF). 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 carico utile e un frame ad alta velocità 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:

  • Adattivo
  • Asincrono
  • Sincrono

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

Nella modalità secondaria 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 uguale o derivato) al clock che pilota il DAC o l'ADC. Questa vicinanza significa che la modalità secondaria 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 modalità secondaria sincrona, ogni periodo SOF viene trasferito un numero fisso di byte. La frequenza di campionamento audio è effettivamente derivata dall'orologio USB. La modalità secondaria sincrona non è comunemente usata con l'audio perché sia ​​l'host che la periferica sono alla mercé dell'orologio USB.

La tabella seguente riassume le modalità secondarie isocrone:

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

In pratica, la modalità secondaria ha ovviamente importanza, ma dovrebbero essere presi in considerazione 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 supporta un sottoinsieme di funzionalità USB di classe 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 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)

La lettura 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. Mentre è in modalità accessoria, Android indirizza automaticamente l'uscita audio su USB. Cioè, il dispositivo Android funge da origine dati per l'host, ad esempio un dock.

L'audio in modalità accessorio ha queste caratteristiche:

  • Il dispositivo Android deve essere controllato da un host esperto che può prima eseguire la transizione del 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.
  • Deve essere inserita la direzione, espressa rispetto all'host
  • Il formato audio deve essere PCM a 16 bit
  • La frequenza di campionamento deve essere 44,1 kHz
  • Il conteggio dei canali deve essere 2 (stereo)

L'audio in modalità accessoria non è stato ampiamente adottato e attualmente non è raccomandato 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 headset 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.

Una storia di due DAC

Nel diagramma di esempio seguente, 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 design è 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 progetto, la periferica audio esterna C può essere progettata per una qualità audio superiore 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à, 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 una scheda a circuiti esterni C consente di isolare fisicamente ed elettricamente gli stadi analogici finali dalla scheda a circuiti densi e rumorosi, con conseguente maggiore fedeltà dell'audio.

D'altra parte, il secondo progetto è più complesso e, con l'aggiunta di complessità, aumentano le opportunità 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 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 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 poter interagire con i dispositivi Android, i fornitori di periferiche audio devono:

  • progettazione per la conformità alla classe audio; attualmente Android punta alla classe 1, ma è saggio pianificare la classe 2
  • evita i capricci
  • testare l'interoperabilità con dispositivi Android di riferimento e popolari
  • documentare chiaramente le funzionalità supportate, la conformità alla classe audio, i requisiti di alimentazione, ecc. in modo che i consumatori possano prendere decisioni informate

Consigli per OEM di dispositivi Android e fornitori di SoC

Per supportare l'audio digitale USB, gli OEM dei 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
  • tieniti aggiornato con le recenti versioni e patch del kernel; nonostante il nobile obiettivo del rispetto della classe, ci sono periferiche audio esistenti con stranezze e i kernel recenti hanno soluzioni alternative per tali stranezze
  • abilitare la politica audio USB come descritto di seguito
  • aggiungi audio.usb.default a PRODUCT_PACKAGES in device.mk
  • verifica dell'interoperabilità con le comuni periferiche audio USB

Come abilitare la politica audio USB

Per abilitare l'audio USB, aggiungi una voce al file di configurazione della politica audio. Questo si trova in genere 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 "codename" deve essere sostituito dal nome del 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 Hardware Abstraction Layer (HAL) 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 è astratto dall'implementazione di 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 di verifica CTS audio USB .