Audio Digital USB

Artikel ini mengulas dukungan Android untuk audio digital USB dan protokol berbasis USB terkait.

Hadirin

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

Pengguna akhir perangkat Nexus seharusnya melihat artikel Rekam dan putar ulang audio menggunakan mode host USB di Pusat Bantuan Nexus . Meskipun artikel ini tidak berorientasi pada pengguna akhir, konsumen audiophile tertentu mungkin menemukan bagian yang menarik.

Ikhtisar USB

Universal Serial Bus (USB) secara informal dijelaskan dalam artikel Wikipedia USB , dan secara formal ditentukan oleh standar yang diterbitkan oleh USB Implementers Forum, Inc. Untuk kenyamanan, kami merangkum konsep kunci USB di sini, tetapi standar adalah referensi resmi.

Konsep dasar dan terminologi

USB adalah bus dengan satu inisiator operasi transfer data, yang disebut host . Tuan rumah berkomunikasi dengan periferal melalui bus.

Catatan: Istilah perangkat dan aksesori adalah sinonim umum untuk periferal . Kami menghindari istilah tersebut di sini, karena dapat dikacaukan dengan 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 menanyakan propertinya yang diekspresikan melalui deskriptor .

Sebuah periferal mungkin satu objek fisik tetapi sebenarnya mengimplementasikan beberapa fungsi logis. Misalnya, periferal webcam dapat memiliki fungsi kamera dan fungsi audio mikrofon.

Setiap fungsi periferal memiliki antarmuka yang mendefinisikan protokol untuk berkomunikasi dengan fungsi itu.

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

Ada dua jenis pipa: pesan dan aliran . Sebuah pipa pesan digunakan untuk kontrol dan status dua arah. Sebuah pipa aliran digunakan untuk transfer data uni-directional.

Host memulai semua transfer data, maka istilah input dan output dinyatakan relatif terhadap host. Operasi input mentransfer data dari periferal ke host, sedangkan operasi output mentransfer data dari host ke periferal.

Ada tiga mode transfer data utama: interupsi , massal , dan isokron . Mode isochronous 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 antara protokol USB dan sinyal "dunia nyata". Terminal adalah objek logis dari fungsi.

Mode USB Android

Modus pengembangan

Mode pengembangan telah hadir sejak rilis awal Android. Perangkat Android muncul sebagai periferal USB ke PC host yang menjalankan sistem operasi desktop seperti Linux, Mac OS X, atau Windows. Satu-satunya fungsi periferal yang terlihat adalah fastboot Android atau Android Debug Bridge (adb) . Protokol fastboot dan adb berlapis di atas mode transfer data massal USB.

Modus tuan rumah

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

Karena perangkat Android harus bertindak sebagai host, dan sebagian besar perangkat Android menyertakan konektor micro-USB yang tidak secara langsung mengizinkan pengoperasian host, adaptor saat bepergian ( OTG ) seperti ini biasanya diperlukan:

OTG

Gambar 1. Adaptor saat bepergian (OTG)

Perangkat Android mungkin tidak menyediakan daya yang cukup untuk mengoperasikan periferal tertentu, bergantung pada seberapa besar daya yang dibutuhkan periferal, dan seberapa besar kemampuan perangkat Android untuk memasok. Bahkan jika daya yang memadai tersedia, daya baterai perangkat Android dapat dipersingkat secara signifikan. Untuk situasi ini, gunakan hub bertenaga seperti ini:

hub bertenaga

Gambar 2. Hub bertenaga

Modus aksesori

Mode aksesori diperkenalkan di Android 3.1 (API level 12) dan di-porting kembali ke Android 2.3.4. Dalam mode ini, perangkat Android beroperasi sebagai periferal USB, di bawah kendali perangkat lain seperti dock yang berfungsi sebagai host. Perbedaan antara mode pengembangan dan mode aksesori adalah bahwa fungsi USB tambahan dapat dilihat oleh host, di luar adb. Perangkat Android dimulai dalam mode pengembangan dan kemudian beralih ke mode aksesori melalui proses negosiasi ulang.

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

audio USB

kelas USB

Setiap fungsi periferal memiliki dokumen kelas perangkat terkait yang menetapkan protokol standar untuk fungsi tersebut. Hal ini memungkinkan host yang sesuai dengan kelas dan fungsi periferal untuk saling beroperasi, tanpa pengetahuan rinci tentang cara kerja masing-masing. Kepatuhan kelas sangat penting jika host dan periferal disediakan oleh entitas yang berbeda.

Istilah driverless adalah sinonim umum untuk class compliant , yang menunjukkan bahwa adalah mungkin untuk menggunakan fitur standar periferal tersebut tanpa memerlukan driver khusus sistem operasi untuk diinstal. Seseorang dapat berasumsi bahwa periferal yang diiklankan sebagai "tidak diperlukan driver" untuk sistem operasi desktop utama akan sesuai dengan kelas, meskipun mungkin ada pengecualian.

Kelas audio USB

Di sini kami hanya memperhatikan periferal yang mengimplementasikan fungsi audio, dan dengan demikian mematuhi kelas perangkat audio. Ada dua edisi spesifikasi kelas audio USB: kelas 1 (UAC1) dan 2 (UAC2).

Perbandingan dengan kelas lain

USB menyertakan banyak kelas perangkat lain, beberapa di antaranya mungkin membingungkan dengan kelas audio. Kelas penyimpanan massal (MSC) digunakan untuk akses berorientasi sektor ke media, sedangkan Media Transfer Protocol (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 waktu nyata.

Terminal audio

Terminal periferal audio biasanya analog. Sinyal analog yang disajikan di terminal input periferal diubah menjadi digital oleh konverter analog-ke-digital (ADC), dan dibawa melalui protokol USB untuk dikonsumsi oleh host. ADC adalah sumber data untuk host. Demikian pula, tuan rumah mengirimkan sinyal audio digital melalui protokol USB ke periferal, di mana konverter digital-ke-analog (DAC) mengubah dan menyajikan ke terminal output analog. DAC adalah wastafel untuk tuan rumah.

saluran

Periferal dengan fungsi audio dapat mencakup terminal sumber, terminal wastafel, atau keduanya. Setiap arah mungkin memiliki satu saluran ( mono ), dua saluran ( stereo ), atau lebih. Periferal dengan lebih dari dua saluran disebut multisaluran . Adalah umum untuk menafsirkan aliran stereo yang terdiri dari saluran kiri dan kanan , dan dengan perluasan untuk menafsirkan aliran multisaluran memiliki lokasi spasial yang sesuai dengan setiap saluran. Namun, juga cukup tepat (terutama untuk audio USB lebih dari HDMI ) untuk tidak menetapkan makna spasial standar tertentu untuk setiap saluran. Dalam hal ini, terserah aplikasi dan pengguna untuk menentukan bagaimana setiap saluran digunakan. Misalnya, aliran input USB empat saluran mungkin memiliki tiga saluran pertama yang terpasang ke berbagai mikrofon di dalam ruangan, dan saluran terakhir menerima input dari radio AM.

Mode transfer isokron

Audio USB menggunakan mode transfer isochronous untuk karakteristik real-time-nya, dengan mengorbankan pemulihan kesalahan. Dalam mode isochronous, bandwidth dijamin, dan kesalahan transmisi data dideteksi menggunakan cyclic redundancy check (CRC). Tetapi tidak ada pengakuan paket atau transmisi ulang jika terjadi kesalahan.

Transmisi isochronous terjadi setiap periode Start Of Frame (SOF). Periode SOF adalah satu milidetik untuk kecepatan penuh, dan 125 mikrodetik untuk kecepatan tinggi. Setiap frame kecepatan penuh membawa hingga 1023 byte payload, dan frame kecepatan tinggi membawa hingga 1024 byte. Menyatukan ini, kami menghitung kecepatan transfer maksimum sebagai 1.023.000 atau 8.192.000 byte per detik. Ini menetapkan batas atas teoretis pada laju sampel audio gabungan, jumlah saluran, dan kedalaman bit. Batas praktisnya lebih rendah.

Dalam mode isochronous, ada tiga sub-mode:

  • Adaptif
  • Tidak sinkron
  • Sinkronis

Dalam sub-mode adaptif, wastafel atau sumber periferal beradaptasi dengan laju sampel host yang berpotensi bervariasi.

Dalam sub-mode asinkron (juga disebut umpan balik implisit), sink atau sumber menentukan laju sampel, dan host mengakomodasi. Keuntungan teoritis utama dari sub-mode asinkron adalah bahwa jam USB sumber atau tenggelam secara fisik dan elektrik lebih dekat dengan (dan memang mungkin sama dengan, atau berasal dari) jam yang menggerakkan DAC atau ADC. Kedekatan ini berarti bahwa sub-mode asinkron seharusnya tidak terlalu rentan terhadap jitter jam. Selain itu, jam yang digunakan oleh DAC atau ADC dapat dirancang untuk akurasi yang lebih tinggi dan penyimpangan yang lebih rendah daripada jam host.

Dalam sub-mode sinkron, sejumlah byte tetap ditransfer setiap periode SOF. Tingkat sampel audio secara efektif berasal dari jam USB. Sub-mode sinkron tidak umum digunakan dengan audio karena host dan periferal bergantung pada jam USB.

Tabel di bawah ini merangkum sub-mode isokron:

Sub-mode Jumlah byte
per paket
Tingkat sampel
ditetapkan oleh
Digunakan untuk audio
adaptif variabel tuan rumah Ya
asinkron variabel periferal Ya
sinkronis tetap jam USB Tidak

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

Dukungan Android untuk kelas audio USB

Modus pengembangan

Audio USB tidak didukung dalam mode pengembangan.

Modus tuan rumah

Android 5.0 (API level 21) dan di atasnya mendukung subset fitur kelas audio USB 1 (UAC1):

  • Perangkat Android harus bertindak sebagai host
  • Format audio harus PCM (interface type I)
  • Kedalaman bit harus 16-bit, 24-bit, atau 32-bit di mana 24 bit data audio yang berguna diratakan dalam bit paling signifikan dari kata 32-bit
  • Laju sampel harus 48, 44.1, 32, 24, 22.05, 16, 12, 11.025, atau 8 kHz
  • Jumlah saluran harus 1 (mono) atau 2 (stereo)

Membaca kode sumber kerangka kerja Android mungkin menunjukkan kode tambahan di luar batas minimum yang diperlukan untuk mendukung fitur ini. Tetapi kode ini belum divalidasi, jadi fitur yang lebih canggih belum diklaim.

Modus aksesori

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

Audio mode aksesori memiliki fitur berikut:

  • Perangkat Android harus dikontrol oleh host yang berpengetahuan luas yang pertama-tama dapat mentransisikan perangkat Android dari mode pengembangan ke mode aksesori, dan kemudian host harus mentransfer data audio dari titik akhir yang sesuai. Dengan demikian perangkat Android tidak tampil “driverless” kepada host.
  • Arah harus dimasukkan , dinyatakan relatif terhadap host
  • Format audio harus PCM 16-bit
  • Laju sampel harus 44,1 kHz
  • Jumlah saluran harus 2 (stereo)

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

Aplikasi audio digital USB

Seperti namanya, sinyal audio digital USB diwakili oleh aliran data digital daripada sinyal analog yang digunakan oleh konektor headset mini TRS yang umum . Akhirnya setiap sinyal digital harus diubah menjadi analog sebelum dapat didengar. Ada pengorbanan dalam memilih tempat untuk menempatkan konversi itu.

Kisah dua DAC

Dalam contoh diagram di bawah ini, kami membandingkan dua desain. Pertama, kami memiliki perangkat seluler dengan Application Processor (AP), DAC on-board, amplifier, dan konektor TRS analog yang terpasang pada headphone. Kami juga mempertimbangkan perangkat seluler dengan USB yang terhubung ke DAC dan amplifier USB eksternal, juga dengan headphone.

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 asli mungkin memiliki kedua opsi yang tersedia.

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 pengorbanan kualitas audio vs. persyaratan lainnya. Misalnya, jika ini adalah perangkat pasar massal, mungkin dirancang agar sesuai dengan kebutuhan konsumen umum, bukan untuk audiophile.

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 pasar massal dasar. Ya, ini adalah desain yang lebih mahal, tetapi biayanya hanya diserap oleh mereka yang menginginkannya.

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

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

Aplikasi mode tuan rumah

Aplikasi audio mode host USB yang umum meliputi:

  • mendengarkan musik
  • telepon
  • pesan instan dan obrolan suara
  • rekaman

Untuk semua aplikasi ini, Android mendeteksi periferal audio digital USB yang kompatibel, dan secara otomatis merutekan pemutaran dan perekaman audio dengan tepat, berdasarkan aturan kebijakan audio. Konten stereo diputar di dua saluran 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 Pengaturan / Opsi Pengembang .

Men-debug saat dalam mode host

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

Menerapkan audio USB

Rekomendasi untuk vendor periferal audio

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

  • desain untuk kepatuhan kelas audio; saat ini Android menargetkan kelas 1, tetapi sebaiknya merencanakan kelas 2
  • hindari keanehan
  • uji interoperabilitas dengan referensi dan perangkat Android populer
  • mendokumentasikan dengan jelas fitur yang didukung, kepatuhan kelas audio, kebutuhan 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 perangkat keras untuk mendukung mode host USB
  • aktifkan dukungan host USB generik di tingkat kerangka kerja melalui tanda fitur android.hardware.usb.host.xml
  • aktifkan semua fitur kernel yang diperlukan: mode host USB, audio USB, mode transfer isochronous; lihat Konfigurasi Kernel Android
  • tetap up-to-date dengan rilis dan patch kernel terbaru; terlepas dari tujuan mulia kepatuhan kelas, ada periferal audio yang masih ada dengan quirks , dan kernel terbaru memiliki solusi untuk quirks seperti itu
  • aktifkan kebijakan audio USB seperti yang dijelaskan di bawah
  • tambahkan audio.usb.default ke PRODUCT_PACKAGES di device.mk
  • uji interoperabilitas dengan periferal audio USB umum

Cara mengaktifkan kebijakan audio USB

Untuk mengaktifkan audio USB, tambahkan entri ke file konfigurasi kebijakan audio. Ini biasanya terletak di sini:

device/oem/codename/audio_policy.conf

Komponen pathname "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

Implementasi Audio Hardware Abstraction Layer (HAL) untuk audio USB terletak di sini:

hardware/libhardware/modules/usbaudio/

Audio USB HAL sangat bergantung pada tinyalsa , yang dijelaskan di Audio Terminology . Meskipun audio USB bergantung pada transfer isochronous, ini diabstraksikan oleh implementasi ALSA. Jadi audio USB HAL dan tinyalsa tidak perlu khawatir dengan bagian protokol USB ini.

Menguji audio USB

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