W tym artykule omawiamy obsługę cyfrowego dźwięku USB i powiązanych urządzeń w Androidzie Protokoły oparte na USB.
Odbiorcy
Docelowi odbiorcy tego artykułu to dostawcy urządzeń z Androidem OEM i dostawcy układów SOC Dostawcy urządzeń peryferyjnych audio USB, zaawansowani programiści aplikacji audio i innych, którzy poszukują szczegółowych informacji o wewnętrznych urządzeniach z Androidem.
Użytkownicy urządzeń Nexus powinni przeczytać ten artykuł Nagrywanie i odtwarzanie dźwięku w trybie hosta USB w Centrum pomocy Nexus. Chociaż ten artykuł nie jest skierowany do użytkowników, dla niektórych audiofilów fragment treści ich zainteresuje.
Omówienie USB
Uniwersalna magistrala szeregowa (USB) jest nieformalnie opisany w artykule w Wikipedii. USB, i jest formalnie zdefiniowane na podstawie standardów opublikowanych USB Implementers Forum, Inc. Dla ułatwienia poniżej podsumowaliśmy najważniejsze pojęcia związane z USB: ale standardy stanowią wiarygodny punkt odniesienia.
Podstawowe pojęcia i terminologia
USB to magistrala dzięki jednemu inicjatorowi operacji przenoszenia danych, nazywanym hostem. Host komunikuje się z urządzeniach peryferyjnych autobusem.
Uwaga: terminy urządzenie i akcesoria to popularne synonimy urządzenia peryferyjnego. Unikamy tych terminów, ponieważ mogą one być mylone z Urządzenie z Androidem lub specyficzna dla Androida koncepcja trybie akcesoriów.
Kluczowa rola hosta to wyliczanie: wykrywania urządzeń peryferyjnych podłączonych do magistrali, i wysyła zapytania o ich właściwości wyrażone w deskryptorach.
Urządzenie peryferyjne może być jednym fizycznym obiektem ale implementują wiele funkcji logicznych. Na przykład urządzenie peryferyjne do kamery internetowej może mieć zarówno funkcję kamery, .
Każde urządzenie peryferyjne ma interfejs, który określa protokół komunikacji z tą funkcją.
Host komunikuje się z urządzeniem peryferyjnym przez kreska pionowa, do punktu końcowego, źródła danych lub ujścia, dzięki jednej z funkcji urządzenia peryferyjnego.
Istnieją 2 rodzaje kresek: wiadomość i strumień. Kreska wiadomości służy do dwukierunkowego sterowania i stanu. Rura strumienia służy do jednokierunkowego przesyłania danych.
To host inicjuje wszystkie transfery danych, dlatego terminy input i output są wyrażane względem hosta. Operacja wejściowa przesyła dane z urządzenia peryferyjnego do hosta, podczas gdy operacja wyjściowa przesyła dane z hosta do urządzenia peryferyjnego.
Dostępne są 3 główne tryby przenoszenia danych: interrupt, Bulk i isochronous. Ten tryb zostanie omówiony dokładniej w kontekście dźwięku.
Urządzenie peryferyjne może mieć terminale łączące się ze światem zewnętrznym. poza urządzeniem peryferyjnym. Dzięki temu urządzenie peryferyjne między protokołem USB a protokołem USB sygnałów. Terminy są logicznymi obiektami funkcji.
Tryby USB na Androidzie
Tryb programisty
Tryb programisty jest dostępny od pierwszej wersji Androida. Urządzenie z Androidem jest wyświetlane jako urządzenie peryferyjne USB na komputerze z zwykłym systemem operacyjnym, takim jak Linux, Mac OS X lub Windows. Jedyną widoczną funkcją urządzenia peryferyjnego jest Szybki rozruch na Androidzie lub Android Debug Bridge (adb) – Protokoły Fastboot i Adb nakładają się na tryb zbiorczego przesyłania danych USB.
Tryb hosta
Tryb hosta został wprowadzony w Androidzie 3.1 (poziom interfejsu API 12).
Ponieważ urządzenie z Androidem musi działać jako host, a większość urządzeń z Androidem złącza micro USB, które nie pozwala bezpośrednio na działanie hosta, przejściówka do urządzeń mobilnych (OTG) co zwykle jest wymagane:
Urządzenie z Androidem może mieć niewystarczającą moc, aby uruchomić w zależności od tego, ile mocy potrzebuje ono i ile jest w stanie dostarczyć urządzenie z Androidem. Nawet jeśli dostępna jest wystarczająca moc, ładowanie baterii urządzenia z Androidem może zostać znacznie skrócona. W takiej sytuacji skorzystaj z hub na taki:
Tryb akcesoriów
Tryb akcesoriów został wprowadzony w Androidzie 3.1 (poziom interfejsu API 12) i przeniesiony na Androida 2.3.4. W tym trybie urządzenie z Androidem działa jako urządzenie peryferyjne USB, znajdujących się pod kontrolą innego urządzenia, np. stacji dokującej pełniącej funkcję hosta. Różnica między trybem deweloperskim a trybem akcesorium jest widoczny dla hosta, nie tylko za pomocą adb. Urządzenie z Androidem uruchamia się w trybie programisty, a następnie przejście na tryb akcesoriów w ramach procesu ponownych negocjacji.
Tryb akcesoriów został rozszerzony o dodatkowe funkcje w Androidzie 4.1. w szczególności dźwięku opisanego poniżej.
Dźwięk USB
Klasy w USB
Z każdą funkcją peryferyjną jest powiązany dokument klasa urządzenia. który określa standardowy protokół dla tej funkcji. Umożliwia to korzystanie z hostów i funkcji peryferyjnych zgodnych z klasą. do współdziałania, bez szczegółowej wiedzy o postępach. Zgodność klas jest kluczowa, jeśli host i urządzenie peryferyjne są dostarczane przez różnych podmiotów.
Termin bez sterownika jest typowym synonimem słowa zgodny z klasą, wskazujący, że można korzystać ze standardowych funkcji takiej urządzenia peryferyjnego bez konieczności konfigurowania systemu operacyjnego sterownik do zainstalowania. Można przyjąć, że urządzenie peryferyjne reklamowane jako „nie wymaga sterownika”. dla popularnych systemów operacyjnych na komputery są zgodne z klasy, jednak mogą być pewne wyjątki.
Klasa audio USB
Zajmujemy się tu jedynie urządzeniami peryferyjnymi, które a tym samym zapewnić zgodność z klasą urządzeń audio. Dostępne są 2 wersji specyfikacji klasy audio USB: klasa 1 (UAC1) i 2 (UAC2).
Porównanie z innymi klasami
USB obejmuje wiele innych klas urządzeń, niektóre z nich mogą być nieczytelne na lekcji audio. klasa pamięci masowej (MSC) jest używany do dostępu do mediów z uwzględnieniem sektorów, Protokół Media Transfer Protocol (MTP) zapewnia pełny dostęp do multimediów. Do przesyłania plików audio można używać zarówno MSC, jak i MTP, ale do strumieniowania w czasie rzeczywistym nadaje się tylko klasa audio USB.
Złącza audio
Złącza urządzenia peryferyjnego audio są zwykle analogowe. Sygnał analogowy przedstawiany w złączu wejściowym urządzenia peryferyjnego jest przekształcany na cyfrowy przez konwerter analogowy na cyfrowy (ADC), i przenosi się przez protokół USB na potrzeby z serwera Google. ADC jest źródłem danych dla gospodarza. Podobnie host wysyła wiadomość przez protokół USB do urządzenia peryferyjnego. konwerter cyfrowy na analogowy (DAC) konwertuje i prezentuje w terminalu wyjścia analogowego. DAC to ujście gospodarza.
Kanały
Urządzenie peryferyjne z funkcją audio może zawierać złącze źródła, złącze ujścia lub oba te złącze. Każdy kierunek może mieć jeden kanał (mono), dwa kanały (stereo) lub więcej. Urządzenia peryferyjne, które mają więcej niż 2 kanały, są nazywane wielokanałowymi. Strumień stereo często przyjmuje się jako składający się z lewym i prawym kanale, a co za tym idzie, interpretować transmisję wielokanałową jako lokalizacji przestrzennych odpowiadających poszczególnym kanałom. Jednak dość odpowiednie (zwłaszcza w przypadku dźwięku przez USB bardziej niż HDMI). nie przypisywać żadnych standardowe znaczenie przestrzenne. W tym przypadku decyzja należy do i użytkownika, aby określić sposób korzystania z każdego kanału. Na przykład czterokanałowy strumień wejściowy USB może mieć pierwsze 3 kanałów podłączonych do różnych mikrofonów w pomieszczeniu, kanał odbiera dane z radia AM.
Tryb przenoszenia izochronologicznego
W przypadku transmisji w czasie rzeczywistym dźwięk USB korzysta z trybu przesyłania izochronologicznego. kosztem naprawiania błędów. W trybie izochronologicznym przepustowość jest gwarantowana, a transmisja danych jest gwarantowana są wykrywane za pomocą cyklicznego sprawdzania nadmiarowości (CRC). Istnieje jednak brak potwierdzenia lub ponownego przesłania pakietu w przypadku błędu.
Transmisje izochronologiczne mają miejsce w każdym okresie SOF. Okres SOF to jedna milisekunda dla pełnej prędkości i 125 mikrosekund dla bardzo szybko. Każda klatka z pełną prędkością może zawierać do 1023 bajtów ładunku, a szybka ramka ma rozmiar do 1024 bajtów. Łącząc te informacje, obliczamy maksymalną szybkość przesyłania wynoszącą 1 023 000 lub 8 192 000 bajtów na sekundę. Teoretycznie ustalany jest górny limit połączonej ścieżki dźwiękowej częstotliwość próbkowania, liczba kanałów i głębia bitowa. Praktyczny limit jest niższy.
W trybie izochronologicznym dostępne są 3 tryby podrzędne:
- Adaptacyjne
- Asynchroniczny
- Synchroniczny
W trybie podrzędnym adaptacyjnym ujście lub źródło peryferyjne dostosowuje się do potencjalnie zmieniającej się częstotliwości próbkowania. z właścicielem strony internetowej.
W trybie asynchronicznym (nazywanym też niejawnym informacją zwrotną) ujście lub źródło określa częstotliwość próbkowania, a host się na to dostosowuje. Główną teoretyczną zaletą asynchronicznego trybu podrzędnego jest to, że źródło zegar USB lub umywalki znajduje się fizycznie i elektrycznie bliżej (i rzeczywiście może być taki sam jak zegar, który napędza DAC lub ADC. Taka bliskość oznacza, że asynchroniczny tryb podrzędny powinien być mniej narażony do zakłóceń zegara. Dodatkowo zegar używany przez DAC lub ADC może być zaprojektowany pod kątem większej dokładności i mniejszego dryfu niż zegar hosta.
W synchronicznym trybie podrzędnym przesyłana jest stała liczba bajtów w każdym okresie SOF. Częstotliwość próbkowania audio jest określana na podstawie zegara USB. Synchroniczny tryb podrzędny jest rzadko używany w przypadku dźwięku, ponieważ urządzenia peryferyjne i hosty używają wskazówek zegara USB.
W tabeli poniżej znajdziesz podsumowanie trybów podrzędnych:
Tryb podrzędny | Liczba bajtów na pakiet |
Częstotliwość próbkowania określona przez |
Używane na potrzeby dźwięku |
---|---|---|---|
adaptacyjna | zmienna | gospodarz | tak |
asynchroniczna | zmienna | urządzenie peryferyjne | tak |
synchroniczne | naprawiono | Zegar USB | nie |
W praktyce tryb podrzędny ma oczywiście znaczenie, ale inne czynniki również należy wziąć pod uwagę.
Obsługa klasy audio USB na Androidzie
Tryb programisty
Dźwięk USB nie jest obsługiwany w trybie programisty.
Tryb hosta
Android 5.0 (poziom interfejsu API 21) lub nowszy obsługuje podzbiór funkcji audio USB klasy 1 (UAC1):
- Urządzenie z Androidem musi działać jako host
- Format audio musi być w formacie PCM (interfejs typu I).
- Głębia bitowa musi być 16-, 24- lub 32-bitowa, gdzie 24 bity przydatnych danych dźwiękowych są wyjustowane do lewej w obrębie najważniejszych wartości fragmenty 32-bitowego słowa
- Częstotliwość próbkowania musi wynosić 48, 44,1, 32, 24, 22,05, 16, 12, 11,025 lub 8 kHz
- Liczba kanałów musi być równa 1 (mono) lub 2 (stereo)
Fragment kodu źródłowego platformy Android może zawierać dodatkowy kod więcej niż minimum potrzebne do obsługi tych funkcji. Ale ten kod nie została sprawdzona, więc nie ma jeszcze możliwości korzystania z bardziej zaawansowanych funkcji.
Tryb akcesoriów
Android 4.1 (poziom interfejsu API 16) dodał ograniczoną obsługę odtwarzania dźwięku na hoście. W trybie akcesoriów Android automatycznie kieruje wyjście audio na USB. Oznacza to, że urządzenie z Androidem pełni funkcję źródła danych dla hosta, np. stacja dokująca.
Dźwięk w trybie akcesoriów obejmuje te funkcje:
- Urządzenie z Androidem musi być sterowane przez kompetentnego hosta, można najpierw przełączyć urządzenie z Androidem z trybu programistycznego na tryb akcesorium. a host musi przenieść dane dźwiękowe z odpowiedniego punktu końcowego. Dlatego urządzenie z Androidem nie wygląda na „bez sterownika”. z hostem.
- Kierunek musi być wartością wejściową wyrażoną względem hosta
- Plik audio musi być w 16-bitowym formacie PCM.
- Częstotliwość próbkowania musi wynosić 44,1 kHz
- Liczba kanałów musi wynosić 2 (stereo)
Dźwięk w trybie akcesoriów nie jest jeszcze powszechnie stosowany, i nie jest obecnie zalecane w przypadku nowych projektów.
Zastosowania cyfrowego dźwięku USB
Jak wskazuje nazwa, przedstawiany jest cyfrowy sygnał audio USB. cyfrowym strumieniem danych zamiast analogowego sygnał używany przez typowy TRS Mini złącze zestawu słuchawkowego. W końcu każdy sygnał cyfrowy musi zostać przekonwertowany na analogowy, aby można go było usłyszeć. Wybór miejsca konwersji wiąże się z pewnymi problemami.
Opowieść o dwóch programach DAC
Na przykładowym schemacie poniżej porównujemy 2 projekty. Najpierw urządzenia mobilnego z procesorem aplikacji (AP), wbudowanym przetwornikiem DAC, wzmacniaczem, i analogowe złącze TRS podłączone do słuchawek. Bierzemy również pod uwagę urządzenie mobilne z portem USB podłączonym do zewnętrznego kontrolera DAC i wzmacniacza USB, także na słuchawkach.
Który projekt jest lepszy? Odpowiedź zależy od Twoich potrzeb. Każdy z nich ma zalety i wady.
Uwaga: to porównanie sztuczne, ponieważ na prawdziwym urządzeniu z Androidem prawdopodobnie będą dostępne obie opcje.
Pierwszy projekt A jest prostszy, tańszy, zużywa mniej energii, i zapewni bardziej niezawodną konstrukcję, z założeniem, że komponenty będą też w równym stopniu niezawodne. Zwykle jednak występują pewne kompromisy związane z jakością dźwięku niż inne wymagania. Na przykład w przypadku urządzeń przeznaczonych na rynek masowy, mogą być zaprojektowane tak, aby pasowały potrzeby ogółu konsumenta, a nie audiofila.
W drugiej konstrukcji zewnętrzne urządzenie peryferyjne C może być zaprojektowane wyższa jakość dźwięku i większa moc wyjściowa bez wpływu na powszechnie dostępne urządzenie z Androidem B. Tak, jest droższy, ale koszty pochłaniają tylko ci, którzy tego chcą.
Urządzenia mobilne często mają dużą gęstość, obwodów drukowanych, co może stwarzać większe możliwości przesłuch wychwytujące sąsiednie sygnały analogowe. Komunikacja cyfrowa jest mniej podatna na szumy, więc przenieś DAC z urządzenia z Androidem A do zewnętrznej płytki obwodu drukowanego. C umożliwia fizyczną i elektryczną koncentrację końcowych etapów analogowych izolowany od gęstej, zaszumionej płytki obwodu drukowanego, co zapewnia wyższą jakość dźwięku.
Z drugiej strony, drugi projekt jest bardziej złożony. na niepowodzenie. Występuje też dodatkowe opóźnienie za pomocą kontrolerów USB.
Aplikacje w trybie hosta
Typowe zastosowania trybu hosta USB:
- słuchanie muzyki
- telefonia
- komunikator internetowy i czat głosowy
- nagrywanie
W przypadku wszystkich tych aplikacji Android wykrywa zgodny urządzenia peryferyjnego audio i automatycznie kieruje odtwarzanie i przechwytywanie dźwięku zgodnie z regułami zasad audio. Treści stereo są odtwarzane na pierwszych 2 kanałach urządzenia peryferyjnego.
Nie ma żadnych interfejsów API specyficznych dla cyfrowych urządzeń audio USB. W przypadku zaawansowanych celów automatyczne routing może zakłócać działanie aplikacji obsługujące USB. W przypadku takich aplikacji wyłącz automatyczne routing za pomocą odpowiedniego elementu sterującego w sekcji Media Ustawienia / Opcje programisty.
Debuguj w trybie hosta
W trybie hosta USB debugowanie adb przez USB jest niedostępne. Zobacz sekcję Wykorzystanie sieci bezprzewodowej z Android Debug Bridge .
Implementacja dźwięku przez USB
Zalecenia dla dostawców urządzeń peryferyjnych audio
Aby umożliwić współpracę z urządzeniami z Androidem, dostawcy urządzeń peryferyjnych audio powinni:
- projektowanie z myślą o zgodności z klasą audio; Android kieruje obecnie na klasę 1, ale warto zaplanować dla klasy 2.
- unikanie dziwactwa
- testowanie pod kątem współdziałania z plikami referencyjnymi i popularnymi urządzeniami z Androidem
- jasno udokumentuj obsługiwane funkcje, zgodność z klasą audio, wymagania dotyczące zasilania itp. aby konsumenci mogli podejmować świadome decyzje
Zalecenia dla dostawców OEM i dostawców układów SOC
Aby zapewnić obsługę cyfrowego dźwięku USB, dostawcy OEM i dostawcy układów SoC powinni:
- projektowanie sprzętu do obsługi trybu hosta USB
- włącz ogólną obsługę hostów USB na poziomie platformy
za pomocą flagi funkcji
android.hardware.usb.host.xml
- włącz wszystkie potrzebne funkcje jądra: tryb hosta USB, dźwięk USB, tryb przesyłania izochronologicznego; Więcej informacji: Konfiguracja jądra Androida
- być na bieżąco z najnowszymi wersjami jądra i poprawkami; pomimo szlachetnego celu w zakresie zgodności z klasą, wciąż są dostępne urządzenia peryferyjne audio z dziwami, a nowsze jądra systemu mają obejście takich niedoskonałości.
- włącz zasadę audio USB, jak opisano poniżej
- Dodaj plik audio.usb.default do pliku PRODUCT_PACKAGES w pliku device.mk
- Test pod kątem współdziałania z popularnymi urządzeniami peryferyjnymi audio USB
Włącz zasadę audio USB
Aby włączyć dźwięk przez USB, dodaj wpis do plik konfiguracji zasad audio. Zwykle jest to znajduje się tutaj:
device/oem/codename/audio_policy.conf
Komponent ścieżki „oem” należy zastąpić nazwą producenta OEM, który sprzedaje urządzenie z Androidem. i „kryptonim” należy zastąpić nazwą kodową urządzenia.
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
Sprzętowa warstwa abstrakcji audio (HAL) implementacja audio USB znajduje się tutaj:
hardware/libhardware/modules/usbaudio/
Interfejs HAL audio USB w dużym stopniu opiera się tinyalsa. Więcej informacji znajdziesz w sekcji Terminologia audio. Chociaż dźwięk przez USB bazuje na transferach izochronologicznych, jest to wyodrębnione ze względu na implementację ALSA. Dzięki HAL USB audio i Tinyalsa nie trzeba się martwić korzystając z tej części protokołu USB.
Przetestuj dźwięk USB
Informacje o testowaniu CTS dźwięku USB znajdziesz w artykule Testy weryfikatora CTS audio USB.