W tym artykule omawiamy obsługę cyfrowego audio USB i powiązanych protokołów USB w Androidzie.
Odbiorcy
Ten artykuł jest skierowany do producentów OEM urządzeń z Androidem, dostawców układów SoC, dostawców urządzeń peryferyjnych USB do obsługi dźwięku, zaawansowanych programistów aplikacji audio oraz innych osób, które chcą dokładnie poznać wewnętrzną strukturę cyfrowego audio USB na Androidzie.
Użytkownicy urządzeń Nexus powinni przeczytać artykuł Nagrywanie i odtwarzanie dźwięku w trybie hosta USB w Centrum pomocy Nexusa. Chociaż ten artykuł nie jest skierowany do użytkowników końcowych, niektórzy audiofile mogą znaleźć w nim interesujące informacje.
Omówienie USB
Uniwersalna magistrala szeregowa (USB) jest nieformalnie opisana w artykule w Wikipedii USB, a formalnie zdefiniowana w standardach opublikowanych przez USB Implementers Forum, Inc. Dla wygody użytkowników podsumowaliśmy tutaj najważniejsze pojęcia związane z USB, ale to standardy są ostatecznym źródłem informacji.
Podstawowe pojęcia i terminologia
USB to szyna z jednym inicjatorem operacji przesyłania danych, zwanym hostem. Gospodarz komunikuje się z urządzeniami zewnętrznymi za pomocą magistrali.
Uwaga: terminy urządzenie i akcesorium to synonimy słowa peryferia. Unikaj tych terminów, ponieważ mogą być mylone z urządzeniem z Androidem lub pojęciem tryb akcesoriów.
Kluczowa rola hosta to enumeracja: proces wykrywania, które urządzenia peryferyjne są połączone z magistralą, oraz wysyłania zapytań o ich właściwości wyrażone za pomocą deskryptorów.
Urządzenie peryferyjne może być jednym urządzeniem fizycznym, ale w rzeczywistości realizować wiele logicznych funkcji. Na przykład urządzenie peryferyjne kamery internetowej może mieć funkcję kamery i funkcję mikrofonu.
Każda funkcja peryferyjna ma interfejs, który definiuje protokół do komunikacji z tą funkcją.
Host komunikuje się z urządzeniem peryferyjnym za pomocą rury do punktu końcowego, który jest źródłem lub odbiorcą danych udostępnianym przez jedną z funkcji urządzenia peryferyjnego.
Istnieją 2 rodzaje kanałów: message i stream. Rura wiadomości służy do dwukierunkowej kontroli i stanu. Przesył danych w jednym kierunku odbywa się za pomocą strumienia.
Host inicjuje wszystkie transfery danych, dlatego terminy wejścia i wyjścia są wyrażane w odniesieniu do hosta. Operacja wejścia przenosi dane z urządzenia peryferyjnego na hosta, a operacja wyjścia przenosi dane z hosta na urządzenie peryferyjne.
Istnieją 3 główne tryby przesyłania danych: przerwany, zbiorczy i synchroniczny. Tryb asynchroniczny zostanie omówiony w kontekście dźwięku.
Urządzenie zewnętrzne może mieć terminale, które łączą się ze światem zewnętrznym, poza samym urządzeniem zewnętrznym. W ten sposób urządzenie peryferyjne służy do tłumaczenia sygnałów z protokołu USB na sygnały „ze świata rzeczywistego”. Terminale to obiekty logiczne funkcji.
Tryby USB w Androidzie
Tryb programisty
Tryb programisty jest dostępny od czasu pierwszej wersji Androida. Urządzenie z Androidem jest widoczne jako urządzenie peryferyjne USB dla komputera z systemem operacyjnym na komputery PC, takim jak Linux, Mac OS X czy Windows. Jedyną widoczną funkcją peryferyjną jest Android fastboot lub Android Debug Bridge (adb). Protokoły fastboot i adb są nakładane na tryb zbiorczego przesyłania danych przez USB.
Tryb hosta
Tryb hosta został wprowadzony w Androidzie 3.1 (poziom interfejsu API 12).
Urządzenie z Androidem musi działać jako host, a większość urządzeń z Androidem ma złącze micro-USB, które nie umożliwia bezpośredniego działania w trybie hosta. Zazwyczaj wymagana jest przejściówka OTG, na przykład:
![OTG](https://source.android.com/static/docs/core/audio/images/otg.jpg?authuser=0&hl=pl)
Rysunek 1. Adapter mobilny (OTG)
Urządzenie z Androidem może nie zapewnić wystarczającej ilości energii do obsługi określonego urządzenia peryferyjnego, w zależności od tego, ile energii potrzebuje to urządzenie i ile energii może dostarczyć urządzenie z Androidem. Nawet jeśli poziom naładowania baterii jest wystarczający, czas pracy urządzenia z Androidem może się znacznie skrócić. W takich sytuacjach użyj przekaźnika, takiego jak ten:
![Centrum Powered](https://source.android.com/static/docs/core/audio/images/hub.jpg?authuser=0&hl=pl)
Rysunek 2. Centrum Powered
Tryb akcesoriów
Tryb akcesorium został wprowadzony w Androidzie 3.1 (poziom interfejsu API 12) i wstecznie przeniesiony do Androida 2.3.4. W tym trybie urządzenie z Androidem działa jako urządzenie peryferyjne USB, pod kontrolą innego urządzenia, takiego jak stacja dokująca, które pełni rolę hosta. Różnica między trybem programowania a trybem akcesoriów polega na tym, że host ma dostęp do dodatkowych funkcji USB poza adb. Urządzenie z Androidem zaczyna pracę w trybie programisty, a potem przechodzi do trybu akcesorium w ramach procesu ponownych negocjacji.
W Androidzie 4.1 tryb akcesoriów został rozszerzony o dodatkowe funkcje, w tym dźwięk, który opisano poniżej.
Dźwięk przez USB
Klasy USB
Każda funkcja peryferyjna ma powiązany dokument klasy urządzenia, który określa standardowy protokół dla tej funkcji. Dzięki temu hosty i funkcje peryferyjne zgodne z klasą mogą ze sobą współpracować bez szczegółowej znajomości działania innych urządzeń. Zgodność z klasą jest kluczowa, jeśli host i urządzenie peryferyjne są dostarczane przez różne podmioty.
Termin bez kierowcy jest powszechnym synonimem zgodności z klasą, co oznacza, że można korzystać ze standardowych funkcji takiego urządzenia peryferyjnego bez konieczności instalowania sterownika dla konkretnego systemu operacyjnego. Można założyć, że urządzenie peryferyjne reklamowane jako „nie wymaga sterownika” w przypadku głównych systemów operacyjnych na komputery będzie zgodne z klasą, ale mogą wystąpić wyjątki.
Klasa audio USB
Tutaj zajmujemy się tylko urządzeniami peryferyjnymi, które implementują funkcje audio, a tym samym należą do klasy urządzeń audio. Istnieją 2 wersje specyfikacji klasy audio USB: klasa 1 (UAC1) i 2 (UAC2).
Porównanie z innymi zajęciami
USB obejmuje wiele innych klas urządzeń, z których niektóre mogą być mylone z klasą audio. Klasa urządzeń masowej pamięci masowej (MSC) służy do uzyskiwania dostępu do mediów w ramach sektorów, a protokół MTP (Media Transfer Protocol) umożliwia pełny dostęp do plików na nośniku. Do przesyłania plików audio można używać zarówno protokołów MSC, jak i MTP, ale tylko klasa audio USB nadaje się do strumieniowego przesyłania w czasie rzeczywistym.
Gniazda audio
Terminale urządzeń peryferyjnych audio są zwykle analogowe. Sygnał analogowy prezentowany na terminalu wejściowym urządzenia peryferyjnego jest konwertowany na sygnał cyfrowy przez przetwornik analogowo-cyfrowy (ADC), a następnie przesyłany przez protokół USB do hosta. ADC to źródło danych dla hosta. Podobnie host wysyła cyfrowy sygnał audio za pomocą protokołu USB do urządzenia peryferyjnego, gdzie przetwornik cyfrowo-analogowy (DAC) konwertuje i przekazuje sygnał na analogowy terminal wyjściowy. DAC jest zbiornikiem dla hosta.
Kanały
Urządzenie peryferyjne z funkcją audio może zawierać terminal źródłowy, terminal odbiorczy lub oba te elementy. Każda strona może mieć 1 kanał (mono), 2 kanały (stereo) lub więcej. Peryferia z większą liczbą niż 2 kanały nazywane są wielokanałowymi. Zazwyczaj strumień stereo traktuje się jako składający się z kanału lewego i kanału prawego, a w rozszerzeniu strumień wielokanałowy jako mający położenie przestrzenne odpowiadające poszczególnym kanałom. Jednak w pewnych przypadkach (zwłaszcza w przypadku dźwięku USB, a nie HDMI) nieprzypisywanie żadnego standardowego znaczenia przestrzennego poszczególnym kanałom jest całkiem odpowiednie. W takim przypadku sposób korzystania z każdego kanału zależy od aplikacji i użytkownika. Na przykład 4-kanałowy strumień wejściowy USB może mieć 3 kanały podłączone do różnych mikrofonów w pokoju, a ostatni kanał może odbierać sygnał z radia AM.
Tryb przesyłania asynchronicznego
Dźwięk przez USB korzysta z trybu przesyłania asynchronicznego ze względu na jego właściwości w czasie rzeczywistym, kosztem odzyskiwania błędów. W trybie synchronicznym gwarantowana jest przepustowość, a błędy transmisji danych są wykrywane za pomocą cyklicznego kodu kontroli poprawności (CRC). Nie ma jednak potwierdzenia ani retransmisji pakietów w przypadku błędu.
Transmisje synchroniczne odbywają się w każdym okresie początku klatki (SOF). Okres SOF wynosi 1 milisekundę w przypadku pełnej szybkości i 125 mikrosekund w przypadku wysokiej szybkości. Każda zwykła ramka zawiera do 1023 bajtów danych, a ramka o wysokiej szybkości – do 1024 bajtów. Po zsumowaniu tych wartości maksymalna szybkość przesyłania wynosi 1 023 000 lub 8 192 000 bajtów na sekundę. Określa on teoretyczny górny limit łącznej częstotliwości próbkowania, liczby kanałów i głębokości bitowej dźwięku. Praktyczny limit jest niższy.
Tryb synchroniczny ma 3 podtryby:
- Adaptacyjne
- Asynchroniczny
- Synchroniczne
W trybie adaptacji podmodem odbiornik lub źródło peryferyjne dostosowuje się do potencjalnie zmiennej częstotliwości próbkowania hosta.
W trybie asynchronicznym (nazywanym też trybem informacji domyślnych) odbiornik lub źródło określa częstotliwość próbkowania, a host się do niej dostosowuje. Główną teoretyczną zaletą asynchronicznego trybu podrzędnego jest to, że zegar źródła lub odbiornika USB jest fizycznie i elektrycznie bliżej (a w rzeczywistości może być taki sam lub wyprowadzony z zegara, który napędza DAC lub ADC). Ta bliskość oznacza, że tryb asynchroniczny powinien być mniej podatny na drgania zegara. Dodatkowo zegar używany przez DAC lub ADC może być zaprojektowany pod kątem większej dokładności i mniejszego dryftu niż zegar hosta.
W trybie synchronicznym w każdym okresie SOF jest przesyłana stała liczba bajtów. Częstotliwość próbkowania dźwięku jest w efekcie pochodną zegara USB. Tryb synchroniczny nie jest często używany w przypadku dźwięku, ponieważ zarówno host, jak i urządzenie peryferyjne są zależne od zegara USB.
Tabela poniżej zawiera podsumowanie trybów podrzędnych isochronous:
Tryb podrzędny | Liczba bajtów na pakiet |
Częstotliwość próbkowania określana przez |
używane do dźwięku, |
---|---|---|---|
adaptacyjny | zmienna | gospodarz | tak |
asynchroniczny | zmienna | peryferyjne | tak |
synchroniczne | naprawiono | Zegar USB | no |
W praktyce tryb podrzędny ma oczywiście znaczenie, ale należy też wziąć pod uwagę inne czynniki.
Obsługa klasy audio USB w Androidzie
Tryb programisty
Dźwięk przez USB nie jest obsługiwany w trybie deweloperskim.
Tryb hosta
Android 5.0 (poziom interfejsu API 21) i nowsze wersje obsługują podzbiór funkcji dźwięku USB klasy 1 (UAC1):
- Urządzenie z Androidem musi działać jako host.
- Format audio musi być PCM (interfejs typu I).
- Głębia bitowa musi wynosić 16, 24 lub 32 bity, przy czym 24 bity przydatnych danych audio muszą być wyrównane do lewej w najbardziej znaczących bitach słowa 32-bitowego.
- Częstotliwość próbkowania musi wynosić 48, 44,1, 32, 24, 22,05, 16, 12, 11,025 lub 8 kHz.
- Liczba kanałów musi wynosić 1 (mono) lub 2 (stereo)
Przejrzyj kod źródłowy Androida. Możesz znaleźć w nim dodatkowy kod, który nie jest niezbędny do obsługi tych funkcji. Ten kod nie został jednak zweryfikowany, więc funkcje zaawansowane nie są jeszcze dostępne.
Tryb akcesoriów
W Androidzie 4.1 (poziom API 16) dodano ograniczoną obsługę odtwarzania dźwięku przez hosta. W trybie akcesoriów Android automatycznie przekierowuje wyjście audio do USB. Oznacza to, że urządzenie z Androidem służy jako źródło danych dla hosta, np. stacji dokującej.
Tryb akcesoriów audio zawiera te funkcje:
- Urządzeniem z Androidem musi zarządzać doświadczony host, który może najpierw przełączyć urządzenie z Androidem z trybu rozwojowego na tryb akcesoriów, a potem przekazać dane audio z odpowiedniego punktu końcowego. W związku z tym urządzenie z Androidem nie jest widoczne dla hosta jako „bez kierowcy”.
- Kierunek musi być wejściowy, wyrażony względem hosta.
- Format audio musi być 16-bitowym PCM.
- Częstotliwość próbkowania musi wynosić 44,1 kHz
- Liczba kanałów musi wynosić 2 (stereo).
Tryb dźwięku w akcesoriach nie jest powszechnie stosowany i nie jest obecnie zalecany w przypadku nowych projektów.
Zastosowania cyfrowego interfejsu USB do przesyłania dźwięku
Jak wskazuje nazwa, sygnał cyfrowego audio USB jest reprezentowany przez cyfrowy strumień danych, a nie przez analogowy sygnał używany przez typowy minizłącze TRS złącza słuchawkowego. Ostatecznie każdy sygnał cyfrowy musi zostać przekonwertowany na analogowy, aby można go było usłyszeć. Wybór miejsca, w którym umieścisz konwersję, wiąże się z pewnymi kompromisami.
Opowieść o 2 urządzeniach DAC
Na diagramie poniżej porównujemy 2 projekty. Najpierw mamy urządzenie mobilne z procesorem aplikacji (AP), wbudowanym przetwornikiem cyfrowo-analogowym, wzmacniaczem i analogowym złączem TRS podłączonym do słuchawek. Urządzenie mobilne z USB podłączonym do zewnętrznego przetwornika cyfrowo-analogowego USB i wzmacniacza, a także ze słuchawkami.
![Porównanie DAC](https://source.android.com/static/docs/core/audio/images/dac.png?authuser=0&hl=pl)
Rysunek 3. Porównanie 2 DAC
Który projekt jest lepszy? Odpowiedź zależy od Twoich potrzeb. Każdy z nich ma swoje zalety i wady.
Uwaga: jest to sztuczne porównanie, ponieważ na prawdziwym urządzeniu z Androidem obie opcje byłyby prawdopodobnie dostępne.
Pierwszy projekt A jest prostszy, tańszy, zużywa mniej energii i będzie bardziej niezawodny, przy założeniu, że komponenty są równie niezawodne. Zwykle jednak jakość dźwięku jest kompromisem w stosunku do innych wymagań. Jeśli na przykład jest to urządzenie przeznaczone na rynek masowy, może być zaprojektowane pod kątem potrzeb przeciętnego konsumenta, a nie audiofila.
W drugim rozwiązaniu zewnętrzne urządzenie audio C może być zaprojektowane z myślą o wyższej jakości dźwięku i większej mocy wyjściowej bez wpływu na koszt podstawowego urządzenia z Androidem B przeznaczonego na masowy rynek. Tak, jest to droższa wersja, ale koszt jest ponoszony tylko przez osoby, które tego chcą.
Urządzenia mobilne słyną z posiadania płytek obwodów o dużej gęstości, co może zwiększać ryzyko przesłuchu, który powoduje pogorszenie jakości sąsiadujących sygnałów analogowych. Komunikacja cyfrowa jest mniej podatna na szumy, dlatego przeniesienie przetwornika cyfrowo-analogowego z urządzenia z Androidem A na zewnętrzną płytkę drukowaną C pozwala na fizyczne i elektryczne odseparowanie końcowych stopni analogowych od gęstej i hałasującej płytki drukowanej, co zapewnia wyższą jakość dźwięku.
Z drugiej strony drugi projekt jest bardziej złożony, a z dodatkową złożonością wiąże się większa liczba możliwości wystąpienia błędów. Dodatkowe opóźnienie wynika też z kontrolerów USB.
Aplikacje w trybie hosta
Typowe aplikacje audio w trybie hosta USB to:
- słuchanie muzyki
- telefonii
- czaty i czaty głosowe,
- nagrywanie
W przypadku wszystkich tych aplikacji Android wykrywa zgodne peryferyjne urządzenie audio USB i odpowiednio kieruje odtwarzanie i przechwytywanie dźwięku zgodnie z zasadami dotyczącymi dźwięku. Treści stereo są odtwarzane na pierwszych 2 kanałach urządzenia peryferyjnego.
Nie ma interfejsów API przeznaczonych specjalnie do obsługi cyfrowego dźwięku przez USB. W przypadku zaawansowanego użytkowania automatyczne kierowanie może zakłócać działanie aplikacji obsługujących USB. W przypadku takich aplikacji wyłącz automatyczne przekierowywanie, korzystając z odpowiednich ustawień w sekcji Media w Ustawieniach / Opcje programisty.
Debugowanie w trybie hosta
W trybie hosta USB debugowanie adb przez USB jest niedostępne. Alternatywą jest sekcja Używanie bezprzewodowo w Android Debug Bridge.
Implementowanie dźwięku przez USB
Zalecenia dla dostawców urządzeń peryferyjnych do dźwięku
Aby zapewnić współpracę z urządzeniami z Androidem, dostawcy urządzeń peryferyjnych audio powinni:
- projektowanie z uwzględnieniem zgodności z klasą dźwięku; obecnie Android kieruje się na klasę 1, ale warto zaplanować projektowanie pod kątem klasy 2
- unikanie dziwnych zachowań
- testowanie interoperacyjności z urządzeniami referencyjnymi i popularnymi urządzeniami z Androidem,
- wyraźnie dokumentować obsługiwane funkcje, zgodność z klasą dźwięku, wymagania dotyczące zasilania itp., aby konsumenci mogli podejmować świadome decyzje;
Zalecenia dla producentów urządzeń z Androidem i producentów układów SOC
Aby zapewnić obsługę cyfrowego audio USB, producenci OEM i producenci układów SoC powinni:
- projektowanie sprzętu do obsługi trybu hosta USB.
- włączyć obsługę hosta USB na poziomie platformy za pomocą parametru
android.hardware.usb.host.xml
- włączyć wszystkie potrzebne funkcje jądra: tryb hosta USB, dźwięk USB, tryb przesyłania asynchronicznego;
- na bieżąco sprawdzać najnowsze wersje i łatki jądra; pomimo szlachetnego celu, jakim jest zapewnienie zgodności z klasą, istnieją urządzenia peryferyjne do dźwięku z nietypowymi zachowaniami, a niektóre z ostatnich wersji jądra zawierają obejścia takich problemów;
- włącz zasadę dotyczącą dźwięku USB w sposób opisany poniżej.
- dodanie audio.usb.default do PRODUCT_PACKAGES w pliku device.mk
- testować interoperacyjność z popularnymi urządzeniami peryferyjnymi audio USB;
Włączanie zasady dotyczącej dźwięku przez USB
Aby włączyć dźwięk przez USB, dodaj wpis do pliku konfiguracji zasad dotyczących dźwięku. Zwykle znajduje się tutaj:
device/oem/codename/audio_policy.conf
Element ścieżki „oem” należy zastąpić nazwą producenta OEM urządzenia z Androidem, a element „codename” – nazwą kodu urządzenia.
Poniżej podano przykładowy wpis:
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 } } } ... }
Kod źródłowy
Implementacja warstwy abstrakcji sprzętowej (HAL) dla audio USB znajduje się tutaj:
hardware/libhardware/modules/usbaudio/
HAL dźwięku przez USB korzysta w dużej mierze z tinyalsa, opisanego w Terminologii dotyczącej dźwięku. Mimo że dźwięk USB opiera się na przesyłaniu synchronicznym, implementacja ALSA abstrahuje od tego. Dlatego HAL dźwięku USB i tinyalsa nie muszą zajmować się tą częścią protokołu USB.
Testowanie dźwięku przez USB
Informacje o testach CTS dla dźwięku USB znajdziesz w artykule Testy weryfikacyjne CTS dla dźwięku USB.