Google setzt sich dafür ein, die Rassengerechtigkeit für schwarze Gemeinschaften zu fördern. Siehe wie.
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

USB Digital Audio

In diesem Artikel wird die Android-Unterstützung für digitales USB-Audio und verwandte USB-basierte Protokolle beschrieben.

Publikum

Die Zielgruppe dieses Artikels sind OEMs von Android-Geräten, SoC-Anbieter, Anbieter von USB-Audio-Peripheriegeräten, fortgeschrittene Entwickler von Audioanwendungen und andere, die ein detailliertes Verständnis der digitalen USB-Audio-Interna für Android suchen.

Endbenutzer von Nexus-Geräten sollten den Artikel Aufnehmen und Wiedergeben von Audio im USB-Host-Modus stattdessen in der Nexus-Hilfe lesen. Obwohl sich dieser Artikel nicht an Endbenutzer richtet, können bestimmte audiophile Verbraucher Teile von Interesse finden.

Übersicht über USB

Universal Serial Bus (USB) wird im Wikipedia-Artikel USB informell beschrieben und 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 einzelnen Initiator von Datenübertragungsvorgängen, der als Host bezeichnet wird . Der Host kommuniziert mit Peripheriegeräten über den Bus.

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

Eine wichtige Host-Rolle ist die Aufzählung : 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, implementiert jedoch tatsächlich mehrere logische Funktionen . Beispielsweise könnte ein Webcam-Peripheriegerät sowohl eine Kamerafunktion als auch eine Mikrofon-Audiofunktion haben.

Jede Peripheriefunktion verfügt über eine Schnittstelle , die das Protokoll für die Kommunikation mit dieser Funktion definiert.

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

Es gibt zwei Arten von Pipes: Nachricht und Stream . Eine Nachrichtenleitung wird zur bidirektionalen Steuerung und zum Status verwendet. Eine Stream-Pipe 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 Hauptdatenübertragungsmodi: Interrupt , Bulk und isochron . Der isochrone Modus wird im Zusammenhang mit Audio weiter diskutiert.

Das Peripheriegerät kann Terminals haben , die über das Peripheriegerät hinaus mit der Außenwelt verbunden sind. Auf diese Weise dient das Peripheriegerät zur Übersetzung zwischen dem USB-Protokoll und "realen" Signalen. Die Terminals sind logische Objekte der Funktion.

Android USB-Modi

Entwicklungsmodus

Der Entwicklungsmodus ist seit der ersten Veröffentlichung von Android vorhanden. Das Android-Gerät wird als USB-Peripheriegerät für einen Host-PC angezeigt, 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 Protokolle fastboot und adb sind über den USB-Massendatenübertragungsmodus geschichtet.

Host-Modus

Der Host-Modus wird in Android 3.1 (API-Level 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 den Host-Betrieb nicht direkt zulässt, ist normalerweise ein OTG- Adapter (On-the-Go) erforderlich:

OTG

Abbildung 1. OTG-Adapter für unterwegs

Ein Android-Gerät bietet möglicherweise nicht genügend Strom, um ein bestimmtes Peripheriegerät zu betreiben. Dies hängt davon ab, wie viel Strom das Peripheriegerät benötigt und wie viel das Android-Gerät liefern kann. Selbst wenn ausreichend Strom zur Verfügung steht, kann die Akkuladung des Android-Geräts erheblich verkürzt werden. Verwenden Sie in diesen Situationen einen Hub mit Stromversorgung wie den folgenden:

Angetriebener Hub

Abbildung 2. Angetriebener Hub

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 und wird von einem anderen Gerät gesteuert, z. B. einem Dock, das als Host dient. Der Unterschied zwischen Entwicklungsmodus und 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 Neuverhandlungsprozess in den Zubehörmodus.

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

USB-Audio

USB-Klassen

Jeder Peripheriefunktion ist ein Geräteklassendokument zugeordnet , das das Standardprotokoll für diese Funktion angibt. Auf diese Weise können klassenkonforme Hosts und Peripheriefunktionen zusammenarbeiten, ohne die Funktionsweise des anderen genau zu kennen. Die Einhaltung von Klassen ist entscheidend, wenn Host und Peripheriegerät von verschiedenen Entitäten bereitgestellt werden.

Der Begriff treiberlos ist ein gebräuchliches Synonym für klassenkonform , was darauf hinweist, dass die Standardfunktionen eines solchen Peripheriegeräts verwendet werden können, ohne dass ein betriebssystemspezifischer Treiber installiert werden muss. Man kann davon ausgehen, dass ein Peripheriegerät, das für wichtige Desktop-Betriebssysteme als "kein Treiber erforderlich" angekündigt wird, klassenkonform ist, obwohl es Ausnahmen geben kann.

USB-Audioklasse

Hier beschäftigen wir uns nur mit Peripheriegeräten, die Audiofunktionen implementieren und somit der Audiogerätklasse entsprechen. Es gibt zwei Editionen der USB-Audioklassenspezifikation: Klasse 1 (UAC1) und 2 (UAC2).

Vergleich mit anderen Klassen

USB enthält 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.

Audio-Terminals

Die Anschlüsse eines Audio-Peripheriegeräts sind normalerweise analog. Das am Eingangsanschluss des Peripheriegeräts anliegende analoge Signal wird von einem Analog-Digital-Wandler (ADC) in digital umgewandelt und über das USB-Protokoll übertragen, das vom Host verwendet werden soll. 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 einem analogen Ausgangsanschluss präsentiert. Der DAC ist eine Senke für den Host.

Kanäle

Ein Peripheriegerät mit Audiofunktion kann ein Source-Terminal, ein Sink-Terminal oder beides enthalten. Jede Richtung kann einen Kanal ( Mono ), zwei Kanäle ( Stereo ) oder mehr haben. Peripheriegeräte mit mehr als zwei Kanälen werden als Mehrkanal bezeichnet . Es ist üblich, einen Stereostream so zu interpretieren, dass er aus linken und rechten Kanälen besteht, und einen Mehrkanalstrom dahingehend so zu interpretieren, dass er räumliche Positionen aufweist, die jedem Kanal entsprechen. Es ist jedoch auch durchaus angebracht (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. Beispielsweise können bei einem vierkanaligen USB-Eingangsstrom die ersten drei Kanäle an verschiedene Mikrofone in einem Raum angeschlossen sein und der letzte Kanal Eingang von einem AM-Radio empfangen.

Isochroner Übertragungsmodus

USB-Audio verwendet den isochronen Übertragungsmodus für seine Echtzeit-Eigenschaften auf Kosten der Fehlerbehebung. Im isochronen Modus wird die Bandbreite garantiert und Datenübertragungsfehler werden mithilfe einer zyklischen Redundanzprüfung (CRC) erkannt. Im Fehlerfall erfolgt jedoch keine Paketbestätigung oder Neuübertragung.

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

Im isochronen Modus gibt es drei Untermodi:

  • Adaptiv
  • Asynchron
  • Synchron

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

Im asynchronen Submodus (auch als implizite Rückkopplung bezeichnet) bestimmt die Senke oder Quelle die Abtastrate und der Host nimmt sie auf. Der primäre theoretische Vorteil des asynchronen Submodus besteht darin, dass der USB-Takt der Quelle oder Senke physisch und elektrisch näher an dem Takt liegt (und tatsächlich der gleiche sein kann oder von diesem abgeleitet sein kann), der den DAC oder ADC antreibt. Diese Nähe bedeutet, dass der asynchrone Submodus weniger anfällig für Taktjitter sein sollte. Zusätzlich kann der vom DAC oder ADC verwendete Takt für eine höhere Genauigkeit und geringere Drift als der Host-Takt ausgelegt sein.

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

Die folgende Tabelle fasst die isochronen Submodi zusammen:

Submodus Byteanzahl
pro Paket
Beispielrate
bestimmt durch
Wird für Audio verwendet
adaptiv Variable Gastgeber Ja
asynchron Variable peripher Ja
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 Teilmenge der Funktionen der USB-Audioklasse 1 (UAC1):

  • Das Android-Gerät muss als Host fungieren
  • Das Audioformat muss PCM sein (Schnittstellentyp I)
  • Die Bittiefe muss 16 Bit, 24 Bit oder 32 Bit betragen, wobei 24 Bit nützlicher Audiodaten innerhalb der höchstwertigen Bits des 32-Bit-Wortes linksbündig 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.

Bei Durchsicht des Quellcodes des Android-Frameworks wird möglicherweise zusätzlicher Code angezeigt, der über das zur Unterstützung dieser Funktionen erforderliche Minimum hinausgeht. Dieser Code wurde jedoch nicht validiert, sodass erweiterte Funktionen noch nicht beansprucht werden.

Zubehörmodus

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

Audio im Zubehörmodus bietet 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. Anschließend muss der Host Audiodaten vom entsprechenden Endpunkt übertragen. Somit erscheint das Android-Gerät dem Host nicht "treiberlos".
  • Die Richtung muss eingegeben werden , ausgedrückt relativ zum Host
  • 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 für neue Designs nicht empfohlen.

Anwendungen von digitalem USB-Audio

Wie der Name schon sagt, wird das digitale USB-Audiosignal durch einen digitalen Datenstrom dargestellt und nicht durch das analoge Signal, das vom gemeinsamen 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 Application Processor (AP), integriertem DAC, Verstärker und analogem TRS-Anschluss an Kopfhörer angeschlossen. Wir betrachten auch ein mobiles Gerät mit USB, das an einen externen USB-DAC und einen 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 auf einem echten Android-Gerät wahrscheinlich beide Optionen verfügbar wären.

Das erste Design A ist einfacher, kostengünstiger, verbraucht weniger Strom und ist ein zuverlässigeres Design, wenn ansonsten ebenso zuverlässige Komponenten vorausgesetzt werden. In der Regel gibt es jedoch Kompromisse bei der Audioqualität im Vergleich zu anderen Anforderungen. Wenn es sich beispielsweise um ein Massenmarktgerät handelt, kann es so konzipiert sein, dass es den Bedürfnissen des allgemeinen Verbrauchers und nicht des Audiophilen entspricht.

Beim zweiten Design kann das externe Audio-Peripheriegerät C für eine höhere Audioqualität und eine höhere Ausgangsleistung ausgelegt werden, ohne die Kosten des Android-Geräts B für den Massenmarkt zu beeinträchtigen. Ja, es ist ein teureres Design, aber die Kosten werden nur von übernommen diejenigen, die es wollen.

Mobile Geräte sind bekannt dafür, 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 den DAC vom Android-Gerät A auf eine externe Leiterplatte C verschieben, können die letzten analogen Stufen physisch und elektrisch von der dichten und verrauschten Leiterplatte isoliert werden, was zu Audio mit höherer Wiedergabetreue führt.

Auf der anderen Seite ist das zweite Design komplexer, und mit der zusätzlichen Komplexität ergeben sich mehr Möglichkeiten, dass Dinge versagen. Es gibt auch zusätzliche Latenz von den USB-Controllern.

Host-Modus-Anwendungen

Typische Audioanwendungen im USB-Host-Modus sind:

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

Bei all diesen Anwendungen erkennt Android ein kompatibles digitales USB-Audio-Peripheriegerä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 abgespielt.

Es gibt keine spezifischen APIs für digitales USB-Audio. Bei fortgeschrittener Verwendung kann das automatische Routing Anwendungen beeinträchtigen, die USB-fähig sind. Deaktivieren Sie für solche Anwendungen das automatische Routing über das entsprechende Steuerelement im Abschnitt Medien unter Einstellungen / Entwickleroptionen .

Debuggen im Host-Modus

Im USB-Host-Modus ist das ADB-Debugging über USB nicht verfügbar. Eine Alternative finden Sie im Abschnitt Drahtlose Nutzung von Android Debug Bridge .

USB-Audio implementieren

Empfehlungen für Anbieter von Audio-Peripheriegeräten

Um mit Android-Geräten zusammenarbeiten zu können, sollten Anbieter von Audio-Peripheriegeräten:

  • Design für die Einhaltung von Audioklassen; Derzeit zielt Android auf Klasse 1 ab, es ist jedoch ratsam, Klasse 2 zu planen
  • Vermeiden Sie Macken
  • Test auf Interoperabilität mit Referenz- und gängigen 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ätehersteller und SoC-Anbieter:

  • Entwerfen Sie 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-Host-Modus, USB-Audio, isochroner Übertragungsmodus; Siehe Android-Kernel-Konfiguration
  • Bleiben Sie über die neuesten Kernel-Releases und Patches auf dem Laufenden. Trotz des noblen 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-Audio-Richtlinie 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

Fügen Sie der Aktivierungsdatei für die Audiorichtlinie einen Eintrag hinzu, um USB-Audio zu aktivieren. Dies befindet sich normalerweise hier:

device/oem/codename/audio_policy.conf

Die Pfadnamenskomponente "oem" sollte durch den Namen des OEM ersetzt werden, der das Android-Gerät herstellt, und "Codename" sollte durch den Gerätecode ersetzt werden.

Ein Beispieleintrag wird hier gezeigt:

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 HAL-Implementierung (Audio Hardware Abstraction Layer) für USB-Audio finden Sie hier:

hardware/libhardware/modules/usbaudio/

Das USB-Audio-HAL basiert stark auf tinyalsa , wie unter Audio Terminology beschrieben . Obwohl USB-Audio auf isochronen Übertragungen beruht, wird dies durch die ALSA-Implementierung abstrahiert. Das USB-Audio HAL und tinyalsa müssen sich also nicht mit diesem Teil des USB-Protokolls befassen.

USB-Audio testen

Informationen zum CTS-Testen auf USB-Audio finden Sie unter USB-Audio-CTS-Verifizierertests .