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 pihak lain yang mencari pemahaman mendetail tentang internal audio digital USB di Android.

Pengguna akhir perangkat Nexus dapat melihat artikel Rekam dan putar audio menggunakan mode host USB di Pusat Bantuan Nexus . Meskipun artikel ini tidak ditujukan untuk pengguna akhir, konsumen audiophile tertentu mungkin tertarik.

Ikhtisar USB

Universal Serial Bus (USB) dijelaskan secara informal dalam artikel Wikipedia USB , dan secara formal ditentukan oleh standar yang diterbitkan oleh USB Implementers Forum, Inc . Untuk kenyamanan, kami merangkum konsep-konsep utama USB di sini, namun standarnya 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 tertukar 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 diungkapkan melalui deskriptor .

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

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

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

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

Host memulai semua transfer data, oleh karena itu 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 isochronous . 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 tersebut.

Mode USB Android

Modus pengembangan

Mode pengembangan sudah hadir sejak awal rilis Android. Perangkat Android muncul sebagai perangkat USB ke PC host yang menjalankan sistem operasi desktop seperti Linux, Mac OS X, atau Windows. Satu-satunya fungsi periferal yang terlihat adalah Android fastboot atau Android Debug Bridge (adb) . Protokol fastboot dan adb berlapis pada 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 on-the-go ( OTG ) seperti ini biasanya diperlukan:

OTG

Gambar 1. Adaptor saat bepergian (OTG).

Perangkat Android mungkin tidak menyediakan daya yang cukup untuk mengoperasikan perangkat tertentu, bergantung pada seberapa besar daya yang dibutuhkan perangkat tersebut, dan seberapa besar kemampuan perangkat Android untuk memasoknya. Meskipun tersedia daya yang memadai, daya baterai perangkat Android mungkin berkurang secara signifikan. Untuk situasi ini, gunakan hub bertenaga seperti ini:

Hub bertenaga

Gambar 2. Hub bertenaga listrik

Modus aksesori

Mode aksesori diperkenalkan di Android 3.1 (API level 12) dan di-back-port ke Android 2.3.4. Dalam mode ini, perangkat Android beroperasi sebagai perangkat USB, di bawah kendali perangkat lain seperti dock yang berfungsi sebagai host. Perbedaan antara mode pengembangan dan mode aksesori adalah fungsi USB tambahan dapat dilihat oleh host, di luar adb. Perangkat Android memulai 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 menentukan protokol standar untuk fungsi tersebut. Hal ini memungkinkan host dan fungsi periferal yang memenuhi kelas 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 tanpa driver adalah sinonim umum untuk memenuhi kelas , yang menunjukkan bahwa fitur standar perangkat tersebut dapat digunakan tanpa memerlukan instalasi driver khusus sistem operasi. Kita dapat berasumsi bahwa periferal yang diiklankan sebagai "tidak diperlukan driver" untuk sistem operasi desktop utama akan sesuai dengan kelasnya, meskipun mungkin ada pengecualian.

Kelas audio USB

Di sini kami hanya memperhatikan periferal yang mengimplementasikan fungsi audio, dan dengan demikian mengikuti 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 tertukar dengan kelas audio. Kelas penyimpanan massal (MSC) digunakan untuk akses berorientasi sektor ke media, sedangkan Media Transfer Protocol (MTP) digunakan untuk akses file penuh ke media. MSC dan MTP dapat digunakan untuk mentransfer file audio, tetapi hanya kelas audio USB yang cocok untuk streaming waktu nyata.

Terminal audio

Terminal perangkat audio biasanya analog. Sinyal analog yang disajikan pada 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, host mengirimkan sinyal audio digital melalui protokol USB ke periferal, di mana konverter digital-ke-analog (DAC) mengkonversi dan menyajikannya ke terminal keluaran analog. DAC adalah wastafel bagi 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 secara luas menafsirkan aliran multisaluran sebagai memiliki lokasi spasial yang sesuai dengan setiap saluran. Namun, juga cukup tepat (terutama untuk audio USB dibandingkan HDMI ) untuk tidak menetapkan makna spasial standar tertentu pada setiap saluran. Dalam hal ini, terserah pada aplikasi dan pengguna untuk menentukan bagaimana setiap saluran digunakan. Misalnya, aliran masukan USB empat saluran mungkin memiliki tiga saluran pertama yang terpasang ke berbagai mikrofon dalam ruangan, dan saluran terakhir menerima masukan dari radio AM.

Mode transfer isokron

Audio USB menggunakan mode transfer isochronous untuk karakteristik real-time, dengan mengorbankan pemulihan kesalahan. Dalam mode isochronous, bandwidth dijamin, dan kesalahan transmisi data dideteksi menggunakan cyclic redundancy check (CRC). Namun 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 berkecepatan penuh membawa muatan hingga 1023 byte, dan frame berkecepatan tinggi membawa hingga 1024 byte. Dengan menggabungkan semuanya, kami menghitung kecepatan transfer maksimum sebesar 1.023.000 atau 8.192.000 byte per detik. Ini menetapkan batas atas teoretis pada gabungan laju sampel audio, jumlah saluran, dan kedalaman bit. Batas praktisnya lebih rendah.

Dalam mode isochronous, ada tiga sub-mode:

  • adaptif
  • Asinkron
  • Sinkronis

Dalam sub-mode adaptif, sink 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 sumber atau sink jam USB secara fisik dan elektrik lebih dekat dengan (dan 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 mungkin dirancang untuk akurasi yang lebih tinggi dan penyimpangan yang lebih rendah dibandingkan jam host.

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

Tabel di bawah merangkum sub-mode isokron:

Sub-mode Jumlah byte
per paket
Tingkat sampel
ditentukan 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, namun 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 yang lebih baru mendukung subset fitur audio USB kelas 1 (UAC1):

  • Perangkat Android harus bertindak sebagai host
  • Format audio harus PCM (antarmuka tipe I)
  • Kedalaman bit harus 16-bit, 24-bit, atau 32-bit dengan 24 bit data audio yang berguna diratakan kiri dalam bit paling signifikan dari kata 32-bit
  • Kecepatan 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 melebihi jumlah minimum yang diperlukan untuk mendukung fitur ini. Namun kode ini belum divalidasi, sehingga fitur lanjutan lainnya 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 dock.

Audio mode aksesori memiliki fitur berikut:

  • Perangkat Android harus dikontrol oleh host yang berpengetahuan luas yang dapat mentransisikan perangkat Android terlebih dahulu dari mode pengembangan ke mode aksesori, lalu host harus mentransfer data audio dari titik akhir yang sesuai. Dengan demikian perangkat Android tidak tampak "tanpa driver" di mata host.
  • Arahnya harus berupa input , dinyatakan relatif terhadap host
  • Format audio harus PCM 16-bit
  • Kecepatan 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

Sesuai dengan namanya, sinyal audio digital USB diwakili oleh aliran data digital , bukan sinyal analog yang digunakan oleh konektor headset mini TRS pada umumnya. Akhirnya sinyal digital apa pun harus diubah menjadi analog sebelum dapat didengar. Ada trade-off dalam memilih tempat untuk melakukan konversi tersebut.

Kisah dua DAC

Pada contoh diagram di bawah, kami membandingkan dua desain. Pertama kita memiliki perangkat seluler dengan Application Processor (AP), DAC on-board, amplifier, dan konektor TRS analog yang terpasang ke headphone. Kami juga mempertimbangkan perangkat seluler dengan USB yang terhubung ke DAC USB eksternal dan amplifier, 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 A yang pertama lebih sederhana, lebih murah, menggunakan daya yang lebih sedikit, dan akan menjadi desain yang lebih andal dengan asumsi komponen yang sama andalnya. Namun, biasanya ada pengorbanan kualitas audio vs. persyaratan lainnya. Misalnya, jika ini adalah perangkat pasar massal, perangkat tersebut mungkin dirancang untuk memenuhi kebutuhan konsumen umum, bukan untuk audiophile.

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

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

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

Aplikasi mode host

Aplikasi audio mode host USB yang umum meliputi:

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

Untuk semua aplikasi ini, Android mendeteksi perangkat audio digital USB yang kompatibel, dan secara otomatis merutekan pemutaran dan pengambilan audio dengan tepat, berdasarkan aturan kebijakan audio. Konten stereo diputar pada dua saluran pertama periferal.

Tidak ada API khusus untuk audio digital USB. Untuk penggunaan tingkat lanjut, 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 .

Debug saat dalam mode host

Saat dalam mode host USB, adb debugging melalui USB tidak tersedia. Lihat bagian Penggunaan nirkabel Android Debug Bridge untuk alternatifnya.

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 sebaiknya direncanakan untuk kelas 2
  • menghindari kebiasaan
  • uji inter-operabilitas dengan referensi dan perangkat Android populer
  • mendokumentasikan dengan jelas fitur-fitur yang didukung, kepatuhan kelas audio, kebutuhan daya, dll. sehingga konsumen dapat mengambil keputusan yang tepat

Rekomendasi untuk OEM perangkat Android dan vendor SoC

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

  • merancang perangkat keras untuk mendukung mode host USB
  • aktifkan dukungan host USB generik pada tingkat kerangka kerja melalui tanda fitur android.hardware.usb.host.xml
  • aktifkan semua fitur kernel yang diperlukan: mode host USB, audio USB, mode transfer isokron; lihat Konfigurasi Kernel Android
  • tetap up-to-date dengan rilis dan patch kernel terkini; meskipun ada tujuan mulia yaitu kepatuhan kelas, masih ada periferal audio dengan kekhasan , dan kernel terbaru memiliki solusi untuk keanehan tersebut
  • aktifkan kebijakan audio USB seperti dijelaskan di bawah
  • tambahkan audio.usb.default ke PRODUCT_PACKAGES di device.mk
  • uji interoperabilitas dengan periferal audio USB umum

Aktifkan 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 Hardware abstraction layer (HAL) audio untuk audio USB terletak di sini:

hardware/libhardware/modules/usbaudio/

Audio USB HAL sangat bergantung pada tinyalsa , dijelaskan di terminologi Audio . Meskipun audio USB bergantung pada transfer isochronous, hal ini disarikan oleh implementasi ALSA. Jadi audio USB HAL dan tinyalsa tidak perlu memikirkan bagian protokol USB ini.

Uji audio USB

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