Cyfrowy dźwięk USB

W tym artykule omówiono obsługę cyfrowego dźwięku USB w systemie Android 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, twórcy zaawansowanych aplikacji audio i inne osoby poszukujące szczegółowego zrozumienia 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źć interesujące go fragmenty.

Przegląd 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 podsumowaliśmy tutaj najważniejsze koncepcje USB, ale miarodajnym odniesieniem są standardy.

Podstawowe pojęcia i terminologia

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

Uwaga: Terminy urządzenie i akcesoria są powszechnymi 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, 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 implementować wiele funkcji logicznych. Na przykład urządzenie peryferyjne kamery internetowej może mieć zarówno funkcję kamery, jak i funkcję audio 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: komunikat i strumień . Potok komunikatów służy do dwukierunkowej kontroli i stanu. 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żone 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.

Istnieją trzy główne tryby przesyłania danych: przerwania , masowe i izochroniczne . Tryb izochroniczny zostanie omówiony dalej w kontekście audio.

Urządzenie peryferyjne może mieć terminale , 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 „ze świata rzeczywistego”. Terminale są obiektami logicznymi funkcji.

Tryby USB Androida

Tryb rozwoju

Tryb programistyczny jest obecny od pierwszego wydania Androida. Urządzenie z systemem Android jest wyświetlane jako urządzenie peryferyjne USB na komputerze głównym z systemem operacyjnym, takim jak Linux, Mac OS X lub Windows. Jedyną widoczną funkcją peryferyjną jest Android fastboot lub Android Debug Bridge (adb) . Protokoły fastboot i adb są nałożone 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 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 urządzenie peryferyjne i ile jest w stanie dostarczyć urządzenie z systemem Android. Nawet jeśli dostępne jest odpowiednie zasilanie, ładowanie baterii urządzenia z Androidem 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 interfejsu API 12) i przeniesiony z powrotem do systemu Android 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óra służy jako host. 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 rozpoczyna pracę w trybie programistycznym, a następnie przechodzi do trybu akcesoriów w procesie ponownej negocjacji.

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 współdziałanie zgodnych z klasą hostów i funkcji urządzeń peryferyjnych bez szczegółowej wiedzy o wzajemnym działaniu. Zgodność z klasą ma kluczowe znaczenie, jeśli host i urządzenie peryferyjne są dostarczane przez różne podmioty.

Termin „ bez sterowników ” 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 „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 więc należącymi do klasy urządzeń audio. Istnieją dwie edycje specyfikacji klas 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 mogą być mylone z klasą audio. Klasa pamięci masowej (MSC) służy do sektorowego dostępu do multimediów, podczas gdy Media Transfer Protocol (MTP) zapewnia pełny dostęp do plików. Zarówno MSC, jak i MTP mogą być używane do przesyłania plików audio, ale tylko klasa audio USB nadaje się do przesyłania strumieniowego w czasie rzeczywistym.

Terminale audio

Zaciski urządzeń peryferyjnych audio są zwykle analogowe. Sygnał analogowy prezentowany na terminalu wejściowym urządzenia peryferyjnego jest konwertowany na cyfrowy przez przetwornik 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 obejmować terminal źródłowy, terminal ujścia 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ę, że strumień stereo składa się z lewego i prawego kanału, a co za tym idzie, interpretuje się, że strumień wielokanałowy ma lokalizacje przestrzenne odpowiadające każdemu kanałowi. Jednak jest również całkiem odpowiednie (zwłaszcza w przypadku dźwięku USB bardziej niż HDMI ), aby nie przypisywać żadnego konkretnego 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ł odbiera sygnał wejściowy z radia AM.

Tryb transferu izochronicznego

USB audio wykorzystuje izochroniczny tryb transferu ze względu na swoją charakterystykę czasu rzeczywistego, kosztem odzyskiwania po błędach. W trybie izochronicznym przepustowość jest gwarantowana, a błędy transmisji danych są wykrywane za pomocą cyklicznej kontroli redundancji (CRC). Ale nie ma potwierdzenia pakietu ani retransmisji w przypadku błędu.

Transmisje izochroniczne występują 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 prędkości. Każda ramka o pełnej szybkości przenosi do 1023 bajtów danych, a ramka o dużej szybkości przenosi do 1024 bajtów. Łącząc je razem, obliczamy maksymalną szybkość transferu jako 1 023 000 lub 8 192 000 bajtów na sekundę. Ustawia to teoretyczną górną granicę łącznej częstotliwości próbkowania dźwięku, 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, ujście lub źródło peryferyjne dostosowuje się do potencjalnie zmieniającej się częstotliwości próbkowania hosta.

W podtrybie asynchronicznym (zwanym także niejawnym sprzężeniem zwrotnym) ujście lub źródło określa częstotliwość próbkowania, a host dostosowuje się. Główną teoretyczną zaletą asynchronicznego trybu podrzędnego jest to, że zegar USB źródła lub odbiornika jest fizycznie i elektrycznie bliższy (i rzeczywiście może być taki sam lub pochodzi od) zegara, który steruje przetwornikiem cyfrowo-analogowym lub przetwornikiem cyfrowo-analogowym. Ta bliskość oznacza, że ​​podtryb asynchroniczny powinien być mniej podatny na jitter zegara. Ponadto zegar używany przez przetwornik DAC lub ADC może być zaprojektowany z myślą o większej dokładności i mniejszym dryfowaniu niż zegar hosta.

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

Poniższa tabela podsumowuje izochroniczne tryby podrzędne:

Tryb podrzędny Liczba bajtów
za 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 tryb podrzędny ma oczywiście znaczenie, ale należy również wziąć pod uwagę 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 (API poziom 21) i nowszy obsługuje podzbiór funkcji USB audio 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 dźwiękowych są wyrównane do lewej w obrębie najbardziej znaczących bitów 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)

Analiza kodu źródłowego systemu Android może spowodować wyświetlenie dodatkowego kodu wykraczającego poza minimum niezbędne 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 (API poziom 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 systemem Android służy jako źródło danych dla hosta, na przykład stacji dokującej.

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 przełączyć urządzenie z systemem Android z trybu programistycznego do trybu akcesoriów, a następnie host musi przesłać dane audio z odpowiedniego punktu końcowego. W ten sposób urządzenie z Androidem nie wydaje się hostowi „bez sterownika”.
  • Kierunek musi być wprowadzony , wyrażony względem hosta
  • 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 dźwięku cyfrowego USB

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

Opowieść o dwóch przetwornikach cyfrowo-analogowych

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łączone do zewnętrznego przetwornika cyfrowo-analogowego USB i wzmacniacza, również ze słuchawkami.

Porównanie DAC-ów

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ż prawdziwe urządzenie z Androidem prawdopodobnie miałoby dostępne obie opcje.

Pierwszy projekt A jest prostszy, tańszy, zużywa mniej energii i będzie bardziej niezawodny, przy założeniu równie niezawodnych komponentów. Jednak zwykle istnieją kompromisy w zakresie 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ć 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 systemem Android B na rynku masowym. Tak, jest to droższy projekt, ale koszt jest pochłaniany tylko przez ci, którzy tego chcą.

Urządzenia mobilne są znane z tego, że mają płytki drukowane o dużej gęstości, co może skutkować większymi możliwościami przesłuchu , który degraduje sąsiednie sygnały analogowe. Komunikacja cyfrowa jest mniej podatna na szumy , 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 hałaśliwej 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
  • wiadomości błyskawiczne i czat głosowy
  • nagranie

W przypadku wszystkich tych aplikacji system Android wykrywa kompatybilne cyfrowe urządzenie peryferyjne audio USB i automatycznie odpowiednio kieruje odtwarzaniem i przechwytywaniem dźwięku, w oparciu o zasady zasad dotyczących dźwięku. Zawartość stereo jest odtwarzana na pierwszych dwóch kanałach urządzenia peryferyjnego.

Nie ma żadnych interfejsów API specyficznych dla cyfrowego dźwięku USB. W przypadku zaawansowanych zastosowań automatyczne kierowanie może zakłócać działanie aplikacji obsługujących 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. Zobacz sekcję Bezprzewodowe korzystanie z Android Debug Bridge , aby znaleźć alternatywę.

Implementacja 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:

  • konstrukcja zapewniająca zgodność z klasą audio; obecnie Android jest ukierunkowany na klasę 1, ale mądrze jest zaplanować klasę 2
  • unikać dziwactw
  • przetestować interoperacyjność z referencyjnymi i popularnymi urządzeniami z Androidem
  • jasno dokumentuj obsługiwane funkcje, zgodność klas dźwięku, wymagania dotyczące zasilania itp., aby konsumenci mogli podejmować świadome decyzje

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

Aby zapewnić obsługę dźwięku cyfrowego USB, producenci OEM urządzeń i dostawcy SoC powinni:

  • zaprojektuj sprzęt obsługujący tryb hosta USB
  • włącz ogólną obsługę hosta USB na poziomie struktury za pomocą flagi funkcji android.hardware.usb.host.xml
  • włączyć wszystkie potrzebne funkcje jądra: tryb hosta USB, dźwięk USB, tryb transferu izochronicznego; zobacz Konfiguracja jądra Androida
  • być na bieżąco z najnowszymi wydaniami jądra i łatami; pomimo szlachetnego celu, jakim jest zgodność z klasą, istnieją urządzenia peryferyjne audio z dziwactwami , a najnowsze jądra mają obejścia dla takich dziwactw
  • włącz zasady audio USB zgodnie z poniższym opisem
  • dodaj audio.usb.default do PRODUCT_PACKAGES w device.mk
  • test współdziałania z popularnymi urządzeniami peryferyjnymi audio USB

Jak włączyć zasady 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

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

hardware/libhardware/modules/usbaudio/

USB audio HAL w dużym stopniu opiera się na tinyalsa , opisanej w Audio terminology . Chociaż dźwięk USB opiera się na transferach izochronicznych, jest to abstrahowane 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 testowania CTS dla dźwięku USB, zobacz Testy weryfikacyjne USB Audio CTS .