Questo articolo esamina il supporto di Android per l'audio digitale USB e i protocolli basati su USB correlati.
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 utenti che vogliono comprendere in dettaglio le funzionalità interne dell'audio digitale USB su Android.
Gli utenti finali dei dispositivi Nexus devono invece consultare l'articolo Registrare e riprodurre l'audio utilizzando la modalità host USB nel Centro assistenza Nexus. Anche se questo articolo non è rivolto agli utenti finali, alcuni consumatori appassionati di audio potrebbero trovare parti di interesse.
Panoramica di USB
L'Universal Serial Bus (USB) è descritto in modo informale nell'articolo di Wikipedia USB, e viene definito formalmente 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 e terminologia di base
La porta USB è un bus con un singolo 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, in quanto potrebbero essere confusi con il dispositivo Android o con il concetto specifico di Android chiamato modalità accessorio.
Un ruolo host fondamentale è l'enumerazione: il processo di rilevamento delle periferiche collegate al bus e di query sulle relative 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 sia 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 un canale a un endpoint, una sorgente o un'area di destinazione dei dati fornita da una delle funzioni della periferica.
Esistono due tipi di pipe: message e stream. Una pipeline di messaggi viene utilizzata per il controllo e lo stato bidirezionali. Un canale stream viene utilizzato per il trasferimento di dati unidirezionale.
L'host avvia tutti i trasferimenti di dati, pertanto i termini input e output sono espressi in base 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 modalità principali di trasferimento dei dati: interruzione, collettiva e isocrona. La modalità isocrona verrà discussa ulteriormente nel contesto dell'audio.
La periferica potrebbe avere terminali che si connettono al mondo esterno, oltre alla periferica stessa. In questo modo, la periferica serve a tradurre tra il protocollo USB e i segnali "reali". I terminali sono oggetti logici della funzione.
Modalità USB per Android
Modalità di sviluppo
La modalità di sviluppo è presente fin dalla prima release di Android. Il dispositivo Android viene visualizzato come periferica USB su un PC host con 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 collettivo dei dati 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 è necessario un adattatore on-the-go (OTG) come questo:
![OTG](https://source.android.com/static/docs/core/audio/images/otg.jpg?authuser=0&hl=it)
Figura 1. Adattatore On-the-Go (OTG)
Un dispositivo Android potrebbe non fornire energia sufficiente per far funzionare una determinata periferica, a seconda della potenza necessaria e di quella che il dispositivo Android è in grado di fornire. Anche se è disponibile una potenza adeguata, la ricarica della batteria del dispositivo Android potrebbe essere notevolmente ridotta. Per queste situazioni, utilizza un hub con alimentazione come questo:
![Hub con alimentazione](https://source.android.com/static/docs/core/audio/images/hub.jpg?authuser=0&hl=it)
Figura 2. Hub con alimentazione
Modalità accessorio
La modalità accessorio è stata introdotta in Android 3.1 (livello API 12) e di cui è stato eseguito il backporting ad Android 2.3.4. In questa modalità, il dispositivo Android funziona come periferica USB, sotto il controllo di un altro dispositivo, ad esempio una base che funge da host. La differenza tra la modalità di sviluppo e la modalità accessorio è che le funzioni USB aggiuntive sono visibili all'host, oltre ad adb. Il dispositivo Android inizia in modalità di sviluppo e poi passa alla modalità accessorio tramite una procedura di rinegoziazione.
La modalità accessorio è stata estesa con funzionalità aggiuntive in Android 4.1, in particolare l'audio descritto di seguito.
Audio USB
Classi USB
A ogni funzione periferica è associato un documento classi di dispositivi che specifica il protocollo standard per quella funzione. In questo modo, gli host e le funzioni periferiche conformi alla classe possono interoperare, senza conoscere in dettaglio il 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, indicando che è possibile utilizzare le funzionalità standard di una periferica di questo tipo senza dover installare un driver specifico per il sistema operativo. Si può presumere che una periferica pubblicizzata come "non richiede driver" per i principali sistemi operativi per computer sia conforme alla classe, anche se potrebbero esserci delle eccezioni.
Classe audio USB
Qui ci occupiamo solo delle periferiche che implementano funzioni audio e quindi rispettano la classe di dispositivo audio. Esistono due versioni della specifica della classe audio USB: classe 1 (UAC1) e 2 (UAC2).
Confronto con altri corsi
La classe USB include molti altri dispositivi, alcuni dei quali possono essere confusi con la classe audio. La classe di archiviazione di massa (MSC) viene utilizzata per l'accesso ai contenuti multimediali in base al settore, mentre il Media Transfer Protocol (MTP) è destinato all'accesso completo ai file multimediali. 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.
Morsetti audio
I terminali di una periferica audio sono in genere analogici. Il segnale analogico presentato al terminale di ingresso della periferica viene convertito in digitale da un convertitore analogico-digitale (ADC), e viene trasmesso tramite il protocollo USB per essere utilizzato dall'host. L'ADC è un'origine di dati per l'host. Analogamente, l'host invia un segnale audio digitale tramite protocollo USB alla periferica, dove un convertitore da digitale ad 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 di origine, un terminale di destinazione 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 uno stream stereo come composto da canali sinistro e destro e, per estensione, interpretare uno stream multicanale come dotato di posizioni spaziali corrispondenti a ciascun canale. Tuttavia, è anche abbastanza appropriato (soprattutto per l'audio USB più che per HDMI) non assegnare alcun significato spaziale standard a ciascun canale. In questo caso, è compito dell'applicazione e dell'utente definire la modalità di utilizzo di ciascun canale. Ad esempio, uno stream 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 isocrono
L'audio USB utilizza la modalità di trasferimento isocrono per le sue caratteristiche in tempo reale, a scapito del recupero degli errori. In modalità isocrona, la larghezza di banda è garantita e gli errori di trasmissione dei dati vengono rilevati utilizzando un controllo di ridondanza ciclico (CRC). Tuttavia, non viene eseguito alcun riconoscimento o ritrasmissione dei pacchetti in caso di errore.
Le trasmissioni isocroniche avvengono ogni periodo di inizio frame (SOF). Il periodo SOF è di un millisecondo per la velocità massima e di 125 microsecondi per la velocità elevata. Ogni frame a velocità normale trasporta fino a 1023 byte di payload, mentre 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. Viene impostato un limite superiore teorico per la frequenza di campionamento, il numero di canali e la profondità di bit audio combinati. Il limite pratico è inferiore.
All'interno della modalità isocrona sono disponibili tre sottomodalità:
- Adattivi
- Asincrono
- Sincrona
Nella modalità secondaria adattiva, l'origine o la destinazione periferica si adatta a una frequenza di campionamento potenzialmente variabile dell'host.
Nella modalità secondaria asincrona (chiamata anche feedback implicito), la destinazione o l'origine determina la frequenza di campionamento e l'host la supporta. Il vantaggio teorico principale della modalità secondaria asincrona è che l'orologio USB di origine o di destinazione è fisicamente ed elettricamente più vicino (e in effetti può essere uguale o derivato) all'orologio che aziona il DAC o l'ADC. Questa vicinanza significa che la modalità secondaria asincrona dovrebbe essere meno sensibile al jitter dell'orologio. 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, viene trasferito un numero fisso di byte ogni periodo SOF. La frequenza di campionamento audio viene ricavata in modo efficace dal clock USB. La modalità secondaria sincrona non viene comunemente utilizzata con l'audio perché sia il computer host sia la periferica sono in balia dell'orologio USB.
La tabella seguente riassume i sottomodi isocroni:
Modalità secondaria | Conteggio dei byte per pacchetto |
Frequenza di campionamento determinata da |
Utilizzato per l'audio |
---|---|---|---|
adattivo | variabile | organizzatore | sì |
asincrono | variabile | periferica | sì |
sincrono | fisso | Orologio USB | no |
In pratica, la modalità secondaria è ovviamente importante, ma devono essere presi in considerazione anche altri fattori.
Supporto di 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à in bit deve essere di 16, 24 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)
L'esame del codice sorgente del framework Android potrebbe mostrare codice aggiuntivo oltre a quello minimo necessario per supportare queste funzionalità. Tuttavia, questo codice non è stato convalidato, pertanto le funzionalità più avanzate non sono ancora state rivendicate.
Modalità accessorio
Android 4.1 (livello API 16) ha aggiunto il supporto limitato della riproduzione audio all'host. In modalità accessorio, Android invia automaticamente l'uscita audio alla porta USB. In altre parole, il dispositivo Android funge da origine dati per l'host, ad esempio una base.
L'audio in modalità accessorio offre le seguenti funzionalità:
- Il dispositivo Android deve essere controllato da un host esperto che possa prima passare dalla modalità di sviluppo alla modalità accessorio e poi trasferire i dati audio dall'endpoint appropriato. Di conseguenza, il dispositivo Android non viene visualizzato come "senza driver" per l'host.
- La direzione deve essere input, espressa in base 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 adottato su larga scala e al momento non è consigliato per i nuovi design.
Applicazioni dell'audio digitale USB
Come suggerisce il nome, il segnale audio digitale USB è rappresentato da uno stream di dati digitali anziché dal segnale analogico utilizzato dal comune mini connettore TRS per gli auricolari. Prima di poter essere ascoltato, qualsiasi segnale digitale deve essere convertito in analogico. La scelta del punto in cui posizionare la conversione comporta dei compromessi.
La storia di due DAC
Nel diagramma di esempio riportato di seguito, vengono confrontati due design. Innanzitutto, abbiamo un dispositivo mobile con un processore di applicazioni (AP), un DAC integrato, un amplificatore e un connettore TRS analogico collegato alle cuffie. Prendiamo in considerazione anche un dispositivo mobile con USB collegato a DAC e amplificatore USB esterni, anche con cuffie.
![Confronto dei DAC](https://source.android.com/static/docs/core/audio/images/dac.png?authuser=0&hl=it)
Figura 3. Confronto di due DAC
Quale design è migliore? La risposta dipende dalle tue esigenze. Ognuno ha vantaggi e svantaggi.
Nota:si tratta di un confronto artificiale, poiché su un vero dispositivo Android probabilmente sono disponibili entrambe le opzioni.
Il primo design A è più semplice, meno costoso, consuma meno energia e sarà un design più affidabile, supponendo che i componenti siano ugualmente affidabili. Tuttavia, in genere sono presenti compromessi in termini di 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 medio, non dell'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 di mercato di massa di base B. Sì, è un design più costoso, ma il costo viene sostenuto solo da chi lo vuole.
I dispositivi mobili sono noti per avere schede di circuito ad alta densità, il che può comportare maggiori opportunità di crosstalk che degradano i segnali analogici adiacenti. La comunicazione digitale è meno soggetta al rumore, quindi spostare il DAC dal dispositivo Android A a una scheda di circuito esterno C consente di isolare fisicamente ed elettricamente gli stadi analogici finali dalla scheda di circuito densa e rumorosa, con un audio di qualità superiore.
D'altra parte, il secondo design è più complesso e con una maggiore complessità aumentano le opportunità di errore. Inoltre, i controller USB generano ulteriore latenza.
Applicazioni in modalità host
Le applicazioni audio in modalità host USB più comuni includono:
- Ascolto di musica
- telefonia
- messaggistica istantanea e chat vocale
- registrando
Per tutte queste applicazioni, Android rileva una periferica audio digitale USB compatibile e instrada automaticamente la riproduzione e la registrazione audio in modo appropriato, in base alle regole dei criteri audio. I contenuti stereo vengono riprodotti sui primi due canali della periferica.
Non sono disponibili API specifiche per l'audio digitale USB. Per un utilizzo avanzato, il routing automatico potrebbe interferire con le applicazioni che supportano USB. Per queste applicazioni, disattiva il routing automatico tramite il controllo corrispondente nella sezione Contenuti multimediali di Impostazioni / Opzioni sviluppatore.
Eseguire il debug in modalità host
In modalità host USB, il debug adb tramite USB non è disponibile. Per un'alternativa, consulta la sezione Utilizzo wireless di Android Debug Bridge.
Implementare l'audio USB
Consigli per i fornitori di periferiche audio
Per poter operare in interoperabilità con i dispositivi Android, i fornitori di periferiche audio devono:
- Progettare la conformità alla classe audio. Al momento Android ha come target la classe 1, ma è consigliabile pianificare la classe 2
- Evita stranezze
- testare l'interoperabilità con dispositivi Android di riferimento e di uso comune
- documentare chiaramente le funzionalità supportate, la conformità alla classe audio, i requisiti di alimentazione e così via in modo che i consumatori possano prendere decisioni consapevoli
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 devono:
- progettare hardware per supportare la modalità host USB
- Attivare il supporto generico dell'host USB a livello di framework tramite il flag di funzionalità
android.hardware.usb.host.xml
- Attivare tutte le funzionalità del kernel necessarie: modalità host USB, audio USB, modalità di trasferimento isocrono
- mantieni aggiornati i rilasci e le patch del kernel recenti; nonostante l'obiettivo nobile della conformità alla classe, esistono periferiche audio con peculiarità e i kernel recenti hanno soluzioni per queste peculiarità
- Attiva il criterio audio USB come descritto di seguito
- Aggiungi audio.usb.default a PRODUCT_PACKAGES in device.mk
- test di interoperabilità con le periferiche audio USB comuni
Attivare il criterio audio USB
Per attivare l'audio USB, aggiungi una voce al file di configurazione dei criteri audio. In genere si trova qui:
device/oem/codename/audio_policy.conf
Il componente del percorso "oem" deve essere sostituito con il nome dell'OEM che produce il dispositivo Android, e "nome in codice" deve essere sostituito con il nome in codice del dispositivo.
Di seguito è riportato un esempio di voce:
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 dell'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 nella sezione Terminologia audio. Sebbene l'audio USB si basi su trasferimenti isocronici, questo viene rimosso 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 per l'audio USB.