Dźwięk cyfrowy USB

W tym artykule omówiono obsługę systemu Android dla cyfrowego dźwięku USB i powiązanych protokołów opartych na USB.

Publiczność

Docelowymi odbiorcami tego artykułu są producenci OEM urządzeń z systemem Android, dostawcy układów SoC, dostawcy urządzeń peryferyjnych USB audio, twórcy zaawansowanych aplikacji audio i inne osoby poszukujące szczegółowej wiedzy na temat wewnętrznych elementów cyfrowego dźwięku USB w systemie Android.

Użytkownicy końcowi urządzeń Nexus powinni zamiast tego 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 audiofilscy konsumenci mogą znaleźć w nim fragmenty interesujące.

Przegląd USB

Uniwersalna magistrala szeregowa (USB) jest nieformalnie opisana w artykule na Wikipedii USB , a formalnie jest zdefiniowana w standardach opublikowanych przez USB Implementers Forum, Inc. Dla wygody podsumowujemy tutaj kluczowe koncepcje USB, ale standardy są miarodajnym odniesieniem.

Podstawowe pojęcia i terminologia

USB to magistrala z jednym inicjatorem operacji przesyłania danych, zwanym hostem . Host komunikuje się z urządzeniami peryferyjnymi za pośrednictwem magistrali.

Uwaga: terminy urządzenie i akcesorium są powszechnymi synonimami terminów urządzenia peryferyjne . Unikamy tutaj tych terminów, ponieważ można je pomylić z urządzeniem z Androidem lub specyficzną dla Androida koncepcją zwaną trybem akcesoriów .

Kluczową rolą hosta jest wyliczanie : proces wykrywania, które urządzenia peryferyjne są podłączone do magistrali i sprawdzania ich właściwości wyrażonych za pomocą deskryptorów .

Urządzenie peryferyjne może być jednym obiektem fizycznym, ale w rzeczywistości realizuje wiele funkcji logicznych. Na przykład urządzenie peryferyjne kamery internetowej może mieć zarówno funkcję kamery, jak i funkcję dźwięku mikrofonu.

Każda funkcja peryferyjna ma interfejs , który definiuje protokół komunikacji z tą funkcją.

Host komunikuje się z urządzeniem peryferyjnym za pośrednictwem potoku do punktu końcowego , źródła danych lub ujścia zapewnianego przez jedną z funkcji urządzenia peryferyjnego.

Istnieją dwa rodzaje potoków: Message i Stream . Potok komunikatów służy do dwukierunkowej kontroli i statusu. Potok strumieniowy służy do jednokierunkowego przesyłania danych.

Host inicjuje wszystkie transfery danych, stąd terminy wejście i wyjście są wyrażane w odniesieniu do 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.

Istnieją trzy główne tryby przesyłania danych: przerwanie , masowy i izochroniczny . Tryb izochroniczny zostanie omówiony dalej w kontekście dźwięku.

Urządzenie peryferyjne może mieć terminale umożliwiające połączenie ze światem zewnętrznym, poza samym urządzeniem peryferyjnym. W ten sposób urządzenie peryferyjne służy do tłumaczenia pomiędzy protokołem USB a sygnałami „ze świata rzeczywistego”. Zaciski są obiektami logicznymi funkcji.

Tryby USB Androida

Tryb rozwoju

Tryb programistyczny jest obecny od pierwszej wersji Androida. Urządzenie z systemem Android pojawia się jako urządzenie peryferyjne USB na komputerze-hoście z systemem operacyjnym stacjonarnym, takim jak Linux, Mac OS X lub Windows. Jedyną widoczną funkcją peryferyjną jest fastboot systemu Android lub mostek debugowania systemu Android (adb) . Protokoły fastboot i adb są nakładane na tryb zbiorczego przesyłania danych USB.

Tryb hosta

Tryb hosta został wprowadzony w systemie Android 3.1 (poziom API 12).

Ponieważ urządzenie z systemem Android musi działać jako host, a większość urządzeń z systemem Android jest wyposażona w złącze micro-USB, które nie pozwala bezpośrednio na działanie hosta, zwykle wymagany jest adapter on-the-go ( OTG ), taki jak ten:

OTG

Rysunek 1. Adapter on-the-go (OTG).

Urządzenie z systemem Android może nie zapewniać wystarczającej mocy do obsługi określonego urządzenia peryferyjnego, w zależności od tego, ile energii potrzebuje to urządzenie peryferyjne i jaką moc jest w stanie dostarczyć urządzenie z systemem Android. Nawet jeśli dostępna jest odpowiednia moc, czas ładowania baterii urządzenia z systemem Android może ulec znacznemu skróceniu. W takich sytuacjach użyj zasilanego koncentratora , takiego jak ten:

Zasilany koncentrator

Rysunek 2. Zasilany koncentrator

Tryb akcesoriów

Tryb akcesoriów został wprowadzony w systemie Android 3.1 (poziom API 12) i przeniesiony do systemu Android 2.3.4. W tym trybie urządzenie z systemem Android działa jako urządzenie peryferyjne USB kontrolowane przez inne urządzenie, np. stację dokującą, która pełni rolę hosta. Różnica między trybem programistycznym a trybem akcesoriów polega na tym, że host widzi dodatkowe funkcje USB, poza adb. Urządzenie z systemem Android rozpoczyna pracę w trybie programistycznym, a następnie przechodzi do trybu akcesoriów w procesie renegocjacji.

Tryb akcesoriów został w Androidzie 4.1 rozszerzony o dodatkowe funkcje, w szczególności o opisane poniżej audio.

Dźwięk USB

Zajęcia USB

Z każdą funkcją peryferyjną jest powiązany dokument klasy urządzenia , który określa standardowy protokół dla tej funkcji. Umożliwia to interoperację zgodnych z klasą hostów i funkcji peryferyjnych bez szczegółowej wiedzy o wzajemnym działaniu. Zgodność klas ma kluczowe znaczenie, jeśli host i urządzenie peryferyjne są dostarczane przez różne podmioty.

Termin „ bez sterowników” jest powszechnym synonimem określenia „ zgodny z klasą ”, wskazując, że możliwe jest korzystanie ze standardowych funkcji takiego urządzenia peryferyjnego bez konieczności instalowania sterownika specyficznego dla systemu operacyjnego. Można założyć, że urządzenie peryferyjne reklamowane jako „niewymagające sterownika” dla głównych systemów operacyjnych dla komputerów stacjonarnych będzie zgodne z klasą, chociaż mogą istnieć wyjątki.

Klasa dźwięku USB

Tutaj zajmujemy się wyłącznie urządzeniami peryferyjnymi realizującymi funkcje audio, a zatem należącymi do klasy urządzeń audio. Istnieją dwie edycje specyfikacji klasy audio USB: klasa 1 (UAC1) i klasa 2 (UAC2).

Porównanie z innymi klasami

USB obejmuje wiele innych klas urządzeń, z których niektóre można pomylić z klasą audio. Klasa pamięci masowej (MSC) służy do sektorowego dostępu do multimediów, natomiast protokół przesyłania multimediów (MTP) zapewnia pełny dostęp do plików multimedialnych. Do przesyłania plików audio można używać zarówno MSC, jak i MTP, ale do przesyłania strumieniowego w czasie rzeczywistym nadaje się tylko klasa audio USB.

Terminale audio

Zaciski urządzenia peryferyjnego audio są zazwyczaj analogowe. Sygnał analogowy prezentowany na terminalu wejściowym urządzenia peryferyjnego jest konwertowany na cyfrowy przez przetwornik analogowo-cyfrowy (ADC) i przesyłany protokołem USB do wykorzystania przez hosta. ADC jest źródłem danych dla hosta. Podobnie host wysyła cyfrowy sygnał audio przez protokół USB do urządzenia peryferyjnego, gdzie przetwornik cyfrowo-analogowy (DAC) konwertuje i przekazuje go do analogowego terminala wyjściowego. DAC jest ujściem dla hosta.

Kanały

Urządzenie peryferyjne z funkcją audio może obejmować terminal źródłowy, terminal typu Sink lub jedno i drugie. Każdy kierunek może mieć jeden kanał ( mono ), dwa kanały ( stereo ) lub więcej. Urządzenia peryferyjne posiadające więcej niż dwa kanały nazywane są urządzeniami wielokanałowymi . Powszechnie interpretuje się strumień stereo jako składający się z lewego i prawego kanału, a co za tym idzie, interpretuje się strumień wielokanałowy jako mający lokalizacje przestrzenne odpowiadające każdemu kanałowi. Jednak całkiem właściwe jest (zwłaszcza w przypadku dźwięku USB, a nie HDMI ), aby nie przypisywać żadnego szczególnego standardowego znaczenia przestrzennego każdemu kanałowi. W tym przypadku to aplikacja i użytkownik decydują o sposobie wykorzystania każdego kanału. Na przykład czterokanałowy strumień wejściowy USB może mieć pierwsze trzy kanały podłączone do różnych mikrofonów w pomieszczeniu, a ostatni kanał odbierający sygnał wejściowy z radia AM.

Izochroniczny tryb transferu

Dźwięk USB wykorzystuje izochroniczny tryb przesyłania ze względu na charakterystykę czasu rzeczywistego, kosztem odzyskiwania błędów. W trybie izochronicznym gwarantowana jest przepustowość, a błędy transmisji danych są wykrywane za pomocą cyklicznej kontroli redundancji (CRC). W przypadku błędu nie ma jednak potwierdzenia pakietu ani ponownej transmisji.

Transmisje izochroniczne mają miejsce w każdym okresie rozpoczęcia ramki (SOF). Okres SOF wynosi jedną milisekundę w przypadku pełnej prędkości i 125 mikrosekund w przypadku dużej prędkości. Każda ramka o pełnej prędkości przenosi do 1023 bajtów ładunku, a ramka o dużej szybkości przenosi do 1024 bajtów. Łącząc to, obliczamy maksymalną szybkość przesyłania na 1 023 000 lub 8 192 000 bajtów na sekundę. Ustawia teoretyczny górny limit łącznej częstotliwości próbkowania audio, liczby kanałów i głębi bitowej. Praktyczny limit jest niższy.

W trybie izochronicznym istnieją trzy podtryby:

  • Adaptacyjny
  • Asynchroniczny
  • Synchroniczny

W podtrybie adaptacyjnym urządzenie peryferyjne lub źródło dostosowuje się do potencjalnie zmieniającej się częstotliwości próbkowania hosta.

W trybie podrzędnym asynchronicznym (zwanym także ukrytym sprzężeniem zwrotnym) ujście lub źródło określa częstotliwość próbkowania, a host dostosowuje się. Podstawową teoretyczną zaletą asynchronicznego trybu podrzędnego jest to, że źródłowy lub ulotny zegar USB jest fizycznie i elektrycznie bliżej (i w rzeczywistości może być taki sam lub pochodzić z) zegara sterującego przetwornikiem DAC lub ADC. Ta bliskość oznacza, że ​​asynchroniczny tryb podrzędny powinien być mniej podatny na wahania zegara. Ponadto zegar używany przez przetwornik DAC lub ADC może być zaprojektowany pod kątem większej dokładności i mniejszego dryftu niż zegar hosta.

W podtrybie synchronicznym w każdym okresie SOF przesyłana jest stała liczba bajtów. Częstotliwość próbkowania dźwięku jest faktycznie obliczana na podstawie zegara USB. Synchroniczny tryb podrzędny nie jest powszechnie używany w przypadku dźwięku, ponieważ zarówno host, jak i urządzenia peryferyjne są zdane na łaskę zegara USB.

Poniższa tabela podsumowuje izochroniczne tryby podrzędne:

Tryb podrzędny Liczba bajtów
na pakiet
Próbna stawka
zdeterminowany przez
Używany do dźwięku
adaptacyjny zmienny gospodarz Tak
asynchroniczny zmienny peryferyjny Tak
synchroniczny naprawił Zegar USB NIE

W praktyce podtryb ma oczywiście znaczenie, ale należy wziąć pod uwagę także inne czynniki.

Obsługa Androida dla klasy audio USB

Tryb rozwoju

Dźwięk USB nie jest obsługiwany w trybie programistycznym.

Tryb hosta

Android 5.0 (poziom interfejsu API 21) i nowsze obsługują podzbiór funkcji audio 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 bitów, 24 bity lub 32 bity, przy czym 24 bity użytecznych danych audio są wyrównane do lewej strony w najbardziej znaczących bitach 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 wynosić 1 (mono) lub 2 (stereo)

Przeglądanie kodu źródłowego platformy Android może spowodować wyświetlenie dodatkowego kodu wykraczającego poza minimum potrzebne do obsługi tych funkcji. Jednak ten kod nie został zweryfikowany, więc nie zastrzeżono jeszcze bardziej zaawansowanych funkcji.

Tryb akcesoriów

W systemie Android 4.1 (poziom API 16) dodano ograniczoną obsługę odtwarzania dźwięku na hoście. W trybie akcesoriów Android automatycznie kieruje wyjście audio do USB. Oznacza to, że urządzenie z Androidem służy hostowi jako źródło danych, na przykład stacja dokująca.

Dźwięk w trybie akcesoriów ma następujące funkcje:

  • Urządzenie z systemem Android musi być kontrolowane przez doświadczonego hosta, który może najpierw przejść z trybu programowania do trybu akcesoriów, a następnie host musi przesłać dane audio z odpowiedniego punktu końcowego. Dlatego urządzenie z Androidem nie wydaje się hostowi „bez sterownika”.
  • Należy podać kierunek, wyrażony względem obiektu nadrzędnego
  • Format audio musi być 16-bitowy 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 został powszechnie przyjęty i nie jest obecnie zalecany w przypadku nowych projektów.

Zastosowania cyfrowego dźwięku USB

Jak sama nazwa wskazuje, cyfrowy sygnał audio USB jest reprezentowany przez cyfrowy strumień danych, a nie sygnał analogowy używany przez zwykłe złącze zestawu słuchawkowego TRS mini. Ostatecznie każdy sygnał cyfrowy musi zostać przekonwertowany na analogowy, zanim będzie można go usłyszeć. Wybór miejsca umieszczenia tej konwersji wiąże się z kompromisami.

Opowieść o dwóch przetwornikach DAC

Na poniższym przykładowym schemacie porównujemy dwa projekty. Najpierw mamy urządzenie mobilne z procesorem aplikacji (AP), wbudowanym przetwornikiem DAC, wzmacniaczem i analogowym złączem TRS podłączonym do słuchawek. Rozważamy również urządzenie mobilne z portem USB podłączone do zewnętrznego przetwornika cyfrowo-analogowego USB i wzmacniacza, także ze słuchawkami.

Porównanie DAC-a

Rysunek 3. Porównanie dwóch przetworników DAC

Który projekt jest lepszy? Odpowiedź zależy od Twoich potrzeb. Każdy ma zalety i wady.

Uwaga: jest to sztuczne porównanie, ponieważ na prawdziwym urządzeniu z Androidem prawdopodobnie dostępne są obie opcje.

Pierwszy projekt A jest prostszy, tańszy, zużywa mniej energii i będzie bardziej niezawodną konstrukcją, przy założeniu równie niezawodnych komponentów. Zwykle jednak istnieją kompromisy w zakresie jakości dźwięku w stosunku do innych wymagań. Na przykład, jeśli jest to urządzenie przeznaczone na rynek masowy, może zostać zaprojektowane tak, aby odpowiadać potrzebom ogólnego konsumenta, a nie audiofila.

W drugim projekcie zewnętrzne urządzenie peryferyjne audio C można zaprojektować pod kątem wyższej jakości dźwięku i większej mocy wyjściowej bez wpływu na koszt podstawowego urządzenia B z systemem Android na rynku masowym. Tak, jest to droższa konstrukcja, ale koszt jest pokrywany tylko przez którzy tego chcą.

Urządzenia mobilne słyną z płytek drukowanych o dużej gęstości, co może skutkować większymi możliwościami wystąpienia przesłuchów , które degradują sąsiednie sygnały analogowe. Komunikacja cyfrowa jest mniej podatna na szumy , dlatego przeniesienie przetwornika cyfrowo-analogowego z urządzenia z systemem Android A na zewnętrzną płytkę drukowaną C pozwala na fizyczne i elektryczne odizolowanie końcowych stopni analogowych od gęstej i zaszumionej płytki drukowanej, co zapewnia wyższą wierność dźwięku.

Z drugiej strony drugi projekt jest bardziej złożony, a wraz ze wzrostem złożoności pojawia się więcej możliwości niepowodzenia. Kontrolery USB powodują również dodatkowe opóźnienia.

Aplikacje w trybie hosta

Typowe aplikacje audio w trybie hosta USB obejmują:

  • słuchanie muzyki
  • telefonia
  • komunikatory internetowe i czat głosowy
  • nagranie

W przypadku wszystkich tych aplikacji system Android wykrywa zgodne urządzenie peryferyjne USB z dźwiękiem cyfrowym i automatycznie kieruje odtwarzanie i przechwytywanie dźwięku w odpowiedni sposób, zgodnie z zasadami polityki audio. Treści stereo są odtwarzane na pierwszych dwóch kanałach urządzenia peryferyjnego.

Nie ma interfejsów API specyficznych dla cyfrowego dźwięku USB. W przypadku zaawansowanych zastosowań automatyczne routing może zakłócać działanie aplikacji obsługujących standard USB. W przypadku takich aplikacji wyłącz automatyczne routing za pomocą odpowiedniego elementu sterującego w sekcji Media w Ustawieniach/Opcjach programisty .

Debuguj w trybie hosta

W trybie hosta USB debugowanie adb przez USB jest niedostępne. Zobacz alternatywę w sekcji Bezprzewodowe korzystanie z Android Debug Bridge .

Zaimplementuj dźwięk USB

Zalecenia dla dostawców urządzeń peryferyjnych audio

Aby móc współpracować z urządzeniami z systemem Android, dostawcy urządzeń peryferyjnych audio powinni:

  • projekt zapewniający zgodność z klasą audio; obecnie Android jest przeznaczony dla klasy 1, ale mądrze jest zaplanować klasę 2
  • unikaj dziwactw
  • przetestuj interoperacyjność z urządzeniami referencyjnymi i popularnymi urządzeniami z Androidem
  • jasno dokumentuj obsługiwane funkcje, zgodność z klasą dźwięku, wymagania dotyczące zasilania itp., aby konsumenci mogli podejmować świadome decyzje

Zalecenia dla producentów OEM urządzeń z systemem Android i dostawców SoC

Aby obsługiwać dźwięk cyfrowy USB, producenci OEM urządzeń i dostawcy SoC powinni:

  • zaprojektować sprzęt obsługujący tryb hosta USB
  • włącz ogólną obsługę hosta 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 izochronicznego; zobacz Konfiguracja jądra Androida
  • bądź na bieżąco z najnowszymi wydaniami jądra i poprawkami; pomimo szlachetnego celu, jakim jest zgodność z klasą, istnieją urządzenia peryferyjne audio z dziwactwami , a najnowsze jądra mają obejścia takich dziwactw
  • włącz politykę audio USB zgodnie z opisem poniżej
  • dodaj audio.usb.default do PRODUCT_PACKAGES w Device.mk
  • przetestować interoperacyjność z popularnymi urządzeniami peryferyjnymi audio USB

Włącz politykę audio USB

Aby włączyć dźwięk USB, dodaj wpis do pliku konfiguracyjnego zasad audio. Zwykle znajduje się tutaj:

device/oem/codename/audio_policy.conf

Składnik ścieżki „oem” należy zastąpić nazwą producenta OEM, który produkuje urządzenie z systemem Android, a „nazwa kodowa” należy zastąpić nazwą kodową urządzenia.

Przykładowy wpis pokazano tutaj:

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

Implementację warstwy abstrakcji sprzętu audio (HAL) dla dźwięku USB można znaleźć tutaj:

hardware/libhardware/modules/usbaudio/

HAL audio USB opiera się w dużej mierze na tinyalsa , opisanym w Terminologia audio . Chociaż dźwięk USB opiera się na transferach izochronicznych, implementacja ALSA eliminuje to. Zatem HAL i tinyalsa audio USB nie muszą zajmować się tą częścią protokołu USB.

Przetestuj dźwięk USB

Aby uzyskać informacje na temat testów CTS dla dźwięku USB, zobacz Testy weryfikatora USB Audio CTS .