In diesem Artikel geht es um die Android-Unterstützung für digitale USB-Audioinhalte und zugehörige USB-basierte Protokolle.
Zielgruppe
Dieser Artikel richtet sich an OEMs Android-Geräte, SoC-Anbieter, Anbieter von USB-Audio-Peripheriegeräten, Entwickler erweiterter Audioanwendungen und andere, die mehr über das interne USB-Audio auf Android-Geräten erfahren möchten.
Endnutzer von Nexus-Geräten sollten den Artikel lesen. Audio im USB-Hostmodus aufzeichnen und wiedergeben im Nexus-Hilfe. Obwohl sich dieser Artikel nicht an Endnutzer richtet, dass bestimmte audiophile Nutzer auf Teile von Interesse stoßen.
Übersicht über USB
Universal Serial Bus (USB) wird im Wikipedia-Artikel informell beschrieben. USB und ist formell definiert durch die vom USB Implementers Forum, Inc. Der Einfachheit halber fassen wir die wichtigsten USB-Konzepte hier zusammen: aber die Standards sind die maßgebliche Referenz.
Grundlegende Konzepte und Terminologie
USB ist ein Bus mit einem einzigen Initiator von Datenübertragungsvorgängen, dem sogenannten Host. Der Organisator kommuniziert mit Peripheriegeräte.
Hinweis:Die Begriffe Gerät und Zubehör werden häufig synonym verwendet für Peripheriegerät. Wir vermeiden diese Begriffe an dieser Stelle, da sie mit Android-Gerät oder das Android-spezifische Konzept namens Zubehörmodus aktivieren.
Eine kritische Hostrolle ist die Aufzählung: der Erkennung, welche Peripheriegeräte mit dem Bus verbunden sind, und die über Deskriptoren ausgedrückten Attribute abfragen.
Ein Peripheriegerät kann ein physisches Objekt sein. sondern mehrere logische Funktionen implementieren. Beispielsweise kann ein Webcam-Peripheriegerät sowohl eine Kamerafunktion als auch Mikrofon-Audiofunktion.
Jede Peripheriefunktion hat eine Schnittstelle, die definiert das Protokoll zur Kommunikation mit dieser Funktion.
Der Host kommuniziert mit einem Peripheriegerät über senkrechter Strich zu einem Endpunkt, Datenquelle oder -senke die durch eine der Funktionen des Peripheriegeräts bereitgestellt werden.
Es gibt zwei Arten von Pipes: message und stream. Eine Nachrichtenpipeline 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 werden die Begriffe Eingabe und Ausgabe relativ zum Host ausgedrückt. 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: Unterbrechung, Bulk und Isochron. Der isochronische Modus wird im Kontext von Audio näher erläutert.
Das Peripheriegerät kann Terminals haben, die mit der Außenwelt verbunden sind. über das Peripheriegerät hinaus. So wird das Peripheriegerät zwischen dem USB-Protokoll und der realen Welt zu übertragen. Signale. Die Terminals sind logische Objekte der Funktion.
Android-USB-Modi
Entwicklungsmodus
Der Entwicklermodus ist seit der ersten Android-Version vorhanden. Das Android-Gerät wird als USB-Peripheriegerät angezeigt. auf einem Host-PC mit einem Desktop-Betriebssystem wie Linux, Mac OS X oder Windows. Die einzige sichtbare Peripheriefunktion ist entweder Fastboot (Android) oder Android Debug Bridge (ADB): Die Fastboot- und ADB-Protokolle sind über den USB-Bulk-Datenübertragungsmodus angeordnet.
Hostmodus
Der Hostmodus wird mit Android 3.1 (API-Ebene 12) eingeführt.
Da das Android-Gerät als Host fungieren muss und die meisten Android-Geräte einen Micro-USB-Stecker, der den Host-Betrieb nicht direkt zulässt, einen OTG-Adapter (für unterwegs) wie diese ist normalerweise erforderlich:
Ein Android-Gerät wird möglicherweise nicht ausreichend mit Strom versorgt, um ein Gerät zu betreiben. je nachdem, wie viel Leistung das Peripheriegerät benötigt, und wie viel das Android-Gerät liefern kann. Selbst wenn ausreichend Strom verfügbar ist, kann der Akku des Android-Geräts deutlich verkürzt werden. Verwenden Sie in diesen Situationen eine hub so an:
Zubehörmodus
Der Zubehörmodus wurde mit 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, ein anderes Gerät gesteuert, z. B. ein Dock, das als Host dient. Unterschied zwischen Entwicklungsmodus und Zubehörmodus dass der Host neben ADB noch zusätzliche USB-Funktionen sehen kann. Das Android-Gerät startet im Entwicklungsmodus und durch eine Neuverhandlung in den Zubehörmodus wechselt.
Der Zubehörmodus wurde in Android 4.1 um zusätzliche Funktionen erweitert, insbesondere die unten beschriebenen Audioinhalte.
USB-Audio
USB-Kurse
Jede Peripheriefunktion ist mit einem Dokument zur Geräteklasse verknüpft das das Standardprotokoll für diese Funktion angibt. Dies ermöglicht klassenkonforme Hosts und Peripheriefunktionen ohne detailliertes Wissen über die Arbeit der anderen zusammenzuarbeiten. Die Klassencompliance ist wichtig, wenn Host und Peripheriegerät von verschiedenen Entitäten.
Der Begriff treiberlos ist ein gängiges Synonym für Klassenkonform, dass es möglich ist, die Standardfunktionen eines solchen Peripheriegerät, ohne dass ein betriebssystemspezifisches Treiber, der installiert werden soll. Man kann davon ausgehen, dass ein Peripheriegerät als „kein Treiber erforderlich“ angegeben wird. für die wichtigsten Desktop-Betriebssysteme sind klassenkonform, es kann jedoch auch Ausnahmen geben.
USB-Audiokurs
Hier geht es nur um Peripheriegeräte, die Audiofunktionen und entsprechen somit der Audiogeräteklasse. Es gibt zwei der USB-Audioklasse: Klasse 1 (UAC1) und 2 (UAC2).
Vergleich mit anderen Klassen
USB umfasst viele andere Geräteklassen, von denen einige möglicherweise verwechselt werden können mit dem Audio-Kurs. Die Massenspeicherklasse (MSC) wird für branchenorientierten Zugang zu Medien, während Media Transfer Protocol (MTP) steht für den vollständigen Dateizugriff auf Medien. Sowohl MSC als auch MTP können zur Übertragung von Audiodateien verwendet werden, aber nur die USB-Audioklasse eignet sich für Echtzeitstreaming.
Audioanschlüsse
Die Anschlüsse eines Audio-Peripheriegeräts sind in der Regel analog. Das analoge Signal am Eingabeanschluss des Peripheriegeräts wird von einem Analog-Digital-Wandler (ADC) und wird über ein USB-Protokoll übertragen, den Organisator. Der ADC ist eine Datenquelle, für den Organisator. Entsprechend sendet der Host eine ein digitales Audiosignal per USB-Protokoll an das Peripheriegerät. Digital-zu-Analog-Konverter (DAC) konvertiert und präsentiert in ein analoges Ausgabeterminal. Der DAC ist eine Senke für den Host.
Kanäle
Ein Peripheriegerät mit Audiofunktion kann einen Quellanschluss, einen Senkenanschluss oder beides haben. Für jede Richtung kann es einen Kanal (Mono), zwei Kanäle geben (stereo) oder höher. Peripheriegeräte mit mehr als zwei Kanälen werden als Multi-Channel bezeichnet. Stereo-Streams werden oft so interpretiert, als bestehend linken und rechten Kanälen. Außerdem wird ein Stream über mehrere Kanäle so interpretiert, dass räumlichen Orten, die dem jeweiligen Kanal entsprechen. Es ist jedoch auch angemessen, (insbesondere bei USB-Audio mehr als bei HDMI) keine bestimmten die standardmäßige räumliche Bedeutung für jeden Kanal verwendet. In diesem Fall muss der Anwendung und Nutzer, um festzulegen, wie die einzelnen Channels verwendet werden. Bei einem vierkanaligen USB-Eingang können beispielsweise die ersten drei an die verschiedenen Mikrofone in einem Raum angeschlossen. Der letzte Kanal, der Input von einem AM-Radio empfängt.
Isochroner Übertragungsmodus
USB-Audio verwendet den isochronen Übertragungsmodus für seine Echtzeiteigenschaften, auf Kosten der Fehlerbehebung. Im isochronen Modus ist Bandbreite garantiert und die Datenübertragung werden Fehler mithilfe einer zyklischen Redundanzprüfung (Cyclic Redundant Check, CRC) erkannt. Aber es gibt keine Paketbestätigung oder erneute Übertragung im Falle eines Fehlers erfolgt.
Isochron Übertragungen erfolgen an jeder Start-of-Frame-Periode (SOF). Die SOF-Periode beträgt bei voller Geschwindigkeit eine Millisekunde und bei 125 Mikrosekunden mit hoher Geschwindigkeit. Jeder Frame mit voller Geschwindigkeit überträgt bis zu 1.023 Byte an Nutzlast, und ein Hochgeschwindigkeits-Frame überträgt bis zu 1.024 Byte. Durch diese Kombination berechnen wir die maximale Übertragungsrate mit 1.023.000 oder 8.192.000 Byte pro Sekunde. Damit wird eine theoretische Obergrenze für die kombinierten Audiodaten festgelegt. Abtastrate, Kanalanzahl und Bittiefe. Die praktikable Begrenzung ist niedriger.
Im isochronen Modus gibt es drei Untermodi:
- Adaptiv
- Asynchron
- Synchron
Im adaptiven Untermodus passt sich die Peripheriesenke oder -quelle an eine potenziell variierende Abtastrate an des Hosts.
Im asynchronen Untermodus (auch implizites Feedback genannt) Die Senke oder Quelle bestimmt die Stichprobenrate und der Host nimmt dies vor. Der primäre theoretische Vorteil des asynchronen Untermodus besteht darin, dass die Quelle die USB-Uhr physisch und elektrisch näher an dem mit dem Takt des DAC oder ADC identisch sein oder davon abgeleitet werden. Durch diese Nähe sollte der asynchrone Untermodus weniger anfällig sein. bis zum Taktjitter. Außerdem kann die vom DAC oder ADC verwendete Uhr sind für eine höhere Genauigkeit und geringere Drift als die Hostuhr ausgelegt.
Im synchronen Submodus wird in jedem SOF-Zeitraum eine feste Anzahl von Byte übertragen. Die Audio-Abtastrate wird effektiv von der USB-Uhr abgeleitet. Der synchrone Submodus wird im Allgemeinen nicht für Audio verwendet, da beides Host und Peripheriegerät sind vom USB-Takt abhängig.
In der folgenden Tabelle sind die isochronen Untermodi zusammengefasst:
Submodus | Bytezahl pro Paket |
Abtastrate bestimmt durch |
Für Audio verwendet |
---|---|---|---|
intelligente | variabel | Gastgeber | Ja |
asynchron | variabel | Peripheriegerät | Ja |
synchron | behoben | USB-Uhr | Nein |
In der Praxis spielt der Untermodus natürlich eine Rolle, berücksichtigt werden sollten.
Android-Unterstützung für den USB-Audiokurs
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-Audioklasse 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, wobei 24 Bit an nützlichen Audiodaten werden linksbündig innerhalb der höchstwahrscheinlichen Teile des 32-Bit-Worts
- Die Abtastrate muss entweder 48, 44,1, 32, 24, 22,05, 16, 12, 11,025 oder 8 kHz sein.
- Die Kanalanzahl muss 1 (Mono) oder 2 (Stereo) sein.
Der peruanische Quellcode des Android-Frameworks enthält möglicherweise zusätzlichen Code über das für diese Funktionen erforderliche Minimum hinaus. Aber dieser Code wurde nicht überprüft, daher wurden noch keine Ansprüche auf erweiterte Funktionen geltend gemacht.
Zubehörmodus
Mit Android 4.1 (API-Level 16) wurde die Audiowiedergabe auf dem Host eingeschränkt unterstützt. 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. als Dock.
Audio im Zubehörmodus hat folgende Funktionen:
- Das Android-Gerät muss von einem sachkundigen Host gesteuert werden, kann das Android-Gerät zuerst vom Entwicklungsmodus in den Zubehörmodus wechseln. und der Host muss Audiodaten vom entsprechenden Endpunkt übertragen. Daher wird das Android-Gerät nicht als „treiberlos“ angezeigt. an den Host senden.
- Die Richtung muss input sein und relativ zum Host ausgedrückt werden.
- Das Audioformat muss 16-Bit-PCM sein
- Die Abtastrate muss 44,1 kHz betragen
- Die Kanalanzahl muss 2 (Stereo) sein.
Audiomodus für den Zubehörmodus ist nicht weit verbreitet, und wird derzeit für neue Designs nicht empfohlen.
Anwendungen von digitalen USB-Audioinhalten
Wie der Name schon sagt, wird das digitale USB-Audiosignal über einen digitalen Datenstream und nicht im analogen vom allgemeinen TRS-Mini Headset-Connector. Letztendlich muss jedes digitale Signal in ein analoges Format umgewandelt werden, bevor es hörbar ist. Bei der Auswahl des Ortes für die Conversion gibt es auch Nachteile.
Zwei DACs
Im folgenden Beispieldiagramm werden zwei Designs verglichen. Zunächst haben wir eine Mobilgerät mit Application Processor (AP), integriertem DAC, Verstärker und einen analogen TRS-Anschluss am Kopfhörer. Wir halten auch eine Mobilgerät mit USB-Anschluss an einen externen USB-DAC und Verstärker auch mit Kopfhörern.
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 bei einem echten Android-Gerät wahrscheinlich beide Optionen zur Verfügung stehen.
Das erste Design A ist einfacher, günstiger, verbraucht weniger Energie, und ein zuverlässigeres Design mit ansonsten gleich zuverlässigen Komponenten ist. Üblicherweise gibt es jedoch Abstriche bei der Audioqualität gegenüber anderen Anforderungen. Handelt es sich beispielsweise um ein Gerät für den Massenmarkt, kann es so konzipiert sein, die Anforderungen des allgemeinen Verbrauchers erfüllen, nicht der Audiophilen.
Im zweiten Design kann das externe Audio-Peripheriegerät C für eine höhere Audioqualität und eine höhere Ausgangsleistung, ohne dass die Kosten der für den Massenmarkt von Android-Gerät B. Ja, das Design ist teurer, aber die Kosten werden nur von den Personen aufgewendet, die sie benötigen.
Mobilgeräte sind für ihre hohe Dichte Leiterplatten. Dadurch ergeben sich mehr Möglichkeiten für Übersprechen der benachbarte analoge Signale verschlechtert. Die digitale Kommunikation ist weniger anfällig für Rauschen, Der DAC wird also vom Android-Gerät A auf eine externe Leiterplatte C ermöglicht es, dass die endgültigen analogen Phasen physisch und elektrisch isoliert von der dichten und verrauschten Platine, was zu einer höheren Audioqualität führt.
Im Gegensatz dazu ist das zweite Design komplexer und mit zunehmender Komplexität dass Dinge scheitern können. Es kommt auch zu einer zusätzlichen Latenz, über die USB-Controller.
Anwendungen im Hostmodus
Zu den typischen Audioanwendungen im USB-Hostmodus gehören:
- Musik hören
- Telefonie
- Instant Messaging und Sprachchat
- nimmst
Bei all diesen Anwendungen erkennt Android einen kompatiblen Audio-Peripheriegerät und leitet die Audiowiedergabe und -aufnahme automatisch weiter basierend auf den Regeln für die Audiorichtlinie. Stereoinhalte werden auf den ersten beiden Kanälen des Peripheriegeräts wiedergegeben.
Für digitale USB-Audioinhalte gibt es keine speziellen APIs. Bei fortgeschrittener Nutzung 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 Bereich „Medien“ Einstellungen / Entwickleroptionen.
Im Hostmodus debuggen
Im USB-Hostmodus ist die ADB-Fehlerbehebung über USB nicht verfügbar. Siehe Abschnitt WLAN-Nutzung von Android Debug Bridge nach einer Alternative suchen.
USB-Audio implementieren
Empfehlungen für Anbieter von Audio-Peripheriegeräten
Anbieter von Audio-Peripheriegeräten sollten für die Zusammenarbeit mit Android-Geräten Folgendes tun:
- Einhaltung der Anforderungen an die Audioklasse Derzeit ist Android für Klasse 1 bestimmt, aber es ist ratsam, sich für Klasse 2 zu planen.
- Quirks vermeiden
- Interoperabilität mit Referenz- und gängigen Android-Geräten testen
- die unterstützten Funktionen, die Compliance der Audioklasse, die Anforderungen an die Stromversorgung usw. klar dokumentieren. damit Verbraucher fundierte Entscheidungen treffen können,
Empfehlungen für OEMs und SoC-Anbieter von Android-Geräten
Zur Unterstützung digitaler USB-Audiosysteme sollten OEMs und SoC-Anbieter von Geräten Folgendes tun:
- Hardware zur Unterstützung des USB-Hostmodus entwickeln
- Generischen USB-Host-Support auf Framework-Ebene aktivieren
über das Funktions-Flag
android.hardware.usb.host.xml
- alle erforderlichen Kernel-Funktionen aktivieren: USB-Hostmodus, USB-Audio, isochroner Übertragungsmodus Siehe Android-Kernel-Konfiguration
- über die neuesten Kernel-Releases und -Patches auf dem Laufenden zu bleiben; Trotz des erstklassigen Ziels der Klassencompliance gibt es noch existierende Audio-Peripheriegeräte. mit Quirks, und neuere Kernel bieten Behelfslösungen für solche Macken.
- USB-Audiorichtlinie wie unten beschrieben aktivieren
- Audio.usb.default zu PRODUCT_PACKAGES in device.mk hinzufügen
- Test auf Kompatibilität mit gängigen USB-Audio-Peripheriegeräten
USB-Audiorichtlinie aktivieren
Um USB-Audio zu aktivieren, fügen Sie einen Eintrag zum Konfigurationsdatei für die Audiorichtlinie. Das ist normalerweise befindet sich hier:
device/oem/codename/audio_policy.conf
Die Pfadnamenkomponente „oem“ sollte durch den Namen ersetzt werden des OEMs, der das Android-Gerät herstellt, und „Codename“ durch den Gerätecodenamen ersetzt werden.
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
Hardware-Abstraktionsschicht (HAL) für Audio Implementierung für USB-Audio finden Sie hier:
hardware/libhardware/modules/usbaudio/
Der USB-Audio-HAL benötigt tinyalsa, beschrieben unter Audioterminologie. Obwohl USB-Audio isochrone Übertragungen nutzt, wird dies durch die ALSA-Implementierung abstrahiert. USB-Audio-HAL und tinyalsa müssen sich mit diesem Teil des USB-Protokolls.
USB-Audio testen
Informationen zu CTS-Tests für USB-Audio finden Sie unter USB Audio-CTS-Verifizierungstests.