USB-Digital-Audio

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Dieser Artikel gibt einen Überblick über die Android-Unterstützung für digitales USB-Audio und verwandte USB-basierte Protokolle.

Publikum

Die Zielgruppe dieses Artikels sind OEMs von Android-Geräten, SoC-Anbieter, Anbieter von USB-Audioperipheriegeräten, Entwickler von fortgeschrittenen Audioanwendungen und andere, die ein detailliertes Verständnis der Interna von USB-Digitalaudio auf Android suchen.

Endbenutzer von Nexus-Geräten sollten stattdessen den Artikel Aufzeichnen und Wiedergeben von Audio im USB-Hostmodus im Nexus-Hilfezentrum lesen. Obwohl sich dieser Artikel nicht an Endbenutzer richtet, könnten bestimmte audiophile Verbraucher Teile von Interesse finden.

Überblick über USB

Universal Serial Bus (USB) wird informell im Wikipedia-Artikel USB beschrieben und ist formell durch die vom USB Implementers Forum, Inc. veröffentlichten Standards definiert. Der Einfachheit halber fassen wir hier die wichtigsten USB-Konzepte zusammen, aber die Standards sind die maßgebliche Referenz.

Grundbegriffe und Terminologie

USB ist ein Bus mit einem einzigen Initiator von Datenübertragungsvorgängen, dem so genannten Host . Der Host kommuniziert mit Peripheriegeräten über den Bus.

Hinweis: Die Begriffe Gerät und Zubehör sind gebräuchliche Synonyme für Peripheriegerät . Wir vermeiden diese Begriffe hier, da sie mit dem Android- Gerät oder dem Android-spezifischen Konzept namens Zubehörmodus verwechselt werden könnten.

Eine kritische Host-Rolle ist die Enumeration : der Prozess des Erkennens, welche Peripheriegeräte mit dem Bus verbunden sind, und das Abfragen ihrer Eigenschaften, die über Deskriptoren ausgedrückt werden.

Ein Peripheriegerät kann ein physisches Objekt sein, aber tatsächlich mehrere logische Funktionen implementieren. Beispielsweise könnte ein Webcam-Peripheriegerät sowohl eine Kamerafunktion als auch eine Mikrofon-Audiofunktion haben.

Jede periphere Funktion hat eine Schnittstelle , die das Protokoll zur Kommunikation mit dieser Funktion definiert.

Der Host kommuniziert mit einem Peripheriegerät über eine Pipe zu einem Endpunkt , einer Datenquelle oder -senke, die von einer der Funktionen des Peripheriegeräts bereitgestellt wird.

Es gibt zwei Arten von Pipes: message und stream . Eine Nachrichtenleitung wird für bidirektionale Steuerung und Status verwendet. Eine Streampipe wird für die unidirektionale Datenübertragung verwendet.

Der Host initiiert alle Datenübertragungen, daher werden die Begriffe Eingabe und Ausgabe relativ zum Host ausgedrückt. Eine Eingabeoperation überträgt Daten vom Peripheriegerät zum Host, während eine Ausgabeoperation Daten vom Host zum Peripheriegerät überträgt.

Es gibt drei Hauptmodi für die Datenübertragung: Interrupt , Bulk und Isochronous . Der isochrone Modus wird weiter im Zusammenhang mit Audio besprochen.

Das Peripheriegerät kann Anschlüsse haben, die über das Peripheriegerät selbst hinaus mit der Außenwelt verbunden sind. Auf diese Weise dient das Peripheriegerät dazu, zwischen dem USB-Protokoll und Signalen der "echten Welt" zu übersetzen. Die Klemmen sind logische Objekte der Funktion.

Android-USB-Modi

Entwicklungsmodus

Der Entwicklungsmodus ist seit der ersten Veröffentlichung von Android vorhanden. Das Android-Gerät erscheint als USB-Peripheriegerät für einen Host-PC, auf dem ein Desktop-Betriebssystem wie Linux, Mac OS X oder Windows ausgeführt wird. Die einzige sichtbare Peripheriefunktion ist entweder Android Fastboot oder Android Debug Bridge (adb) . Die Fastboot- und ADB-Protokolle werden über den USB-Massendatenübertragungsmodus geschichtet.

Host-Modus

Der Host-Modus wird in Android 3.1 (API-Ebene 12) eingeführt.

Da das Android-Gerät als Host fungieren muss und die meisten Android-Geräte über einen Micro-USB-Anschluss verfügen, der keinen direkten Host-Betrieb zulässt, wird normalerweise ein On-the-go ( OTG )-Adapter wie dieser benötigt:

OTG

Abbildung 1. Adapter für unterwegs (OTG).

Ein Android-Gerät liefert möglicherweise nicht genügend Strom, um ein bestimmtes Peripheriegerät zu betreiben, je nachdem, wie viel Strom das Peripheriegerät benötigt und wie viel das Android-Gerät liefern kann. Auch wenn ausreichend Strom zur Verfügung steht, kann die Akkuladung des Android-Geräts erheblich verkürzt werden. Verwenden Sie für diese Situationen einen aktiven Hub wie diesen:

Angetriebener Hub

Abbildung 2. Hub mit Stromversorgung

Zubehörmodus

Der Zubehörmodus wurde in Android 3.1 (API-Level 12) eingeführt und auf Android 2.3.4 zurückportiert. In diesem Modus fungiert das Android-Gerät als USB-Peripheriegerät, das von einem anderen Gerät gesteuert wird, z. B. einem Dock, das als Host dient. Der Unterschied zwischen dem Entwicklungsmodus und dem Zubehörmodus besteht darin, dass zusätzliche USB-Funktionen für den Host über adb hinaus sichtbar sind. Das Android-Gerät beginnt im Entwicklungsmodus und wechselt dann über einen Neuaushandlungsprozess in den Zubehörmodus.

Der Zubehörmodus wurde in Android 4.1 um zusätzliche Funktionen erweitert, insbesondere das unten beschriebene Audio.

USB-Audio

USB-Klassen

Jede Peripheriefunktion hat ein zugeordnetes Geräteklassendokument , das das Standardprotokoll für diese Funktion spezifiziert. Dadurch können klassenkonforme Hosts und periphere Funktionen zusammenarbeiten, ohne dass detaillierte Kenntnisse über die Funktionsweise der anderen vorhanden sind. Die Klassenkonformität ist kritisch, wenn der Host und das Peripheriegerät von unterschiedlichen Entitäten bereitgestellt werden.

Der Begriff treiberlos ist ein gebräuchliches Synonym für klassenkonform und zeigt an, dass es möglich ist, die Standardfunktionen eines solchen Peripheriegeräts zu verwenden, ohne dass ein betriebssystemspezifischer Treiber installiert werden muss. Man kann davon ausgehen, dass ein Peripheriegerät, das für die wichtigsten Desktop-Betriebssysteme als „kein Treiber erforderlich“ beworben wird, klassenkonform ist, obwohl es Ausnahmen geben kann.

USB-Audio-Klasse

Wir beschäftigen uns hier nur mit Peripheriegeräten, die Audiofunktionen implementieren, und halten uns somit an die Audiogeräteklasse. Es gibt zwei Editionen der USB-Audioklassenspezifikation: Klasse 1 (UAC1) und 2 (UAC2).

Vergleich mit anderen Klassen

USB umfasst viele andere Geräteklassen, von denen einige mit der Audioklasse verwechselt werden können. Die Massenspeicherklasse (MSC) wird für den sektororientierten Zugriff auf Medien verwendet, während das Media Transfer Protocol (MTP) für den vollständigen Dateizugriff auf Medien verwendet wird. Sowohl MSC als auch MTP können zum Übertragen von Audiodateien verwendet werden, aber nur die USB-Audioklasse ist für Echtzeit-Streaming geeignet.

Audioanschlüsse

Die Anschlüsse eines Audioperipheriegeräts sind typischerweise analog. Das analoge Signal, das am Eingangsanschluss des Peripheriegeräts anliegt, wird von einem Analog-Digital-Wandler (ADC) in ein digitales umgewandelt und über das USB-Protokoll übertragen, um vom Host verarbeitet zu werden. Der ADC ist eine Datenquelle für den Host. In ähnlicher Weise sendet der Host ein digitales Audiosignal über das USB-Protokoll an das Peripheriegerät, wo ein Digital-Analog-Wandler (DAC) konvertiert und an einen analogen Ausgangsanschluss liefert. Der DAC ist eine Senke für den Host.

Kanäle

Ein Peripheriegerät mit Audiofunktion kann einen Quellenanschluss, einen Senkenanschluss oder beide umfassen. Jede Richtung kann einen Kanal ( Mono ), zwei Kanäle ( Stereo ) oder mehr haben. Peripheriegeräte mit mehr als zwei Kanälen werden als Multichannel bezeichnet. Es ist üblich, einen Stereostrom so zu interpretieren, dass er aus linken und rechten Kanälen besteht, und im weiteren Sinne einen Mehrkanalstrom so zu interpretieren, dass er räumliche Positionen aufweist, die jedem Kanal entsprechen. Allerdings ist es auch durchaus angemessen (insbesondere für USB-Audio mehr als für HDMI ), nicht jedem Kanal eine bestimmte räumliche Standardbedeutung zuzuweisen. In diesem Fall ist es Sache der Anwendung und des Benutzers zu definieren, wie jeder Kanal verwendet wird. Bei einem USB-Eingangsstream mit vier Kanälen können beispielsweise die ersten drei Kanäle an verschiedene Mikrofone in einem Raum angeschlossen sein und der letzte Kanal den Eingang von einem AM-Radio empfangen.

Isochroner Übertragungsmodus

USB-Audio verwendet den isochronen Übertragungsmodus für seine Echtzeiteigenschaften auf Kosten der Fehlerbehebung. Im isochronen Modus wird die Bandbreite garantiert und Datenübertragungsfehler werden durch eine zyklische Redundanzprüfung (CRC) erkannt. Aber es gibt keine Paketbestätigung oder Neuübertragung im Fehlerfall.

Isochrone Übertragungen treten in jeder SOF-Periode (Start Of Frame) auf. Die SOF-Periode beträgt eine Millisekunde für Vollgeschwindigkeit und 125 Mikrosekunden für Hochgeschwindigkeit. Jeder Frame mit voller Geschwindigkeit trägt bis zu 1023 Bytes Nutzlast, und ein Frame mit hoher Geschwindigkeit trägt bis zu 1024 Bytes. Zusammengenommen berechnen wir die maximale Übertragungsrate mit 1.023.000 oder 8.192.000 Bytes pro Sekunde. Dadurch wird eine theoretische Obergrenze für die kombinierte Audio-Abtastrate, Kanalanzahl und Bittiefe festgelegt. Die praktische Grenze ist niedriger.

Innerhalb des isochronen Modus gibt es drei Untermodi:

  • Adaptiv
  • Asynchron
  • Synchron

Im adaptiven Untermodus passt sich die periphere Senke oder Quelle an eine möglicherweise variierende Abtastrate des Hosts an.

Im asynchronen Untermodus (auch als implizites Feedback bezeichnet) bestimmt die Senke oder Quelle die Abtastrate, und der Host passt sich an. Der primäre theoretische Vorteil des asynchronen Untermodus besteht darin, dass der Quellen- oder Senken-USB-Takt physikalisch und elektrisch näher an dem Takt liegt (und tatsächlich mit dem Takt identisch oder davon abgeleitet sein kann), der den DAC oder ADC antreibt. Diese Nähe bedeutet, dass der asynchrone Untermodus weniger anfällig für Taktjitter sein sollte. Außerdem kann der vom DAC oder ADC verwendete Takt für eine höhere Genauigkeit und geringere Abweichung als der Host-Takt ausgelegt sein.

Im synchronen Untermodus wird jede SOF-Periode eine feste Anzahl von Bytes übertragen. Die Audio-Samplerate wird effektiv von der USB-Uhr abgeleitet. Der synchrone Untermodus wird normalerweise nicht mit Audio verwendet, da sowohl der Host als auch das Peripheriegerät der USB-Uhr ausgeliefert sind.

Die folgende Tabelle fasst die isochronen Untermodi zusammen:

Untermodus Byte-Anzahl
pro Paket
Beispielrate
bestimmt durch
Wird für Audio verwendet
adaptiv Variable Gastgeber Jawohl
asynchron Variable peripher Jawohl
synchron Fest USB-Uhr nein

In der Praxis spielt der Submodus natürlich eine Rolle, aber auch andere Faktoren sollten berücksichtigt werden.

Android-Unterstützung für USB-Audioklasse

Entwicklungsmodus

USB-Audio wird im Entwicklungsmodus nicht unterstützt.

Host-Modus

Android 5.0 (API-Level 21) und höher unterstützt eine Untergruppe von USB-Audioklasse-1-Funktionen (UAC1):

  • Das Android-Gerät muss als Host fungieren
  • Das Audioformat muss PCM sein (Schnittstelle Typ I)
  • Die Bittiefe muss 16 Bit, 24 Bit oder 32 Bit betragen, wobei 24 Bit nützlicher Audiodaten linksbündig innerhalb der höchstwertigen Bits des 32-Bit-Wortes angeordnet sind
  • Die Abtastrate muss entweder 48, 44,1, 32, 24, 22,05, 16, 12, 11,025 oder 8 kHz betragen
  • Die Kanalanzahl muss 1 (Mono) oder 2 (Stereo) sein.

Beim Lesen des Quellcodes des Android-Frameworks kann zusätzlicher Code angezeigt werden, der über das für die Unterstützung dieser Funktionen erforderliche Minimum hinausgeht. Dieser Code wurde jedoch nicht validiert, sodass noch keine erweiterten Funktionen beansprucht werden.

Zubehörmodus

Android 4.1 (API-Level 16) fügte dem Host eingeschränkte Unterstützung für die Audiowiedergabe hinzu. Im Zubehörmodus leitet Android seine Audioausgabe automatisch an USB weiter. Das heißt, das Android-Gerät dient als Datenquelle für den Host, beispielsweise ein Dock.

Audio im Zubehörmodus hat folgende Funktionen:

  • Das Android-Gerät muss von einem sachkundigen Host gesteuert werden, der das Android-Gerät zuerst vom Entwicklungsmodus in den Zubehörmodus überführen kann, und dann muss der Host Audiodaten vom entsprechenden Endpunkt übertragen. Somit erscheint das Android-Gerät dem Host nicht als "treiberlos".
  • Die Richtung muss relativ zum Host eingegeben werden
  • Das Audioformat muss 16-Bit-PCM sein
  • Die Abtastrate muss 44,1 kHz betragen
  • Die Kanalanzahl muss 2 sein (Stereo)

Audio im Zubehörmodus ist nicht weit verbreitet und wird derzeit nicht für neue Designs empfohlen.

Anwendungen von USB Digital Audio

Wie der Name schon sagt, wird das digitale USB-Audiosignal durch einen digitalen Datenstrom dargestellt und nicht durch das analoge Signal, das vom üblichen TRS-Mini -Headset-Anschluss verwendet wird. Schließlich muss jedes digitale Signal in ein analoges umgewandelt werden, bevor es gehört werden kann. Es gibt Kompromisse bei der Auswahl, wo diese Konvertierung platziert werden soll.

Eine Geschichte von zwei DACs

Im folgenden Beispieldiagramm vergleichen wir zwei Designs. Zuerst haben wir ein mobiles Gerät mit Anwendungsprozessor (AP), integriertem DAC, Verstärker und analogem TRS-Anschluss, der an Kopfhörer angeschlossen ist. Wir betrachten auch ein mobiles Gerät mit USB, das an einen externen USB-DAC und -Verstärker angeschlossen ist, auch mit Kopfhörern.

DAC-Vergleich

Abbildung 3. Vergleich zweier DACs

Welches Design ist besser? Die Antwort hängt von Ihren Bedürfnissen ab. Jeder hat Vor- und Nachteile.

Hinweis: Dies ist ein künstlicher Vergleich, da ein echtes Android-Gerät wahrscheinlich beide Optionen zur Verfügung hätte.

Das erste Design A ist einfacher, kostengünstiger, verbraucht weniger Energie und wird ein zuverlässigeres Design sein, vorausgesetzt, dass ansonsten gleichermaßen zuverlässige Komponenten angenommen werden. Es gibt jedoch normalerweise Kompromisse bei der Audioqualität gegenüber anderen Anforderungen. Wenn es sich beispielsweise um ein Gerät für den Massenmarkt handelt, kann es so konzipiert sein, dass es den Bedürfnissen des allgemeinen Verbrauchers entspricht, nicht den Bedürfnissen von Audiophilen.

Beim zweiten Design kann das externe Audioperipheriegerät C für eine höhere Audioqualität und eine größere Ausgangsleistung ausgelegt werden, ohne die Kosten des einfachen Massenmarkt-Android-Geräts B zu beeinflussen. Ja, es ist ein teureres Design, aber die Kosten werden nur von absorbiert die es wollen.

Mobilgeräte sind dafür bekannt, dass sie Leiterplatten mit hoher Dichte haben, was zu mehr Möglichkeiten für Übersprechen führen kann, das benachbarte analoge Signale verschlechtert. Die digitale Kommunikation ist weniger anfällig für Rauschen . Wenn Sie also den DAC vom Android-Gerät A auf eine externe Platine C verschieben, können die letzten analogen Stufen physisch und elektrisch von der dichten und verrauschten Platine isoliert werden, was zu einer höheren Audioqualität führt.

Andererseits ist das zweite Design komplexer, und mit zusätzlicher Komplexität ergeben sich mehr Möglichkeiten, dass Dinge scheitern. Es gibt auch zusätzliche Latenz von den USB-Controllern.

Anwendungen im Hostmodus

Zu den typischen Audioanwendungen im USB-Hostmodus gehören:

  • Musik hören
  • Telefonie
  • Instant Messaging und Voice-Chat
  • Aufzeichnung

Für alle diese Anwendungen erkennt Android ein kompatibles digitales USB-Audioperipheriegerät und leitet die Audiowiedergabe und -aufnahme automatisch entsprechend den Regeln der Audiorichtlinie weiter. Stereoinhalte werden auf den ersten beiden Kanälen des Peripheriegeräts wiedergegeben.

Es gibt keine spezifischen APIs für digitales USB-Audio. Bei fortgeschrittener Nutzung kann das automatische Routing USB-fähige Anwendungen stören. Deaktivieren Sie für solche Anwendungen das automatische Routing über das entsprechende Steuerelement im Bereich Medien der Einstellungen / Entwickleroptionen .

Debugging im Host-Modus

Im USB-Host-Modus ist Adb-Debugging über USB nicht verfügbar. Siehe Abschnitt Drahtlose Nutzung von Android Debug Bridge für eine Alternative.

Implementieren von USB-Audio

Empfehlungen für Anbieter von Audio-Peripheriegeräten

Um mit Android-Geräten zusammenzuarbeiten, sollten Anbieter von Audio-Peripheriegeräten:

  • Design für die Einhaltung von Audioklassen; Derzeit zielt Android auf Klasse 1 ab, aber es ist ratsam, für Klasse 2 zu planen
  • Macken vermeiden
  • Test auf Interoperabilität mit Referenz- und beliebten Android-Geräten
  • Dokumentieren Sie die unterstützten Funktionen, die Einhaltung der Audioklassen, die Leistungsanforderungen usw. klar, damit die Verbraucher fundierte Entscheidungen treffen können

Empfehlungen für OEMs und SoC-Anbieter von Android-Geräten

Um digitales USB-Audio zu unterstützen, sollten Geräte-OEMs und SoC-Anbieter:

  • Design-Hardware zur Unterstützung des USB-Host-Modus
  • Aktivieren Sie die generische USB-Host-Unterstützung auf Framework-Ebene über das Feature-Flag android.hardware.usb.host.xml
  • Aktivieren Sie alle erforderlichen Kernelfunktionen: USB-Hostmodus, USB-Audio, isochroner Übertragungsmodus; siehe Android-Kernel-Konfiguration
  • über aktuelle Kernel-Versionen und -Patches auf dem Laufenden bleiben; Trotz des edlen Ziels der Klassenkonformität gibt es vorhandene Audio-Peripheriegeräte mit Macken , und neuere Kernel haben Problemumgehungen für solche Macken
  • Aktivieren Sie die USB-Audiorichtlinie wie unten beschrieben
  • fügen Sie audio.usb.default zu PRODUCT_PACKAGES in device.mk hinzu
  • Test auf Interoperabilität mit gängigen USB-Audio-Peripheriegeräten

So aktivieren Sie die USB-Audiorichtlinie

Um USB-Audio zu aktivieren, fügen Sie einen Eintrag zur Konfigurationsdatei der Audiorichtlinie hinzu. Diese befindet sich normalerweise hier:

device/oem/codename/audio_policy.conf

Die Pfadnamenkomponente „OEM“ sollte durch den Namen des OEM ersetzt werden, der das Android-Gerät herstellt, und „Codename“ sollte durch den Codenamen des Geräts ersetzt werden.

Ein Beispieleintrag ist hier dargestellt:

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
      }
    }
  }
  ...
}

Quellcode

Die Audio-Hardware Abstraction Layer (HAL)-Implementierung für USB-Audio befindet sich hier:

hardware/libhardware/modules/usbaudio/

Die USB - Audio - HAL stützt sich stark auf tinyalsa , beschrieben unter Audio - Terminologie . Obwohl USB-Audio auf isochrone Übertragungen angewiesen ist, wird dies durch die ALSA-Implementierung abstrahiert. Daher müssen sich USB-Audio-HAL und Tinyalsa nicht mit diesem Teil des USB-Protokolls befassen.

Testen von USB-Audio

Informationen zu CTS-Tests für USB-Audio finden Sie unter USB Audio CTS Verifier Tests .