In diesem Artikel wird die Android-Unterstützung für digitales USB-Audio und zugehörige USB-basierte Protokolle beschrieben.
Zielgruppe
Dieser Artikel richtet sich an OEMs von Android-Geräten, SoC-Anbieter, Anbieter von USB-Audioperipheriegeräten, Entwickler von erweiterten Audioanwendungen und andere, die detaillierte Informationen zu den internen Funktionen von digitaler USB-Audiotechnologie auf Android-Geräten benötigen.
Endnutzer von Nexus-Geräten sollten stattdessen den Artikel Audio im USB-Host-Modus aufnehmen und wiedergeben in der Nexus-Hilfe lesen. Auch wenn dieser Artikel nicht auf Endnutzer ausgerichtet ist, finden bestimmte audiophile Nutzer möglicherweise interessante Informationen.
USB – Übersicht
Der Universal Serial Bus (USB) wird im Wikipedia-Artikel USB informell beschrieben und formell durch die vom USB Implementers Forum, Inc veröffentlichten Standards definiert. Im Folgenden fassen wir die wichtigsten USB-Konzepte zusammen. Die Standards sind jedoch die maßgebliche Referenz.
Grundlegende Konzepte und Terminologie
USB ist ein Bus mit einem einzelnen Initiator von Datenübertragungsvorgängen, dem Host. Der Host kommuniziert über den Bus mit Peripheriegeräten.
Hinweis:Die Begriffe Gerät und Zubehör sind gängige Synonyme für Peripheriegerät. Wir vermeiden diese Begriffe hier, da sie mit einem Android-Gerät oder dem Android-spezifischen Konzept Zubehörmodus verwechselt werden könnten.
Eine wichtige Rolle des Hosts ist die Aufzählung: Dabei wird ermittelt, welche Peripheriegeräte mit dem Bus verbunden sind, und ihre Eigenschaften werden über Beschreibungen abgefragt.
Ein Peripheriegerät kann ein physisches Objekt sein, aber mehrere logische Funktionen implementieren. Ein Webcam-Peripheriegerät kann beispielsweise sowohl eine Kamerafunktion als auch eine Mikrofon-Audiofunktion haben.
Jede Peripheriefunktion hat eine Schnittstelle, die das Protokoll für die Kommunikation mit dieser Funktion definiert.
Der Host kommuniziert über eine Pipe mit einem Endpunkt, einer Datenquelle oder einem Datensenke, die von einer der Funktionen des Peripheriegeräts bereitgestellt wird.
Es gibt zwei Arten von Pipes: Nachrichten- und Streams. Eine Nachrichten-Pipe wird für die bidirektionale Steuerung und den Status verwendet. Eine Stream-Pipe wird für die unidirektionale Datenübertragung verwendet.
Der Host initiiert alle Datenübertragungen. Daher beziehen sich die Begriffe Eingabe und Ausgabe auf den Host. Bei einem Eingabevorgang werden Daten vom Peripheriegerät an den Host übertragen, während bei einem Ausgabevorgang Daten vom Host an das Peripheriegerät übertragen werden.
Es gibt drei Hauptmodi für die Datenübertragung: unterbrochene, Bulk- und isochrone Übertragung. Der isochrone Modus wird im Zusammenhang mit Audio weiter erläutert.
Das Peripheriegerät kann Terminals haben, die über das Peripheriegerät hinaus eine Verbindung zur Außenwelt herstellen. So dient das Peripheriegerät als Übersetzer zwischen dem USB-Protokoll und den Signalen der „realen Welt“. Die Enden sind logische Objekte der Funktion.
USB-Modi unter Android
Entwicklungsmodus
Der Entwicklungsmodus ist seit der ersten Version von Android verfügbar. Das Android-Gerät wird einem Host-PC mit einem Desktop-Betriebssystem wie Linux, Mac OS X oder Windows als USB-Peripheriegerät angezeigt. Die einzige sichtbare Peripheriefunktion ist entweder Android Fastboot oder Android Debug Bridge (adb). Die Fastboot- und ADB-Protokolle werden über den USB-Bulk-Datenübertragungsmodus geschicht.
Hostmodus
Der Host-Modus wurde in Android 3.1 (API-Level 12) eingeführt.
Da das Android-Gerät als Host fungieren muss und die meisten Android-Geräte einen Micro-USB-Anschluss haben, der den Hostbetrieb nicht direkt zulässt, 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=7&hl=de)
Abbildung 1: On-the-go-Adapter (OTG)
Je nachdem, wie viel Strom das Peripheriegerät benötigt und wie viel das Android-Gerät liefern kann, reicht die Stromversorgung eines Android-Geräts möglicherweise nicht aus, um ein bestimmtes Peripheriegerät zu betreiben. Auch wenn ausreichend Strom verfügbar ist, kann sich die Akkulaufzeit des Android-Geräts deutlich verkürzen. Verwenden Sie in diesen Fällen einen Hub mit Stromversorgung, z. B. diesen:
![Netzbetriebener Hub](https://source.android.google.cn/static/docs/core/audio/images/hub.jpg?authuser=7&hl=de)
Abbildung 2: Netzbetriebener Hub
Accessory-Modus
Der Zubehörmodus wurde in Android 3.1 (API-Level 12) eingeführt und auf Android 2.3.4 zurückportiert. In diesem Modus wird das Android-Gerät als USB-Peripheriegerät betrieben und von einem anderen Gerät wie einem Dock gesteuert, das als Host dient. Der Unterschied zwischen dem Entwicklungsmodus und dem Zubehörmodus besteht darin, dass dem Host neben adb zusätzliche USB-Funktionen angezeigt werden. Das Android-Gerät startet 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 Audiofunktionen, die unten beschrieben werden.
USB-Audio
USB-Klassen
Jede Peripheriefunktion ist einem Dokument der Geräteklasse zugeordnet, das das Standardprotokoll für diese Funktion angibt. So können klassenkonforme Hosts und Peripheriefunktionen ohne detailliertes Wissen über die Funktionsweise des jeweils anderen miteinander interagieren. Die Einhaltung der Klassenanforderungen ist wichtig, wenn Host und Peripheriegerät von verschiedenen Unternehmen bereitgestellt werden.
Der Begriff treiberlos ist ein gängiges Synonym für klassekonform und gibt an, dass die Standardfunktionen eines solchen Peripheriegeräts verwendet werden können, ohne dass ein betriebssystemspezifischer Treiber installiert werden muss. Es kann davon ausgegangen werden, dass ein Peripheriegerät, das für gängige Desktop-Betriebssysteme als „kein Treiber erforderlich“ beworben wird, klassenkonform ist. Es kann jedoch Ausnahmen geben.
USB-Audioklasse
Hier geht es nur um Peripheriegeräte, die Audiofunktionen implementieren und daher der Audiogeräteklasse entsprechen. Es gibt zwei Versionen der USB-Audio-Klassen-Spezifikation: 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 Mass Storage Class (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 für die Übertragung von Audiodateien verwendet werden, aber nur die USB Audio Class ist für das Echtzeit-Streaming geeignet.
Audioendgeräte
Die Anschlüsse eines Audio-Peripheriegeräts sind in der Regel analog. Das analoge Signal, das am Eingangsanschluss des Peripheriegeräts anliegt, wird von einem Analog-Digital-Wandler (ADC) in ein digitales Signal umgewandelt und über das USB-Protokoll an den Host übertragen. Der ADC ist eine Datenquelle für den Host. Ebenso sendet der Host ein digitales Audiosignal über das USB-Protokoll an das Peripheriegerät, wo es von einem Digital-Analog-Wandler (DAC) in ein analoges Ausgangssignal umgewandelt wird. Der DAC ist ein Senke für den Host.
Kanäle
Ein Peripheriegerät mit Audiofunktion kann ein Quell- oder ein Senk-Terminal oder beides enthalten. Jede Richtung kann einen (Mono), zwei (Stereo) oder mehr Kanäle haben. Peripheriegeräte mit mehr als zwei Kanälen werden als Multi-Channel bezeichnet. Normalerweise wird ein Stereostream als aus linkem und rechtem Kanal bestehend interpretiert. Im Umkehrschluss wird ein Mehrkanalstream als mit räumlichen Positionen interpretiert, die den einzelnen Kanälen entsprechen. Es ist jedoch auch durchaus angemessen (insbesondere bei USB-Audio, weniger bei HDMI), jedem Kanal keine bestimmte standardmäßige räumliche Bedeutung zuzuweisen. In diesem Fall liegt es an der Anwendung und dem Nutzer, zu definieren, wie die einzelnen Kanäle verwendet werden. Bei einem vierkanaligen USB-Eingabestream sind beispielsweise die ersten drei Kanäle an verschiedene Mikrofone in einem Raum angeschlossen und der letzte Kanal empfängt Eingaben von einem AM-Radio.
Isochroner Übertragungsmodus
USB-Audio verwendet den isochronen Übertragungsmodus für seine Echtzeiteigenschaften, was jedoch zu Lasten der Fehlerwiederherstellung geht. Im isochronen Modus ist die Bandbreite garantiert und Datenübertragungsfehler werden mithilfe einer Cyclic Redundancy Check (CRC) erkannt. Es gibt jedoch keine Paketbestätigung oder ‑Wiedergabe bei Fehlern.
Isochrone Übertragungen erfolgen bei jedem SOF-Zeitraum (Start Of Frame). Die SOF-Periode beträgt eine Millisekunde bei voller Geschwindigkeit und 125 Mikrosekunden bei hoher Geschwindigkeit. Jeder Full-Speed-Frame kann bis zu 1.023 Byte Nutzlast und ein High-Speed-Frame bis zu 1.024 Byte Nutzlast enthalten. Zusammengenommen ergibt sich eine maximale Übertragungsrate von 1.023.000 oder 8.192.000 Byte pro Sekunde. Dadurch wird eine theoretische Obergrenze für die kombinierte Audio-Stichprobenrate, die Kanalanzahl und die Bittiefe festgelegt. Die praktische Grenze ist niedriger.
Im isochronen Modus gibt es drei Untermodi:
- Adaptiv
- Asynchron
- Synchron
Im adaptiven Untermodus passt sich die Peripherie-Senke oder ‑Quelle an eine potenziell schwankende Abtastrate des Hosts an.
Im asynchronen Untermodus (auch als implizites Feedback bezeichnet) wird die Abtastrate vom Ziel oder der Quelle bestimmt und der Host passt sich an. Der Hauptvorteil des asynchronen Sub-Modus besteht darin, dass die USB-Taktgeber der Quelle oder des Sinks physisch und elektrisch näher an der Taktfrequenz liegen, die den DAC oder ADC antreibt (und tatsächlich mit dieser identisch sein oder von ihr abgeleitet werden kann). Aufgrund dieser Nähe sollte der asynchrone Untermodus weniger anfällig für Taktstörungen sein. Außerdem kann die vom DAC oder ADC verwendete Uhr für eine höhere Genauigkeit und eine geringere Abweichung ausgelegt sein als die Hostuhr.
Im synchronen Untermodus wird in jedem SOF-Zeitraum eine feste Anzahl von Byte übertragen. Die Audio-Abtastrate wird effektiv von der USB-Taktzeit abgeleitet. Der synchrone Untermodus wird bei Audiogeräten nicht häufig verwendet, da sowohl der Host als auch das Peripheriegerät von der USB-Taktzeit abhängig sind.
In der folgenden Tabelle sind die isochronen Untermodi zusammengefasst:
Untermodus | Byteanzahl pro Paket |
Abtastrate bestimmt durch |
Für Audio verwendet |
---|---|---|---|
intelligente | variabel | Gastgeber | Ja |
asynchron | variabel | Peripheriegerät | Ja |
synchron | fix | USB-Uhr | no |
In der Praxis spielt der Untermodus natürlich eine Rolle, aber auch andere Faktoren sollten berücksichtigt werden.
Android-Unterstützung für USB Audio Class
Entwicklungsmodus
USB-Audio wird im Entwicklungsmodus nicht unterstützt.
Hostmodus
Android 5.0 (API-Level 21) und höher unterstützt einen Teil der Funktionen der USB Audio Class 1 (UAC1):
- Das Android-Gerät muss als Host fungieren
- Das Audioformat muss PCM (Schnittstellentyp I) sein.
- Die Bittiefe muss 16, 24 oder 32 Bit betragen. Dabei sind 24 Bit nützlicher Audiodaten linksbündig innerhalb der höchstwertigen Bits des 32‑Bit-Worts ausgerichtet.
- 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 der Durchsicht des Android-Framework-Quellcodes wird möglicherweise zusätzlicher Code angezeigt, der über das Minimum hinausgeht, das für die Unterstützung dieser Funktionen erforderlich ist. Dieser Code wurde jedoch noch nicht validiert, sodass erweiterte Funktionen noch nicht in Anspruch genommen werden können.
Accessory-Modus
Mit Android 4.1 (API-Ebene 16) wurde die Unterstützung für die Audiowiedergabe auf dem Host eingeschränkt. Im Zubehörmodus leitet Android die Audioausgabe automatisch an USB weiter. Das Android-Gerät dient also als Datenquelle für den Host, z. B. ein Dock.
Der Lautsprecher im Zubehörmodus bietet folgende Funktionen:
- Das Android-Gerät muss von einem erfahrenen Host gesteuert werden, der es zuerst aus dem Entwicklungsmodus in den Zubehörmodus versetzen und dann Audiodaten vom entsprechenden Endpunkt übertragen kann. Daher wird das Android-Gerät für den Host nicht als „ohne Treiber“ angezeigt.
- Die Richtung muss input sein, relativ zum Host ausgedrückt.
- Das Audioformat muss 16-Bit-PCM sein.
- Die Abtastrate muss 44,1 kHz betragen.
- Die Kanalanzahl muss 2 (Stereo) sein.
Der Audiomodus für Zubehör ist nicht weit verbreitet und wird derzeit nicht für neue Designs empfohlen.
Anwendungen von USB-Digitalaudio
Wie der Name schon sagt, wird das digitale USB-Audiosignal durch einen digitalen Datenstream dargestellt, nicht durch das analoge Signal, das vom gängigen TRS-Mini-Headsetanschluss verwendet wird. Letztendlich muss jedes digitale Signal in ein analoges Signal umgewandelt werden, bevor es gehört werden kann. Die Entscheidung, wo diese Conversion platziert werden soll, ist nicht ganz einfach.
Zwei DACs im Vergleich
Im Beispieldiagramm unten werden zwei Designs verglichen. Zuerst haben wir ein Mobilgerät mit einem Anwendungsprozessor (AP), einem integrierten DAC, einem Verstärker und einem analogen TRS-Anschluss, der mit Kopfhörern verbunden ist. Wir berücksichtigen auch ein Mobilgerät, das über USB mit einem externen USB-DAC und einem Verstärker verbunden ist, auch mit Kopfhörern.
![DAC-Vergleich](https://source.android.google.cn/static/docs/core/audio/images/dac.png?authuser=7&hl=de)
Abbildung 3: Vergleich von zwei DACs
Welches Design ist besser? Die Antwort hängt von Ihren Anforderungen ab. Beide haben 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 Energie und ist bei ansonsten gleich zuverlässigen Komponenten zuverlässiger. Allerdings gibt es in der Regel Kompromisse zwischen der Audioqualität und anderen Anforderungen. Wenn es sich beispielsweise um ein Gerät für den Massenmarkt handelt, ist es möglicherweise auf die Bedürfnisse der Allgemeinheit und nicht auf die Anforderungen von Audiophilen ausgelegt.
Beim zweiten Design kann das externe Audio-Peripheriegerät C für eine höhere Audioqualität und eine höhere Leistungsabgabe ausgelegt werden, ohne dass sich das auf die Kosten des einfachen Android-Geräts B für den Massenmarkt auswirkt. Ja, es ist ein teureres Design, aber die Kosten werden nur von denjenigen getragen, die es haben möchten.
Mobilgeräte sind dafür bekannt, dass sie Leiterplatten mit hoher Dichte haben. Dies kann zu mehr Übersprechen führen, das benachbarte analoge Signale beeinträchtigt. Die digitale Kommunikation ist weniger anfällig für Störungen. Wenn der DAC vom Android-Gerät A auf eine externe Platine C verschoben wird, können die letzten analogen Stufen physisch und elektrisch von der dichten und lauten Platine isoliert werden, was zu einer höheren Audioqualität führt.
Das zweite Design ist jedoch komplexer und mit mehr Komplexität steigt auch die Wahrscheinlichkeit von Fehlern. Außerdem kommt es durch die USB-Controller zu zusätzlicher Latenz.
Anwendungen im Hostmodus
Zu den typischen Audioanwendungen im USB-Hostmodus gehören:
- Musikwiedergabe
- Telefonie
- Instant Messaging und Sprachchat
- nimmst
Bei allen diesen Anwendungen erkennt Android ein kompatibles digitales USB-Audiogerät und leitet die Audiowiedergabe und -aufnahme automatisch entsprechend den Audiorichtlinien weiter. Stereoinhalte werden auf den ersten beiden Kanälen des Peripheriegeräts wiedergegeben.
Es gibt keine APIs speziell für digitales USB-Audio. Bei erweiterter Nutzung kann das automatische Routing mit USB-kompatiblen Anwendungen in Konflikt stehen. Deaktivieren Sie für solche Anwendungen die automatische Weiterleitung über das entsprechende Steuerelement im Bereich „Medien“ unter Einstellungen / Entwickleroptionen.
Im Hostmodus debuggen
Im USB-Host-Modus ist das ADB-Debugging über USB nicht verfügbar. Eine Alternative finden Sie im Abschnitt Drahtlose Nutzung der Android Debug Bridge.
USB-Audio implementieren
Empfehlungen für Anbieter von Audioperipheriegeräten
Damit Audioperipheriegeräte mit Android-Geräten interagieren können, sollten Anbieter Folgendes beachten:
- Audioklasse einhalten; derzeit ist Android auf Klasse 1 ausgerichtet, es ist jedoch ratsam, für Klasse 2 zu planen
- Unregelmäßigkeiten vermeiden
- Kompatibilität mit Referenz- und gängigen Android-Geräten testen
- unterstützte Funktionen, Einhaltung der Audioklasse, Stromanforderungen usw. klar dokumentieren, damit Verbraucher fundierte Entscheidungen treffen können
Empfehlungen für OEMs und SoC-Anbieter von Android-Geräten
Um digitales USB-Audio zu unterstützen, müssen Geräte-OEMs und SoC-Anbieter Folgendes tun:
- Hardware für den USB-Host-Modus entwerfen
- Unterstützung für generischen USB-Host auf Frameworkebene über das
android.hardware.usb.host.xml
-Funktionsflag aktivieren - Aktivieren Sie alle erforderlichen Kernelfunktionen: USB-Hostmodus, USB-Audio, isochroner Übertragungsmodus.
- Halten Sie sich über aktuelle Kernel-Releases und -Patches auf dem Laufenden. Trotz des noblen Ziels der Einhaltung der Klassenanforderungen gibt es vorhandene Audioperipheriegeräte mit Eigenheiten. Aktuelle Kernel bieten Lösungen für solche Probleme.
- Aktivieren Sie die USB-Audiorichtlinie wie unten beschrieben.
- Fügen Sie in device.mk „audio.usb.default“ zu PRODUCT_PACKAGES hinzu.
- Interoperabilität mit gängigen USB-Audioperipheriegeräten testen
USB-Audiorichtlinie aktivieren
Wenn Sie USB-Audio aktivieren möchten, fügen Sie der Konfigurationsdatei der Audiorichtlinie einen Eintrag hinzu. Sie finden sie in der Regel hier:
device/oem/codename/audio_policy.conf
Die Pfadkomponente „oem“ sollte durch den Namen des OEM ersetzt werden, der das Android-Gerät herstellt, und „codename“ durch den Gerätecodenamen.
Hier ein Beispieleintrag:
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 Implementierung der Audio-Hardwareabstraktionsschicht (HAL) für USB-Audio finden Sie hier:
hardware/libhardware/modules/usbaudio/
Der USB-Audio-HAL stützt sich stark auf tinyalsa, das unter Audioterminologie beschrieben wird. USB-Audio basiert zwar auf isochronen Übertragungen, diese werden jedoch von der ALSA-Implementierung abstrahiert. Daher müssen sich die USB Audio HAL und tinyalsa nicht um diesen Teil des USB-Protokolls kümmern.
USB-Audio testen
Informationen zu CTS-Tests für USB-Audio finden Sie unter USB Audio CTS Verifier Tests.