Cyfrowe audio 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 Androidem, dostawcy SoC, dostawcy urządzeń peryferyjnych audio USB, programiści zaawansowanych aplikacji audio i inne osoby poszukujące szczegółowej wiedzy na temat wewnętrznych rozwiązań audio USB na Androida.

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 konsumenci-audiofile mogą go zainteresować.

Omówienie USB

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

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ą popularnymi synonimami urządzeń peryferyjnych . Unikamy tutaj tych terminów, ponieważ można je pomylić z urządzeniem z Androidem lub koncepcją specyficzną dla Androida zwaną trybem akcesoriów .

Krytyczną rolą hosta jest wyliczanie : proces wykrywania urządzeń peryferyjnych podłączonych 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 implementuje wiele funkcji logicznych. Na przykład urządzenie peryferyjne z kamerą internetową może mieć zarówno funkcję kamery, jak i funkcję dźwięku mikrofonu.

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

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

Istnieją dwa rodzaje potoków: wiadomość i strumień . Potok komunikatów jest używany do dwukierunkowego sterowania i statusu. Potok strumieniowy służy do jednokierunkowego przesyłania danych.

Host inicjuje wszystkie transfery danych, dlatego terminy wejścia i wyjścia są wyrażone 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 , zbiorcze i izochroniczne . Tryb izochroniczny zostanie omówiony dalej w kontekście audio.

Urządzenie peryferyjne może mieć zaciski, które łączą się ze światem zewnętrznym, poza samym urządzeniem peryferyjnym. W ten sposób urządzenie peryferyjne służy do tłumaczenia między protokołem USB a sygnałami „świata rzeczywistego”. Terminale są obiektami logicznymi funkcji.

Tryby USB w systemie Android

Tryb rozwoju

Tryb programistyczny był obecny od pierwszego wydania Androida. Urządzenie z systemem Android pojawia się jako urządzenie peryferyjne USB na komputerze PC z systemem operacyjnym, takim jak Linux, Mac OS X lub Windows. Jedyną widoczną funkcją peryferyjną jest szybki rozruch systemu Android lub Android Debug Bridge (adb) . Protokoły fastboot i adb są nakładane na tryb masowego przesyłania danych USB.

Tryb hosta

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

Ponieważ urządzenie z systemem Android musi działać jako host, a większość urządzeń z systemem Android ma 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 w podróży (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 urządzenie peryferyjne i ile urządzenie z systemem Android jest w stanie dostarczyć. Nawet jeśli dostępna jest odpowiednia moc, poziom naładowania baterii urządzenia z systemem Android może ulec znacznemu skróceniu. W takich sytuacjach użyj koncentratora zasilanego, takiego jak ten:

Zasilany hub

Rysunek 2. Koncentrator zasilany

Tryb akcesoriów

Tryb akcesoriów został wprowadzony w systemie Android 3.1 (poziom interfejsu 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 pod kontrolą innego urządzenia, takiego jak stacja dokująca, która pełni rolę hosta. Różnica między trybem programowania a trybem akcesoriów polega na tym, że dodatkowe funkcje USB są widoczne dla hosta, poza adb. Urządzenie z systemem Android uruchamia się w trybie programistycznym, a następnie przechodzi w tryb akcesoriów w ramach procesu renegocjacji.

Tryb akcesoriów został rozszerzony o dodatkowe funkcje w Androidzie 4.1, w szczególności dźwięk opisany poniżej.

Dźwięk USB

Klasy USB

Każda funkcja peryferyjna ma powiązany dokument klasy urządzenia, który określa standardowy protokół dla tej funkcji. Umożliwia to hostom zgodnym z klasą i funkcjom urządzeń peryferyjnych współdziałanie bez szczegółowej wiedzy o wzajemnych działaniach. Zgodność z klasami jest krytyczna, jeśli host i urządzenie peryferyjne są dostarczane przez różne podmioty.

Termin bez sterownika jest powszechnym synonimem zgodności 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 „niepotrzebne sterowniki” dla głównych systemów operacyjnych dla komputerów stacjonarnych będzie zgodne z klasą, chociaż mogą istnieć wyjątki.

Klasa audio USB

Tutaj zajmujemy się tylko urządzeniami peryferyjnymi, które realizują funkcje audio, a tym samym są zgodne z klasą urządzeń audio. Istnieją dwie wersje specyfikacji klasy audio USB: klasa 1 (UAC1) i 2 (UAC2).

Porównanie z innymi klasami

USB obejmuje wiele innych klas urządzeń, z których niektóre mogą być mylone z klasą audio. Klasa pamięci masowej (MSC) służy do sektorowego dostępu do multimediów, podczas gdy protokół Media Transfer Protocol (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 tylko klasa audio USB nadaje się do przesyłania strumieniowego w czasie rzeczywistym.

Terminale audio

Terminale urządzenia peryferyjnego audio są zazwyczaj analogowe. Sygnał analogowy prezentowany na terminalu wejściowym urządzenia peryferyjnego jest konwertowany na cyfrowy przez konwerter analogowo-cyfrowy (ADC) i przesyłany przez protokół 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 konwerter cyfrowo -analogowy (DAC) konwertuje i przekazuje do analogowego terminala wyjściowego. DAC jest zlewem dla hosta.

Kanały

Urządzenie peryferyjne z funkcją audio może zawierać terminal źródłowy, terminal typu sink lub oba. Każdy kierunek może mieć jeden kanał ( mono ), dwa kanały ( stereo ) lub więcej. Urządzenia peryferyjne z więcej niż dwoma kanałami nazywane są 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 również (szczególnie w przypadku dźwięku USB bardziej niż HDMI ), aby nie przypisywać żadnego określonego standardowego znaczenia przestrzennego do każdego kanału. W takim przypadku to aplikacja i użytkownik określają sposób 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ł może odbierać dane wejściowe z radia AM.

Tryb transferu izochronicznego

Dźwięk USB wykorzystuje izochroniczny tryb transferu dla swoich charakterystyk w czasie rzeczywistym, kosztem usuwania błędów. W trybie izochronicznym szerokość pasma jest gwarantowana, a błędy transmisji danych są wykrywane za pomocą cyklicznej kontroli nadmiarowej (CRC). Ale nie ma potwierdzenia pakietu ani ponownej transmisji w przypadku błędu.

Transmisje izochroniczne zachodzą w każdym okresie początku ramki (SOF). Okres SOF wynosi jedną milisekundę dla pełnej prędkości i 125 mikrosekund dla dużej szybkości. Każda ramka o pełnej szybkości przenosi do 1023 bajtów danych, a ramka o dużej szybkości do 1024 bajtów. Łącząc je razem, obliczamy maksymalną szybkość transferu jako 1 023 000 lub 8 192 000 bajtów na sekundę. To ustala teoretyczną górną granicę łącznej częstotliwości próbkowania audio, liczby kanałów i głębi bitowej. Praktyczny limit jest niższy.

W trybie izochronicznym istnieją trzy tryby podrzędne:

  • Adaptacyjny
  • Asynchroniczny
  • Synchroniczny

W adaptacyjnym trybie podrzędnym peryferyjne ujście lub źródło dostosowuje się do potencjalnie zmieniającej się częstotliwości próbkowania hosta.

W trybie podrzędnym asynchronicznym (zwanym również niejawnym 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 zegar USB źródła lub ujścia jest fizycznie i elektrycznie bliżej (i rzeczywiście może być taki sam lub pochodzący z) zegara, który steruje przetwornikiem cyfrowo-analogowym lub przetwornikiem analogowo-cyfrowym. Ta bliskość oznacza, że ​​asynchroniczny tryb podrzędny powinien być mniej podatny na jitter zegara. Ponadto zegar używany przez przetwornik cyfrowo-analogowy lub przetwornik ADC może być zaprojektowany z myślą o większej dokładności i niższym dryfcie niż zegar hosta.

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

Poniższa tabela podsumowuje tryby izochroniczne:

Tryb podrzędny Liczba bajtów
w opakowaniu
Próbna stawka
zdeterminowany przez
Używany do dźwięku
adaptacyjny zmienna gospodarz tak
asynchroniczny zmienna peryferyjny tak
synchroniczny naprawiony Zegar USB Nie

W praktyce tryb podrzędny ma oczywiście znaczenie, ale należy również wziąć pod uwagę inne czynniki.

Wsparcie Androida dla klasy audio USB

Tryb rozwoju

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

Tryb hosta

Android 5.0 (poziom API 21) i nowsze obsługują podzbiór funkcji USB audio klasy 1 (UAC1):

  • Urządzenie z Androidem musi działać jako host
  • Format audio musi być PCM (typ interfejsu I)
  • Głębia bitowa musi wynosić 16 bitów, 24 bity lub 32 bity, gdzie 24 bity użytecznych danych audio są wyrównane do lewej 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)

Po zapoznaniu się z kodem źródłowym platformy Android może pojawić się dodatkowy kod wykraczający poza minimum potrzebne do obsługi tych funkcji. Ale ten kod nie został zweryfikowany, więc bardziej zaawansowane funkcje nie są jeszcze zgłaszane.

Tryb akcesoriów

Android 4.1 (poziom API 16) dodał ograniczoną obsługę odtwarzania dźwięku do hosta. W trybie akcesoriów Android automatycznie kieruje swoje wyjście audio do USB. Oznacza to, że urządzenie z Androidem służy jako źródło danych dla hosta, 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 znającego się na rzeczy hosta, który może najpierw przenieść urządzenie z systemem Android z trybu programowania do trybu akcesoriów, a następnie host musi przesłać dane audio z odpowiedniego punktu końcowego. W związku z tym urządzenie z systemem Android nie jest widoczne dla hosta jako „bez sterownika”.
  • Kierunek musi być wprowadzony , wyrażony w stosunku do hosta
  • Format audio musi być 16-bitowym 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 nowych projektach.

Zastosowania cyfrowego audio USB

Jak 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ć. Istnieją pewne kompromisy w wyborze miejsca konwersji.

Opowieść o dwóch przetwornikach DAC

Na poniższym przykładowym diagramie porównujemy dwa 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. Rozważamy również urządzenie mobilne z USB podłączonym do zewnętrznego DAC USB i wzmacniacza, również ze słuchawkami.

Porównanie DAC

Rysunek 3. Porównanie dwóch przetworników cyfrowo-analogowych

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

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

Pierwsza konstrukcja A jest prostsza, tańsza, zużywa mniej energii i będzie bardziej niezawodną konstrukcją, przy założeniu równie niezawodnych komponentów. Jednak zwykle istnieją kompromisy dotyczące jakości dźwięku w porównaniu z innymi wymaganiami. Na przykład, jeśli jest to urządzenie przeznaczone na rynek masowy, może być zaprojektowane tak, aby odpowiadało 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 z systemem Android B na rynku masowym. Tak, jest to droższa konstrukcja, ale koszt jest pochłaniany tylko przez tych, którzy tego chcą.

Urządzenia mobilne są znane z posiadania płytek drukowanych o dużej gęstości, co może skutkować większą liczbą przesłuchów, które degradują sąsiednie sygnały analogowe. Komunikacja cyfrowa jest mniej podatna na zakłócenia , więc przeniesienie przetwornika cyfrowo-analogowego z urządzenia z systemem Android A na zewnętrzną płytkę drukowaną C umożliwia fizyczne i elektryczne odizolowanie końcowych stopni analogowych od gęstej i zaszumionej płytki drukowanej, co skutkuje wyższą wiernością dźwięku.

Z drugiej strony, drugi projekt jest bardziej złożony, a wraz z dodatkową złożonością pojawia się więcej okazji do niepowodzenia. Istnieje również dodatkowe opóźnienie ze strony kontrolerów USB.

Aplikacje w trybie hosta

Typowe aplikacje audio w trybie hosta USB obejmują:

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

W przypadku wszystkich tych aplikacji system Android wykrywa zgodne cyfrowe urządzenia peryferyjne audio USB i automatycznie kieruje odpowiednio odtwarzanie i przechwytywanie dźwięku, na podstawie reguł dotyczących dźwięku. Treść stereo jest odtwarzana na dwóch pierwszych kanałach urządzenia peryferyjnego.

Nie ma interfejsów API specyficznych dla cyfrowego dźwięku USB. W przypadku zastosowań zaawansowanych automatyczne trasowanie może kolidować z aplikacjami obsługującymi USB. W przypadku takich aplikacji wyłącz automatyczne kierowanie za pomocą odpowiedniego elementu sterującego w sekcji Media w Ustawieniach / Opcjach programisty .

Debugowanie w trybie hosta

W trybie hosta USB debugowanie adb przez USB jest niedostępne. Alternatywne rozwiązanie można znaleźć w sekcji Bezprzewodowe użycie Android Debug Bridge .

Wdrażanie dźwięku USB

Zalecenia dla dostawców urządzeń peryferyjnych audio

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

  • projekt pod kątem zgodności z klasą audio; obecnie Android jest skierowany do klasy 1, ale rozsądnie jest zaplanować klasę 2
  • unikaj dziwactw
  • test pod kątem współpracy z urządzeniami referencyjnymi i popularnymi urządzeniami z systemem Android
  • jasno dokumentuj obsługiwane funkcje, zgodność z klasą audio, 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 do obsługi trybu hosta USB
  • włącz obsługę standardowego hosta USB na poziomie struktury za pomocą flagi funkcji android.hardware.usb.host.xml
  • włącz wszystkie potrzebne funkcje jądra: tryb hosta USB, audio USB, tryb transferu izochronicznego; zobacz Konfiguracja jądra systemu Android
  • być na bieżąco z najnowszymi wydaniami jądra i łatkami; pomimo szlachetnego celu, jakim jest zgodność klas, istnieją zachowane urządzenia peryferyjne audio z dziwactwami , a najnowsze jądra mają obejścia takich dziwactw
  • włącz zasady USB audio, jak opisano poniżej
  • dodaj audio.usb.default do PAKIETÓW_PRODUKTÓW w device.mk
  • test współpracy z typowymi urządzeniami peryferyjnymi audio USB

Jak włączyć zasady dotyczące dźwięku USB

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

device/oem/codename/audio_policy.conf

Składnik nazwy ś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

Implementacja warstwy abstrakcji sprzętu audio (HAL) dla dźwięku USB znajduje się tutaj:

hardware/libhardware/modules/usbaudio/

HAL USB audio opiera się w dużej mierze na tinyalsa , opisanym w Audio Terminology . Chociaż audio USB opiera się na transferach izochronicznych, jest to usuwane przez implementację ALSA. Tak więc USB audio HAL i tinyalsa nie muszą zajmować się tą częścią protokołu USB.

Testowanie dźwięku USB

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