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 USB-Digital-Audio-Interna auf Android suchen.
Endbenutzer von Nexus-Geräten sollten stattdessen den Artikel „Audio im USB-Host-Modus aufnehmen und wiedergeben“ im Nexus-Hilfecenter lesen. Obwohl sich dieser Artikel nicht an Endverbraucher richtet, könnten einige audiophile Verbraucher interessante Teile finden.
Übersicht über USB
Universal Serial Bus (USB) wird informell im Wikipedia-Artikel USB beschrieben und ist formal durch die vom USB Implementers Forum, Inc. veröffentlichten Standards definiert. Der Einfachheit halber fassen wir hier die wichtigsten USB-Konzepte zusammen, die Standards sind jedoch die maßgebliche Referenz.
Grundlegende Konzepte und Terminologie
USB ist ein Bus mit einem einzigen Initiator von Datenübertragungsvorgängen, dem sogenannten Host . Der Host kommuniziert über den Bus mit Peripheriegeräten .
Hinweis: Die Begriffe Gerät und Zubehör sind gebräuchliche Synonyme für Peripheriegeräte . Wir vermeiden diese Begriffe hier, da sie mit Android- Gerät oder dem Android-spezifischen Konzept namens Zubehörmodus verwechselt werden könnten.
Eine wichtige Rolle des Hosts ist die Aufzählung : der Prozess der Erkennung, welche Peripheriegeräte mit dem Bus verbunden sind, und der Abfrage 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 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 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 . Für die bidirektionale Steuerung und den Status wird eine Nachrichtenpipe verwendet. Für die unidirektionale Datenübertragung wird eine Stream-Pipe 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 im Zusammenhang mit Audio weiter besprochen.
Das Peripheriegerät kann über Terminals verfügen, die über das Peripheriegerät selbst 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 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 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 ermöglicht, ist in der Regel ein On-the-go-Adapter ( OTG ) wie dieser erforderlich:
![OTG](https://source.android.google.cn/static/docs/core/audio/images/otg.jpg?authuser=6&hl=de)
Abbildung 1. On-the-go (OTG)-Adapter
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 sich die Akkulaufzeit des Android-Geräts erheblich verkürzen. Verwenden Sie in diesen Situationen einen Hub mit eigener Stromversorgung wie diesen:
![Angetriebener Hub](https://source.android.google.cn/static/docs/core/audio/images/hub.jpg?authuser=6&hl=de)
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 und wird von einem anderen Gerät gesteuert, beispielsweise einer Dockingstation, die als Host fungiert. Der Unterschied zwischen Entwicklungsmodus und Zubehörmodus besteht darin, dass über ADB hinaus zusätzliche USB-Funktionen für den Host 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 um die unten beschriebene Audiofunktion.
USB-Audio
USB-Kurse
Jeder Peripheriefunktion ist ein Geräteklassendokument zugeordnet, das das Standardprotokoll für diese Funktion angibt. Dies ermöglicht die Zusammenarbeit zwischen klassenkonformen Hosts und Peripheriefunktionen, ohne dass detaillierte Kenntnisse über die Funktionsweise der anderen erforderlich sind. Die Klasseneinhaltung ist von entscheidender Bedeutung, wenn Host und Peripheriegerät von unterschiedlichen Einheiten bereitgestellt werden.
Der Begriff „treiberlos“ ist ein gebräuchliches Synonym für „ klassenkonform“ und bedeutet, dass es möglich ist, die Standardfunktionen eines solchen Peripheriegeräts zu nutzen, 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 befassen uns hier ausschließlich mit Peripheriegeräten, die Audiofunktionen implementieren und gehören somit zur Klasse der Audiogeräte. 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 möglicherweise mit der Audioklasse verwechselt werden. 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 dient. Für die Übertragung von Audiodateien können sowohl MSC als auch MTP verwendet werden, für Echtzeit-Streaming ist jedoch nur die USB-Audioklasse geeignet.
Audioterminals
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 ein digitales Signal umgewandelt und über das USB-Protokoll übertragen, um vom Host genutzt 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) es umwandelt und an einen analogen Ausgangsanschluss weitergibt. Der DAC ist eine Senke für den Host.
Kanäle
Ein Peripheriegerät mit Audiofunktion kann einen Quellanschluss, einen Senkenanschluss oder beides 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 Stereo-Stream so zu interpretieren, dass er aus linken und rechten Kanälen besteht, und im weiteren Sinne einen Mehrkanal-Stream so zu interpretieren, dass er räumliche Positionen aufweist, die jedem Kanal entsprechen. Es ist jedoch auch durchaus sinnvoll (besonders bei USB-Audio mehr als bei HDMI ), jedem Kanal keine bestimmte räumliche Standardbedeutung zuzuweisen. In diesem Fall liegt es an der Anwendung und dem Benutzer, zu definieren, wie jeder Kanal verwendet wird. Beispielsweise könnten bei einem vierkanaligen USB-Eingangsstream die ersten drei Kanäle an verschiedene Mikrofone in einem Raum angeschlossen sein und der letzte Kanal Eingaben von einem AM-Radio empfangen.
Isochroner Übertragungsmodus
USB-Audio verwendet wegen seiner Echtzeiteigenschaften den isochronen Übertragungsmodus, allerdings auf Kosten der Fehlerbehebung. Im isochronen Modus ist die Bandbreite garantiert und Datenübertragungsfehler werden mithilfe einer zyklischen Redundanzprüfung (CRC) erkannt. Im Fehlerfall erfolgt jedoch keine Paketbestätigung oder erneute Übertragung.
Isochrone Übertragungen erfolgen in jeder SOF-Periode (Start Of Frame). Die SOF-Periode beträgt eine Millisekunde bei voller Geschwindigkeit und 125 Mikrosekunden bei hoher Geschwindigkeit. Jeder Full-Speed-Frame trägt bis zu 1023 Byte Nutzlast, und ein High-Speed-Frame trägt bis zu 1024 Byte. Zusammengenommen errechnen wir eine maximale Übertragungsrate von 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 liegt niedriger.
Im 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 implizites Feedback genannt) bestimmt die Senke oder Quelle die Abtastrate und der Host passt sich an. Der primäre theoretische Vorteil des asynchronen Submodus besteht darin, dass der Quell- oder Senken-USB-Takt physisch und elektrisch näher an dem Takt liegt (und tatsächlich mit diesem identisch sein 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. Darüber hinaus 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 Submodus wird in jeder SOF-Periode eine feste Anzahl von Bytes übertragen. Die Audio-Abtastrate wird effektiv vom USB-Takt abgeleitet. Der synchrone Submodus wird bei Audio normalerweise nicht verwendet, da sowohl Host als auch Peripheriegeräte dem USB-Takt ausgeliefert sind.
Die folgende Tabelle fasst die isochronen Untermodi zusammen:
Untermodus | 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 Untermodus natürlich eine Rolle, es sollten aber auch andere Faktoren 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 USB-Audio-Klasse-1-Funktionen (UAC1):
- Das Android-Gerät muss als Host fungieren
- Das Audioformat muss PCM (Schnittstellentyp I) sein.
- 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 liegen
- 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) betragen.
Bei der Durchsicht des Android-Framework-Quellcodes 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
Mit Android 4.1 (API-Level 16) wurde eingeschränkte Unterstützung für die Audiowiedergabe auf dem Host 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 verfügt über folgende Funktionen:
- Das Android-Gerät muss von einem sachkundigen Host gesteuert werden, der das Android-Gerät zunächst 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 für den Host nicht „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 betragen (Stereo).
Audio im Zubehörmodus ist noch 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. Letztendlich muss jedes digitale Signal in ein analoges umgewandelt werden, bevor es gehört werden kann. Es gibt Kompromisse bei der Wahl, 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 einem an Kopfhörer angeschlossenen analogen TRS-Anschluss. Wir betrachten auch ein mobiles Gerät mit USB-Anschluss an einen externen USB-DAC und einen Verstärker, auch mit Kopfhörern.
![DAC-Vergleich](https://source.android.google.cn/static/docs/core/audio/images/dac.png?authuser=6&hl=de)
Abbildung 3. Vergleich zweier DACs
Welches Design ist besser? Die Antwort hängt von Ihren Bedürfnissen ab. Jedes 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 unter der Annahme, dass die Komponenten ansonsten genauso zuverlässig sind, zuverlässiger. Allerdings gibt es in der Regel Kompromisse bei der Audioqualität im Vergleich zu anderen Anforderungen. Wenn es sich beispielsweise um ein Massenmarktgerät handelt, ist es möglicherweise so konzipiert, dass es den Bedürfnissen des allgemeinen Verbrauchers und nicht den Bedürfnissen von Audiophilen entspricht.
Im zweiten Design kann das externe Audio-Peripheriegerät C für eine höhere Audioqualität und eine höhere Ausgangsleistung ausgelegt werden, ohne dass sich dies auf die Kosten des Basis-Massenmarkt-Android-Geräts B auswirkt. Ja, es handelt sich um ein teureres Design, aber die Kosten werden nur von übernommen diejenigen, die es wollen.
Mobilgeräte sind dafür bekannt, dass sie über eine hohe Leiterplattendichte verfügen, was zu mehr Möglichkeiten für Übersprechen führen kann, das benachbarte analoge Signale beeinträchtigt. Digitale Kommunikation ist weniger anfällig für Rauschen . Durch die Verlagerung des DAC vom Android-Gerät A auf eine externe Platine C können die letzten analogen Stufen physisch und elektrisch von der dichten und verrauschten Platine isoliert werden, was zu einer höheren Klangtreue führt.
Andererseits ist das zweite Design komplexer, und mit zunehmender Komplexität steigen die Möglichkeiten, dass etwas scheitert. Es gibt auch zusätzliche Latenz von den USB-Controllern.
Anwendungen im Host-Modus
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 USB-Digital-Audio-Peripheriegerät und leitet die Audiowiedergabe und -aufnahme automatisch entsprechend den Audio-Richtlinienregeln 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 Nutzung kann die automatische Weiterleitung USB-fähige Anwendungen beeinträchtigen. Deaktivieren Sie für solche Anwendungen die automatische Weiterleitung über das entsprechende Steuerelement im Abschnitt „Medien“ unter „Einstellungen/Entwickleroptionen“ .
Debuggen Sie im Host-Modus
Im USB-Hostmodus ist das ADB-Debugging über USB nicht verfügbar. Eine Alternative finden Sie im Abschnitt Drahtlose Nutzung von Android Debug Bridge .
Implementieren Sie USB-Audio
Empfehlungen für Anbieter von Audio-Peripheriegeräten
Um mit Android-Geräten zusammenarbeiten zu können, sollten Anbieter von Audio-Peripheriegeräten Folgendes tun:
- Design zur Einhaltung der Audioklasse; Derzeit zielt Android auf Klasse 1 ab, es ist jedoch ratsam, Klasse 2 einzuplanen
- Vermeiden Sie Macken
- Testen Sie die Interoperabilität mit Referenz- und beliebten Android-Geräten
- Dokumentieren Sie die unterstützten Funktionen, die Einhaltung der Audioklasse, den Strombedarf usw. klar und deutlich, damit Verbraucher fundierte Entscheidungen treffen können
Empfehlungen für Android-Geräte-OEMs und SoC-Anbieter
Um digitales USB-Audio zu unterstützen, sollten Geräte-OEMs und SoC-Anbieter Folgendes tun:
- 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 benötigten Kernel-Funktionen: USB-Host-Modus, USB-Audio, isochroner Übertragungsmodus; siehe Android-Kernelkonfiguration
- Bleiben Sie über aktuelle Kernel-Releases und Patches auf dem Laufenden; Trotz des hehren Ziels der Klassenkonformität gibt es vorhandene Audio-Peripheriegeräte mit Macken , und neuere Kernel verfügen über 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
- Testen Sie die Interoperabilität mit gängigen USB-Audio-Peripheriegeräten
Aktivieren Sie die USB-Audiorichtlinie
Um USB-Audio zu aktivieren, fügen Sie der Audiorichtlinien-Konfigurationsdatei einen Eintrag 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 Gerätecodenamen 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 finden Sie hier:
hardware/libhardware/modules/usbaudio/
Der USB-Audio-HAL basiert stark auf Tinyalsa , beschrieben unter Audio-Terminologie . Obwohl USB-Audio auf isochronen Übertragungen basiert, wird dies durch die ALSA-Implementierung abstrahiert. Daher müssen sich USB-Audio-HAL und Tinyalsa nicht um diesen Teil des USB-Protokolls kümmern.
Testen Sie USB-Audio
Informationen zu CTS-Tests für USB-Audio finden Sie unter USB Audio CTS Verifier Tests .