Cyfrowy dźwięk USB

W tym artykule opisano 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 SoC, dostawcy urządzeń peryferyjnych USB audio, twórcy zaawansowanych aplikacji audio i inne osoby poszukujące szczegółowej wiedzy na temat wewnętrznych cyfrowych urządzeń audio USB w systemie Android.

Użytkownicy końcowi urządzeń Nexus powinni zapoznać się z artykułem 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źć część zainteresowania.

Przegląd USB

Uniwersalna magistrala szeregowa (USB) jest nieformalnie opisana w artykule USB w Wikipedii i formalnie zdefiniowana w standardach opublikowanych przez USB Implementers Forum, Inc. Dla wygody podsumowaliśmy tutaj kluczowe koncepcje USB, ale standardy są autorytatywnym punktem odniesienia.

Podstawowe pojęcia i terminologia

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

Uwaga: terminy urządzenie i akcesorium są powszechnymi synonimami określenia „urządzenie peryferyjne ”. Unikamy tutaj tych terminów, ponieważ mogą one zostać pomylone z urządzeniem z Androidem lub koncepcją specyficzną dla Androida, nazywaną trybem akcesoriów .

Kluczową rolą hosta jest enumeracja : proces wykrywania, które urządzenia peryferyjne są podłączone do magistrali i odpytywanie 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ę 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 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 służy do dwukierunkowego sterowania i statusu. Potok strumieniowy służy do jednokierunkowego przesyłania danych.

Host inicjuje wszystkie transfery danych, stąd terminy wejścia i wyjścia 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.

Istnieją trzy główne tryby przesyłania danych: przerwanie , masowy i izochroniczny . 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 z „rzeczywistego świata”. Terminale są obiektami logicznymi funkcji.

Tryby USB na Androida

Tryb rozwoju

Tryb programistyczny jest obecny od pierwszego wydania Androida. Urządzenie z systemem Android pojawia się jako urządzenie peryferyjne USB na komputerze-hoście z komputerowym systemem operacyjnym, takim jak Linux, Mac OS X lub Windows. Jedyną widoczną funkcją peryferyjną jest albo fastboot systemu Android , albo 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 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ępna jest odpowiednia moc, ładowanie 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 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 pełniąca 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 rozpoczyna pracę w trybie programistycznym, a następnie przechodzi w tryb akcesoriów w ramach procesu ponownej negocjacji.

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

Dźwięk USB

Klasy USB

Każda funkcja peryferyjna ma skojarzony 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 peryferyjnych bez szczegółowej wzajemnej wiedzy o działaniu. Zgodność klas ma kluczowe znaczenie, jeśli host i urządzenie peryferyjne są dostarczane przez różne jednostki.

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 określonego dla systemu operacyjnego. Można założyć, że urządzenie peryferyjne reklamowane jako „bez sterownika” 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 peryferiami, które implementują funkcje audio, a więc trzymają się klasy urządzeń audio. Istnieją dwie edycje 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, natomiast Media Transfer Protocol (MTP) służy do pełnego dostępu do plików do multimediów. Do przesyłania plików audio można używać zarówno MSC, jak i MTP, ale tylko klasa audio USB jest odpowiednia do przesyłania strumieniowego w czasie rzeczywistym.

Terminale audio

Zaciski urządzenia peryferyjnego audio są zwykle analogowe. Sygnał analogowy prezentowany na terminalu wejściowym urządzenia peryferyjnego jest konwertowany na sygnał cyfrowy przez konwerter analogowo-cyfrowy (ADC) i jest przenoszony 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 prezentuje na analogowym terminalu wyjściowym. DAC jest zlewem dla hosta.

Kanały

Urządzenie peryferyjne z funkcją audio może obejmować terminal źródłowy, terminal 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 . Powszechne jest interpretowanie strumienia stereofonicznego jako składającego się z lewego i prawego kanału, a co za tym idzie interpretowanie strumienia wielokanałowego jako posiadającego lokalizacje przestrzenne odpowiadające każdemu kanałowi. Jednak jest również całkiem odpowiednie (zwłaszcza w przypadku audio USB, bardziej niż HDMI ), aby nie przypisywać żadnego konkretnego standardowego znaczenia przestrzennego do każdego kanału. W takim przypadku do aplikacji i użytkownika należy zdefiniowanie sposobu 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.

Tryb transferu izochronicznego

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

Transmisje izochroniczne występują w każdym okresie rozpoczęcia ramki (SOF). Okres SOF wynosi jedną milisekundę dla pełnej szybkości i 125 mikrosekund dla dużej szybkości. Każda ramka o pełnej szybkości przenosi do 1023 bajtów ładunku, a ramka o dużej szybkości przenosi do 1024 bajtów. Łącząc je, obliczamy maksymalną szybkość transferu jako 1023 000 lub 8 192 000 bajtów na sekundę. Ustawia to teoretyczny górny limit łą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 podtryby:

  • Adaptacyjny
  • Asynchroniczny
  • Synchroniczny

W adaptacyjnym trybie podrzędnym odbiornik lub źródło peryferyjne 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ę do niej. Podstawową 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 jak lub pochodny) zegara sterującego przetwornikiem cyfrowo-analogowym lub przetwornikiem cyfrowo-analogowym. Ta bliskość oznacza, że ​​podtryb asynchroniczny powinien być mniej podatny na fluktuacje zegara. Ponadto zegar używany przez przetwornik cyfrowo-analogowy lub przetwornik cyfrowo-analogowy 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 uzyskiwana z zegara USB. Tryb podrzędny synchroniczny nie jest powszechnie używany z dźwiękiem, ponieważ zarówno host, jak i urządzenie peryferyjne są na łasce zegara USB.

Poniższa tabela podsumowuje podtryby izochroniczne:

Tryb podrzędny Liczba bajtów
za opakowanie
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 (poziom API 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łębokość bitowa musi być 16-bitowa, 24-bitowa lub 32-bitowa, 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)

Przeglądanie kodu źródłowego platformy Android może pokazywać 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 na hoście. 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 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 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 systemem Android nie wydaje się hostowi „bez sterownika”.
  • Kierunek musi być danymi wejściowymi , wyrażonymi 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 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 przez sygnał analogowy używany przez wspólne złącze mini zestawu słuchawkowego TRS . Ostatecznie każdy sygnał cyfrowy musi zostać przekonwertowany na analogowy, zanim będzie słyszalny. Istnieją kompromisy w wyborze miejsca, w którym należy umieścić tę konwersję.

Opowieść o dwóch przetwornikach cyfrowo-analogowych

Na poniższym przykładowym schemacie porównujemy dwa projekty. Najpierw mamy urządzenie mobilne z procesorem aplikacji (AP), wbudowanym przetwornikiem cyfrowo-analogowym, wzmacniaczem i analogowym złączem TRS dołączonym do słuchawek. Rozważamy również urządzenie mobilne z USB podłączone do zewnętrznego DAC-a 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: jest to sztuczne porównanie, ponieważ prawdziwe urządzenie z Androidem prawdopodobnie miałoby 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 zazwyczaj istnieją kompromisy między jakością dźwięku a innymi wymaganiami. Na przykład, jeśli jest to urządzenie przeznaczone na rynek masowy, może być zaprojektowane tak, aby odpowiadało potrzebom zwykłego 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ższy projekt, ale koszt jest pochłaniany tylko przez tych, 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ę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 zapewnia wyższą wierność dźwięku.

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

Aplikacje trybu 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ądzenie peryferyjne audio USB i automatycznie kieruje odtwarzanie i przechwytywanie dźwięku zgodnie z regułami zasad dotyczących dźwięku. Treść stereo jest odtwarzana na pierwszych dwóch kanałach urządzenia peryferyjnego.

Nie ma interfejsów API związanych z cyfrowym dźwiękiem USB. W przypadku zaawansowanych zastosowań automatyczny routing 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 zapoznać się z 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:

  • projekt pod kątem zgodności z klasą dźwięku; obecnie Android jest skierowany do klasy 1, ale mądrze jest zaplanować klasę 2
  • unikaj dziwactw
  • test współdziałania z referencyjnymi i popularnymi urządzeniami z systemem Android
  • jasno udokumentować obsługiwane funkcje, zgodność z klasą dźwięku, wymagania dotyczące zasilania itp., aby konsumenci mogli podejmować świadome decyzje

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

Aby obsługiwać cyfrowe audio USB, producenci OEM urządzeń i dostawcy SoC powinni:

  • Zaprojektuj sprzęt do obsługi trybu hosta USB
  • włączyć 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
  • bądź na bieżąco z najnowszymi wydaniami i łatami jądra; pomimo szlachetnego celu zgodności z klasą, istnieją istniejące 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
  • test współdziałania z popularnymi urządzeniami peryferyjnymi USB audio

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

Aby włączyć dźwięk USB, dodaj wpis do pliku konfiguracyjnego zasad dźwięku. Zazwyczaj 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 „codename” należy zastąpić nazwą kodową urządzenia.

Przykładowy wpis jest pokazany 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żej mierze 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 CTS USB Audio .