Desain Untuk Mengurangi Latensi

Rilis Android 4.1 memperkenalkan perubahan kerangka kerja internal untuk jalur keluaran audio latensi yang lebih rendah . Ada sedikit perubahan API klien publik atau API HAL. Dokumen ini menjelaskan desain awal, yang terus berkembang dari waktu ke waktu. Memiliki pemahaman yang baik tentang desain ini akan membantu vendor perangkat OEM dan SoC menerapkan desain dengan benar pada perangkat dan chipset khusus mereka. Artikel ini tidak ditujukan untuk pengembang aplikasi.

Pembuatan trek

Klien dapat secara opsional menyetel bit AUDIO_OUTPUT_FLAG_FAST dalam parameter audio_output_flags_t dari konstruktor AudioTrack C++ atau AudioTrack::set() . Saat ini satu-satunya klien yang melakukannya adalah:

Implementasi AudioTrack C++ meninjau permintaan AUDIO_OUTPUT_FLAG_FAST dan secara opsional dapat menolak permintaan di tingkat klien. Jika memutuskan untuk meneruskan permintaan, ia melakukannya menggunakan bit TRACK_FAST dari parameter track_flags_t dari metode pabrik IAudioTrack IAudioFlinger::createTrack() .

Server audio AudioFlinger meninjau permintaan TRACK_FAST dan secara opsional dapat menolak permintaan di tingkat server. Ini memberi tahu klien apakah permintaan diterima atau tidak, melalui bit CBLK_FAST dari blok kontrol memori bersama.

Faktor-faktor yang mempengaruhi keputusan tersebut antara lain:

  • Kehadiran utas mixer cepat untuk output ini (lihat di bawah)
  • Lacak tingkat sampel
  • Kehadiran utas klien untuk menjalankan penangan panggilan balik untuk trek ini
  • Lacak ukuran buffer
  • Slot jalur cepat yang tersedia (lihat di bawah)

Jika permintaan klien diterima, itu disebut "jalur cepat". Kalau tidak, itu disebut "jalur normal."

Benang pengaduk

Pada saat AudioFlinger membuat utas mixer normal, ia memutuskan apakah akan membuat utas mixer cepat atau tidak. Baik mixer normal dan mixer cepat tidak terkait dengan trek tertentu, melainkan dengan satu set trek. Selalu ada utas mixer normal. Utas mixer cepat, jika ada, tunduk pada ulir mixer normal dan bertindak di bawah kendalinya.

Pengaduk cepat

Fitur

Utas mixer cepat menyediakan fitur-fitur ini:

  • Mencampur sub-campuran mixer normal dan hingga 7 trek cepat klien
  • Per atenuasi trek

Fitur yang dihilangkan:

  • Konversi laju sampel per trek
  • Efek per trek
  • Per campuran efek

Periode

Mixer cepat berjalan secara berkala, dengan periode yang direkomendasikan dua hingga tiga milidetik (ms), atau periode yang sedikit lebih tinggi dari lima ms jika diperlukan untuk stabilitas penjadwalan. Nomor ini dipilih sehingga, dengan memperhitungkan pipa buffer lengkap, latensi total berada di urutan 10 ms. Nilai yang lebih kecil dimungkinkan tetapi dapat mengakibatkan peningkatan konsumsi daya dan kemungkinan gangguan tergantung pada prediktabilitas penjadwalan CPU. Nilai yang lebih besar dimungkinkan, hingga 20 ms, tetapi menghasilkan latensi total yang menurun dan karenanya harus dihindari.

Penjadwalan

Mixer cepat berjalan pada prioritas SCHED_FIFO tinggi. Ini membutuhkan waktu CPU yang sangat sedikit, tetapi harus sering dijalankan dan dengan jitter penjadwalan yang rendah. Jitter mengungkapkan variasi waktu siklus: itu adalah perbedaan antara waktu siklus aktual versus waktu siklus yang diharapkan. Menjalankan terlalu terlambat akan mengakibatkan gangguan karena underrun. Berlari terlalu dini akan mengakibatkan gangguan karena menarik dari trek cepat sebelum trek menyediakan data.

Pemblokiran

Idealnya utas mixer cepat tidak pernah memblokir, selain di HAL write() . Kejadian pemblokiran lain dalam mixer cepat dianggap sebagai bug. Secara khusus, mutex dihindari. Sebagai gantinya, algoritme non-pemblokiran (juga dikenal sebagai algoritme bebas kunci) digunakan. Lihat Menghindari Pembalikan Prioritas untuk lebih lanjut tentang topik ini.

Hubungan dengan komponen lain

Mixer cepat memiliki sedikit interaksi langsung dengan klien. Secara khusus, ia tidak melihat operasi tingkat pengikat, tetapi ia mengakses blok kontrol memori bersama klien.

Mixer cepat menerima perintah dari mixer normal melalui antrian status.

Selain menarik data trek, interaksi dengan klien dilakukan melalui mixer biasa.

Wastafel utama mixer cepat adalah audio HAL.

Pencampur biasa

Fitur

Semua fitur diaktifkan:

  • Hingga 32 lagu
  • Per atenuasi trek
  • Konversi laju sampel per trek
  • Pemrosesan efek

Periode

Periode dihitung sebagai kelipatan integral pertama dari periode pengaduk cepat yaitu >= 20 ms.

Penjadwalan

Mixer normal berjalan pada prioritas SCHED_OTHER tinggi.

Pemblokiran

Mixer normal diizinkan untuk memblokir, dan sering melakukannya di berbagai mutex serta pada pipa pemblokiran untuk menulis sub-campurannya.

Hubungan dengan komponen lain

Mixer normal berinteraksi secara ekstensif dengan dunia luar, termasuk utas pengikat, manajer kebijakan audio, utas mixer cepat, dan trek klien.

Wastafel mixer normal adalah pipa pemblokiran ke track 0 mixer cepat.

Bendera

AUDIO_OUTPUT_FLAG_FAST bit adalah petunjuk. Tidak ada jaminan permintaan akan dipenuhi.

AUDIO_OUTPUT_FLAG_FAST adalah konsep tingkat klien. Itu tidak muncul di server.

TRACK_FAST adalah klien -> konsep server.