Google si impegna a promuovere l'equità razziale per le comunità nere. Vedi come.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Audio digitale USB

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

Pubblico

I destinatari di questo articolo sono OEM di dispositivi Android, fornitori di SoC, fornitori di periferiche audio USB, sviluppatori avanzati di applicazioni audio 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 orientato verso gli utenti finali, alcuni consumatori di audiofili possono trovare parti di interesse.

Panoramica di USB

Universal Serial Bus (USB) è descritto in modo informale nell'articolo Wikipedia di 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 e terminologia di base

USB è un bus con un singolo iniziatore di 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 il concetto specifico di Android chiamato modalità accessorio .

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

Una periferica può essere un oggetto fisico ma implementare effettivamente più funzioni logiche. Ad esempio, una periferica webcam può 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 su una pipe con 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 messaggio viene utilizzata per il controllo e lo stato bidirezionali. Un flusso stream 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.

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 "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 bulk 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 OTG (On-the-Go) come questo:

OTG

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 alla periferica e della capacità del dispositivo Android di fornire. Anche se è disponibile una potenza adeguata, la carica della batteria del dispositivo Android potrebbe essere significativamente ridotta. Per queste situazioni, utilizzare un hub alimentato come questo:

Hub alimentato

Figura 2. Hub alimentato

Modalità accessorio

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à accessorio è 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à 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 di dispositivo associato che specifica il protocollo standard per quella funzione. Ciò consente agli host conformi alle classi 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 comune sinonimo di conformità di 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 sarà conforme alla classe, sebbene possano esserci eccezioni.

Classe audio USB

Qui ci occupiamo solo di periferiche che implementano funzioni audio e quindi aderiscono alla classe dei dispositivi audio. Esistono due versioni 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 MTP ( Media Transfer Protocol ) è 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 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 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 si 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. 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 del tutto appropriato (soprattutto per l'audio USB più di HDMI ) non assegnare alcun significato spaziale standard specifico 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 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 spese del recupero 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). In caso di errore, tuttavia, non vi è alcun riconoscimento o ritrasmissione dei pacchetti.

Le trasmissioni isocrone si verificano ogni periodo di inizio del frame (SOF). Il periodo di SOF è di un millisecondo per la massima velocità e 125 microsecondi per la massima velocità. Ogni frame ad alta velocità trasporta fino a 1023 byte di payload e un frame ad alta velocità trasporta fino a 1024 byte. Mettendo insieme questi, calcoliamo la velocità massima di trasferimento come 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.

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

  • adattabile
  • asincrono
  • Sincrono

Nella modalità secondaria adattiva, il sink o la sorgente periferica 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 accetta. Il principale vantaggio teorico della sotto-modalità asincrona è che l'orologio USB sorgente o sink è fisicamente ed elettricamente più vicino (e in effetti può essere lo stesso o derivato da) l'orologio che guida il DAC o l'ADC. Questa vicinanza significa che la sottotomia 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, viene trasferito un numero fisso di byte per ciascun periodo SOF. La frequenza di campionamento audio è effettivamente derivata dall'orologio USB. La modalità secondaria sincrona non viene comunemente utilizzata con l'audio perché sia ​​l'host che la periferica sono in balia dell'orologio USB.

La tabella seguente sintetizza le sottotodalità isocrone:

Sotto-mode Conteggio byte
per pacchetto
Frequenza di campionamento
determinato da
Usato per l'audio
adattabile variabile ospite
asincrono variabile periferica
sincrono fisso Orologio USB no

In pratica, la modalità secondaria è 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 supporta un sottoinsieme di funzionalità USB audio classe 1 (UAC1):

  • Il dispositivo Android deve fungere da host
  • Il formato audio deve essere PCM (interfaccia 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 conteggio dei canali deve essere 1 (mono) o 2 (stereo)

La lettura del codice sorgente del framework Android potrebbe mostrare un codice aggiuntivo oltre al minimo necessario per supportare queste funzionalità. Ma questo codice non è stato convalidato, quindi non sono ancora state rivendicate funzionalità più avanzate.

Modalità accessorio

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à accessorio ha queste caratteristiche:

  • Il dispositivo Android deve essere controllato da un host esperto che può prima passare dal 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" per l'host.
  • La direzione deve essere inserita , espressa in relazione 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à accessorio non è stato ampiamente adottato e al momento non è raccomandato per i nuovi design.

Applicazioni di 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 cuffie TRS. Alla fine qualsiasi segnale digitale deve essere convertito in analogico prima di poter essere ascoltato. Ci sono compromessi nella scelta di dove posizionare quella conversione.

Una storia di due DAC

Nel seguente diagramma di esempio, confrontiamo due disegni. 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 dispositivo Android reale avrebbe probabilmente entrambe le opzioni disponibili.

Il primo design A è più semplice, meno costoso, consuma meno energia e sarà un design più affidabile assumendo componenti altrimenti altrettanto affidabili. Tuttavia, di solito ci sono compromessi di qualità audio rispetto ad altri requisiti. Ad esempio, se si tratta di un dispositivo per il mercato di massa, può 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 più elevata 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 è 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 crosstalk che degrada i segnali analogici adiacenti. La comunicazione digitale è meno suscettibile al rumore , quindi spostando il DAC dal dispositivo Android A su una scheda di circuito esterna C è possibile isolare fisicamente ed elettricamente gli stadi analogici finali dalla scheda di circuito densa e rumorosa, con conseguente audio ad alta fedeltà.

D'altra parte, il secondo design è più complesso e, con una maggiore complessità, arrivano maggiori 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 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 uso avanzato, il routing automatico può interferire con le applicazioni che sono USB-compatibili. 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. Vedi la sezione Uso wireless di Android Debug Bridge per un'alternativa.

Implementazione dell'audio USB

Consigli per i fornitori di periferiche audio

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

  • progettazione per la conformità della classe audio; attualmente Android ha come target la classe 1, ma è consigliabile pianificare la classe 2
  • evitare stranezze
  • test di interoperabilità con dispositivi Android di riferimento e popolari
  • documentare chiaramente le funzionalità supportate, la conformità alle classi audio, i requisiti di alimentazione, ecc. in modo che i consumatori possano prendere decisioni informate

Consigli per OEM di dispositivi Android e venditori di SoC

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

  • hardware di progettazione 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; vedi Configurazione del kernel Android
  • tieniti aggiornato con le recenti versioni 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 la politica audio USB come descritto di seguito
  • aggiungi audio.usb.default a PRODUCT_PACKAGES in device.mk
  • test di interoperabilità con periferiche audio USB comuni

Come abilitare i criteri audio USB

Per abilitare l'audio USB, aggiungere 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 "nome in codice" 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 fortemente sulla tinyalsa , descritta in Audio Terminology . Sebbene l'audio USB si basi su trasferimenti isocroni, questo viene sottratto 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 .