Desain untuk mengurangi latensi

Rilis Android 4.1 memperkenalkan perubahan kerangka internal untuk jalur keluaran audio latensi lebih rendah . Hanya terdapat sedikit perubahan pada API klien publik atau API HAL. Dokumen ini menjelaskan desain awal yang terus berkembang seiring berjalannya 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.

Lacak pembuatan

Klien secara opsional dapat menyetel bit AUDIO_OUTPUT_FLAG_FAST di parameter audio_output_flags_t 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 ia memutuskan untuk meneruskan permintaan, ia melakukannya dengan 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 itu diterima atau tidak, melalui bit CBLK_FAST dari blok kontrol memori bersama.

Faktor-faktor yang mempengaruhi keputusan tersebut antara lain:

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

Jika permintaan klien diterima, ini disebut “jalur cepat”. Kalau tidak, itu disebut "trek normal".

Benang pengaduk

Pada saat AudioFlinger membuat thread mixer normal, AudioFlinger memutuskan apakah akan membuat thread mixer cepat atau tidak. Baik mixer normal maupun mixer cepat tidak diasosiasikan dengan track tertentu, melainkan dengan sekumpulan track. Selalu ada utas mixer normal. Benang pengaduk cepat, jika ada, tunduk pada benang pengaduk normal dan bertindak di bawah kendalinya.

Pencampur cepat

Fitur

Thread mixer cepat menyediakan fitur berikut:

  • Pencampuran sub-campuran mixer normal dan hingga 7 jalur cepat klien
  • Per redaman trek

Fitur yang dihilangkan:

  • Konversi tingkat sampel per trek
  • Per efek trek
  • Per campuran efek

Periode

Mixer cepat berjalan secara berkala, dengan jangka waktu yang disarankan adalah dua hingga tiga milidetik (ms), atau jangka waktu yang sedikit lebih tinggi yaitu lima ms jika diperlukan untuk stabilitas penjadwalan. Angka ini dipilih sehingga, dengan memperhitungkan keseluruhan buffer pipeline, total latensi berada di urutan 10 ms. Nilai yang lebih kecil dimungkinkan namun dapat mengakibatkan peningkatan konsumsi daya dan kemungkinan gangguan tergantung pada prediktabilitas penjadwalan CPU. Nilai yang lebih besar dimungkinkan, hingga 20 ms, namun mengakibatkan penurunan latensi total sehingga harus dihindari.

Penjadwalan

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

Pemblokiran

Idealnya thread mixer cepat tidak pernah memblokir, selain di HAL write() . Kejadian pemblokiran lainnya dalam mixer cepat dianggap sebagai bug. Secara khusus, mutex dihindari. Sebagai gantinya, algoritma non-pemblokiran (juga dikenal sebagai algoritma bebas kunci) digunakan. Lihat Menghindari inversi prioritas untuk informasi lebih lanjut tentang topik ini.

Hubungan dengan komponen lainnya

Mixer cepat memiliki sedikit interaksi langsung dengan klien. Secara khusus, ia tidak melihat operasi tingkat pengikat, namun 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 normal.

Wastafel utama mixer cepat adalah audio HAL.

Pencampur biasa

Fitur

Semua fitur diaktifkan:

  • Hingga 32 lagu
  • Per redaman trek
  • Konversi tingkat sampel per trek
  • Pemrosesan efek

Periode

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

Penjadwalan

Mixer normal berjalan pada prioritas SCHED_OTHER yang tinggi.

Pemblokiran

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

Hubungan dengan komponen lainnya

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

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

Bendera

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

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

TRACK_FAST adalah konsep klien -> server.