Audio digital USB

Artikel ini meninjau dukungan Android untuk audio digital USB dan terkait Protokol berbasis USB.

Audiens

Target audiens artikel ini adalah OEM perangkat Android, vendor SoC, Pemasok periferal audio USB, pengembang aplikasi audio canggih, dan yang lainnya mencari pemahaman mendetail tentang internal audio digital USB di Android.

Pengguna akhir perangkat Nexus harus melihat artikel tersebut Merekam dan memutar audio menggunakan mode host USB di Pusat Bantuan Nexus. Meskipun artikel ini tidak berorientasi pada pengguna akhir, konsumen audiofil tertentu mungkin merasa tertarik.

Ringkasan USB

Universal Serial Bus (USB) dijelaskan secara informal di artikel Wikipedia USB, dan secara formal didefinisikan oleh standar yang diterbitkan oleh USB Implementers Forum, Inc. Untuk memudahkan, kami merangkum konsep penting USB di sini, tetapi standarnya adalah referensi otoritatif.

Konsep dan terminologi dasar

USB adalah bus dengan satu inisiator operasi transfer data, yang disebut host. {i>Host<i} berkomunikasi dengan periferal melalui bus.

Catatan: Istilah perangkat dan aksesori adalah sinonim umum untuk periferal. Kita menghindari istilah-istilah tersebut di sini, karena dapat disalahartikan sebagai Perangkat Android atau konsep khusus Android yang disebut mode aksesori.

Peran host yang penting adalah enumerasi: proses mendeteksi periferal mana yang terhubung ke bus, dan membuat kueri propertinya yang dinyatakan melalui deskriptor.

Periferal dapat berupa satu objek fisik tetapi sebenarnya menerapkan beberapa fungsi logis. Misalnya, periferal webcam dapat memiliki fungsi kamera dan fungsi audio mikrofon.

Setiap fungsi periferal memiliki antarmuka yang mendefinisikan protokol yang berkomunikasi dengan fungsi tersebut.

Host berkomunikasi dengan periferal melalui pipa ke endpoint, sumber data atau sink disediakan oleh salah satu fungsi periferal.

Ada dua jenis pipa: pesan dan stream. Pipa pesan digunakan untuk kontrol dan status dua arah. Pipa aliran digunakan untuk transfer data searah.

{i>Host<i} memulai semua transfer data, oleh karena itu, istilah input dan output dinyatakan relatif terhadap host. Operasi {i>input<i} mentransfer data dari periferal ke {i>host<i}, sementara operasi {i>output<i} mentransfer data dari {i>host<i} ke periferal.

Ada tiga mode transfer data utama: menginterupsi, massal, dan isokronus. Mode isokronos akan dibahas lebih lanjut dalam konteks audio.

Periferal mungkin memiliki terminal yang terhubung ke dunia luar, di luar periferal itu sendiri. Dengan cara ini, periferal berfungsi untuk menerjemahkan protokol USB dan “dunia nyata” sinyal internal. Terminal adalah objek logis dari fungsi.

Mode USB Android

Mode pengembangan

Mode pengembangan telah ada sejak rilis awal Android. Perangkat Android muncul sebagai periferal USB ke PC {i>host<i} yang menjalankan sistem operasi {i>desktop<i} seperti Linux, Mac OS X, atau Windows. Satu-satunya fungsi periferal yang terlihat Fastboot Android atau Android Debug Bridge (adb). Protokol fastboot dan adb dilapiskan melalui mode transfer data massal USB.

Mode host

Mode host diperkenalkan di Android 3.1 (API level 12).

Perangkat Android harus bertindak sebagai host dan sebagian besar perangkat Android menyertakan konektor {i>micro-USB<i} yang tidak secara langsung mengizinkan operasi {i>host<i}, adaptor OTG kapan saja di mana saja seperti ini biasanya diperlukan:

OTG

Gambar 1. Adaptor dalam perjalanan (OTG)

Perangkat Android mungkin tidak menyediakan daya yang cukup untuk mengoperasikan periferal tertentu, tergantung pada seberapa besar daya yang dibutuhkan periferal, dan seberapa banyak perangkat Android yang mampu disediakan. Meskipun jika tersedia daya yang memadai, pengisian daya baterai perangkat Android mungkin dipersingkat secara signifikan. Untuk situasi ini, gunakan hub seperti ini:

Hub yang ditenagai

Gambar 2. Hub yang ditenagai

Mode aksesori

Mode aksesori diperkenalkan di Android 3.1 (API level 12) dan di-backport ke Android 2.3.4. Dalam mode ini, perangkat Android beroperasi sebagai periferal USB, di bawah kendali perangkat lain seperti dok yang berfungsi sebagai {i>host<i}. Perbedaan antara mode pengembangan dan mode aksesori adalah fungsi USB tambahan terlihat oleh host, selain adb. Perangkat Android dimulai dalam mode pengembangan lalu transisi ke mode aksesori melalui proses negosiasi ulang.

Mode aksesori diperluas dengan fitur tambahan di Android 4.1, khususnya audio yang dijelaskan di bawah ini.

Audio USB

Kelas USB

Setiap fungsi periferal memiliki dokumen class perangkat terkait yang menentukan protokol standar untuk fungsi tersebut. Hal ini memungkinkan fungsi periferal dan host yang sesuai kelas untuk saling beroperasi, tanpa pengetahuan mendetail tentang pekerjaan satu sama lain. Kepatuhan kelas sangatlah penting jika host dan periferal disediakan oleh entitas yang berbeda.

Istilah driverless adalah sinonim umum untuk kesesuaian kelas, menunjukkan bahwa mungkin untuk menggunakan fitur standar layanan periferal tanpa memerlukan sistem operasi khusus driver untuk diinstal. Orang dapat berasumsi bahwa periferal diiklankan sebagai "no driver needed" untuk sistem operasi {i>desktop<i} terkemuka akan mematuhi kelas, meskipun mungkin ada pengecualian.

Kelas audio USB

Di sini kita hanya memikirkan periferal yang mengimplementasikan fungsi audio, sehingga dapat mematuhi class perangkat audio. Ada dua edisi spesifikasi kelas audio USB: kelas 1 (UAC1) dan 2 (UAC2).

Perbandingan dengan kelas lain

USB mencakup banyak kelas perangkat lain, beberapa di antaranya mungkin membingungkan dengan kelas audio. Tujuan kelas penyimpanan massal (MSC) digunakan untuk akses berorientasi sektor ke media, sementara Protokol Transfer Media (MTP) adalah untuk akses file penuh ke media. Baik MSC dan MTP dapat digunakan untuk mentransfer file audio, tetapi hanya kelas audio USB yang cocok untuk streaming {i>real-time<i}.

Terminal audio

Terminal periferal audio biasanya bersifat analog. Sinyal analog yang disajikan di terminal input periferal dikonversi menjadi digital oleh pengonversi analog ke digital (ADC), dan dibawa melalui protokol USB untuk digunakan oleh {i>host<i}. ADC adalah sumber data bagi {i>host<i}. Demikian pula, {i>host<i} mengirim sinyal audio digital melalui protokol USB ke periferal, di mana sebuah pengonversi digital ke analog (DAC) melakukan konversi dan mempresentasikan ke terminal {i>output<i} analog. DAC adalah sink untuk host.

Saluran

Periferal dengan fungsi audio dapat mencakup terminal sumber, terminal sink, atau keduanya. Setiap arah dapat memiliki satu saluran (mono), dua saluran (stereo), atau lainnya. Periferal dengan lebih dari dua saluran disebut multisaluran. Merupakan hal yang umum untuk menginterpretasikan bahwa streaming stereo terdiri dari left dan right, dan dengan demikian, untuk menafsirkan streaming multichannel sebagai memiliki lokasi spasial yang sesuai dengan setiap saluran. Namun, ini juga sangat tepat (terutama untuk audio USB, bukan HDMI) untuk tidak menetapkan arti spasial standar ke setiap saluran. Dalam hal ini, terserah aplikasi dan pengguna untuk menentukan cara setiap saluran digunakan. Misalnya, aliran data input USB empat saluran mungkin memiliki tiga saluran yang terpasang ke berbagai mikrofon dalam ruangan, dan terakhir yang menerima input dari radio AM.

Mode transfer isokronus

Audio USB menggunakan mode transfer isokronus untuk karakteristik {i>real-time<i}-nya, dengan mengorbankan pemulihan {i>error<i}. Dalam mode isokronus, bandwidth dijamin, dan transmisi data kesalahan dideteksi menggunakan {i>cyclic redundancy check<i} (CRC). Namun, ada tidak ada pengakuan atau transmisi ulang paket jika terjadi {i>error<i}.

Transmisi isokronus terjadi setiap periode Start Of Frame (SOF). Periode SOF adalah satu milidetik untuk kecepatan penuh, dan 125 mikrodetik untuk dengan kecepatan tinggi. Setiap {i>frame<i} berkecepatan penuh membawa hingga 1023 byte payload, dan {i>frame<i} berkecepatan tinggi membawa hingga 1024 byte. Dengan menggabungkan ketiganya, kita menghitung kecepatan transfer maksimum sebagai 1.023.000 atau 8.192.000 byte dan Operasi input/output per detik dengan jumlah tinggi. Tindakan ini akan menetapkan batas atas teoretis pada audio gabungan frekuensi sampel, jumlah channel, dan kedalaman bit. Batas praktisnya lebih rendah.

Dalam mode isocronus, terdapat tiga submode:

  • Adaptif
  • Asinkron
  • Sinkron

Dalam sub-mode adaptif, sink atau sumber periferal beradaptasi dengan frekuensi sampel yang berpotensi bervariasi dari {i>host<i}.

Dalam sub-mode asinkron (juga disebut umpan balik implisit), {i>sink<i} atau sumber menentukan frekuensi sampel, dan yang diakomodasi oleh {i>host<i}. Keuntungan teoritis utama dari sub-mode asinkron adalah bahwa model sumber atau wastafel jam USB secara fisik dan elektrik lebih dekat ke (dan memang sama dengan, atau berasal dari) waktu yang menggerakkan DAC atau ADC. Kedekatan ini berarti bahwa sub-mode asinkron seharusnya tidak terlalu rentan ke jitter jam. Selain itu, jam yang digunakan oleh DAC atau ADC mungkin dirancang untuk akurasi yang lebih tinggi dan penyimpangan yang lebih rendah dari jam {i>host<i}.

Dalam sub-mode sinkron, byte dalam jumlah tetap ditransfer setiap periode SOF. Frekuensi sampel audio diambil secara efektif dari jam USB. Sub-mode sinkron tidak biasa digunakan dengan audio karena {i>host<i} dan periferal dijamin oleh jam USB.

Tabel di bawah ini merangkum sub-mode isokronus:

Sub-mode Jumlah byte
per paket
Frekuensi sampel
ditentukan oleh
Digunakan untuk audio
adaptif variabel host ya
tidak sinkron variabel periferal ya
sinkron tetap Jam USB tidak

Dalam praktiknya, sub-mode memang penting, tetapi faktor lain juga harus dipertimbangkan.

Dukungan Android untuk kelas audio USB

Mode pengembangan

Audio USB tidak didukung dalam mode pengembangan.

Mode host

Android 5.0 (API level 21) dan yang lebih baru mendukung subset fitur audio USB kelas 1 (UAC1):

  • Perangkat Android harus bertindak sebagai host
  • Format audio harus PCM (jenis antarmuka I)
  • Kedalaman bit harus 16-bit, 24-bit, atau 32-bit di mana 24 bit data audio yang berguna diratakan ke kiri dalam rentang bit dari kata 32-bit
  • Frekuensi sampel harus 48, 44,1, 32, 24, 22,05, 16, 12, 11,025, atau 8 kHz
  • Jumlah channel harus 1 (mono) atau 2 (stereo)

Alat sumber kode sumber framework Android dapat menampilkan kode tambahan melebihi jumlah minimum yang diperlukan untuk mendukung fitur ini. Tapi kode ini belum divalidasi, sehingga fitur lanjutan lainnya belum diklaim.

Mode aksesori

Android 4.1 (API level 16) menambahkan dukungan terbatas untuk pemutaran audio ke host. Saat dalam mode aksesori, Android akan otomatis merutekan output audionya ke USB. Artinya, perangkat Android berfungsi sebagai sumber data bagi host, misalnya dok.

Audio mode aksesori memiliki fitur berikut:

  • Perangkat Android harus dikontrol oleh {i>host<i} ahli yang dapat mengalihkan perangkat Android dari mode pengembangan ke mode aksesori terlebih dahulu, dan kemudian {i>host<i} harus mentransfer data audio dari endpoint yang sesuai. Dengan demikian, perangkat Android tidak tampak "tanpa driver" kepada {i>host<i}.
  • Arahnya harus input, yang dinyatakan secara relatif terhadap host
  • Format audio harus PCM 16-bit
  • Frekuensi sampel harus 44,1 kHz
  • Jumlah channel harus 2 (stereo)

Audio mode aksesori belum diadopsi secara luas, dan saat ini tidak direkomendasikan untuk desain baru.

Penerapan audio digital USB

Sesuai dengan namanya, sinyal audio digital USB direpresentasikan oleh aliran data digital bukan analog yang digunakan oleh TRS mini umum konektor headset. Pada akhirnya, semua sinyal digital harus dikonversi ke analog sebelum dapat didengar. Ada untung-rugi dalam memilih lokasi untuk menempatkan konversi tersebut.

Kisah dua DAC

Pada contoh diagram di bawah ini, kami membandingkan dua desain. Pertama, kita memiliki perangkat seluler dengan {i>Application Processor<i} (AP), DAC on-board, amplifier, dan konektor TRS analog yang dipasang ke headphone. Kami juga mempertimbangkan perangkat seluler dengan USB yang tersambung ke USB DAC dan amplifier eksternal, dan juga dengan {i>headphone<i}.

Perbandingan DAC

Gambar 3. Perbandingan dua DAC

Desain mana yang lebih baik? Jawabannya tergantung pada kebutuhan Anda. Masing-masing memiliki kelebihan dan kekurangan.

Catatan: Ini adalah perbandingan buatan, karena perangkat Android sesungguhnya akan memiliki kedua opsi tersebut.

Desain pertama A lebih sederhana, lebih murah, menggunakan lebih sedikit daya, dan akan menjadi desain yang lebih andal dengan asumsi komponen yang sama-sama andal. Namun, biasanya ada kompromi kualitas audio vs. persyaratan lainnya. Misalnya, jika ini adalah perangkat yang dipasarkan, perangkat itu mungkin dirancang agar pas kebutuhan konsumen umum, bukan untuk audiofil.

Dalam desain kedua, periferal audio eksternal C dapat dirancang untuk kualitas audio yang lebih tinggi dan output daya yang lebih besar tanpa memengaruhi biaya perangkat Android B di pasar umum. Ya, ini adalah desain yang lebih mahal, tetapi biayanya hanya diserap oleh mereka yang menginginkannya.

Perangkat seluler terkenal memiliki kepadatan tinggi papan sirkuit, yang dapat menghasilkan lebih banyak peluang untuk crosstalk yang menurunkan sinyal analog yang berdekatan. Komunikasi digital tidak terlalu rentan terhadap noise, jadi memindahkan DAC dari perangkat Android A ke papan sirkuit eksternal C memungkinkan tahap analog akhir secara fisik dan elektrik diisolasi dari papan sirkuit yang padat dan berisik, sehingga menghasilkan audio dengan fidelitas lebih tinggi.

Di sisi lain, desain kedua lebih kompleks, dan dengan tambahan kompleksitas peluang terjadinya kegagalan. Ada juga latensi tambahan dari pengontrol USB.

Aplikasi mode host

Aplikasi audio mode host USB yang umum digunakan meliputi:

  • mendengarkan musik
  • telepon
  • fitur pesan instan dan chat suara
  • merekam

Untuk semua aplikasi ini, Android mendeteksi kabel USB digital yang kompatibel periferal audio, dan otomatis merutekan pemutaran serta pengambilan audio dengan sesuai, berdasarkan aturan kebijakan audio. Konten stereo diputar di dua channel pertama periferal.

Tidak ada API khusus untuk audio digital USB. Untuk penggunaan lanjutan, perutean otomatis dapat mengganggu aplikasi yang mendukung USB. Untuk aplikasi semacam itu, nonaktifkan perutean otomatis melalui kontrol yang sesuai di bagian Media pada Setelan / Opsi Developer.

Men-debug saat dalam mode host

Saat dalam mode host USB, proses debug adb melalui USB tidak tersedia. Lihat bagian Penggunaan nirkabel pengguna Android Debug Bridge sebagai alternatif.

Menerapkan audio USB

Rekomendasi untuk vendor periferal audio

Agar dapat saling beroperasi dengan perangkat Android, vendor periferal audio harus:

  • desain untuk kepatuhan kelas audio; saat ini Android menargetkan kelas 1, tetapi akan lebih baik untuk merencanakan kelas 2
  • menghindari kebiasaan
  • uji interoperabilitas dengan referensi dan perangkat Android populer
  • mendokumentasikan dengan jelas fitur yang didukung, kepatuhan kelas audio, persyaratan daya, dll. sehingga konsumen dapat membuat keputusan yang tepat

Rekomendasi untuk OEM perangkat Android dan vendor SoC

Untuk mendukung audio digital USB, OEM perangkat dan vendor SoC harus:

  • desain hardware untuk mendukung mode host USB
  • mengaktifkan dukungan host USB umum di level framework melalui tombol fitur android.hardware.usb.host.xml
  • mengaktifkan semua fitur kernel yang diperlukan: mode host USB, audio USB, mode transfer isokronus; lihat Konfigurasi Kernel Android
  • tetap mengikuti rilis dan {i>patch<i} {i>kernel<i} terbaru; meskipun tujuan mulia dari kepatuhan kelas, masih ada periferal audio dengan keanehan, dan {i>kernel<i} terbaru memiliki solusi untuk kebiasaan
  • aktifkan kebijakan audio USB seperti yang dijelaskan di bawah
  • menambahkan audio.usb.default ke PRODUCT_PACKAGES di device.mk
  • menguji interoperabilitas dengan periferal audio USB umum

Aktifkan kebijakan audio USB

Untuk mengaktifkan audio USB, tambahkan entri ke file konfigurasi kebijakan audio. Hal ini biasanya berlokasi di sini:

device/oem/codename/audio_policy.conf

Komponen nama jalur "oem" harus diganti dengan nama OEM yang memproduksi perangkat Android, dan "codename" harus diganti dengan nama kode perangkat.

Contoh entri ditampilkan di sini:

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
      }
    }
  }
  ...
}

Kode sumber

Hardware Abstraksi Layer (HAL) audio untuk audio USB ada di sini:

hardware/libhardware/modules/usbaudio/

HAL audio USB sangat bergantung pada tinyalsa, dijelaskan di Terminologi audio. Meskipun audio USB bergantung pada transfer isokronus, hal ini diabstraksikan oleh implementasi ALSA. Jadi HAL audio USB dan tinyalsa tidak perlu mengkhawatirkan sendiri dengan bagian protokol USB ini.

Uji audio USB

Guna mengetahui informasi tentang pengujian CTS untuk audio USB, lihat Pengujian Pemverifikasi CTS Audio USB.