Mendesain untuk mengurangi latensi

Vendor dapat menerapkan dua fitur utama untuk mengurangi latensi audio:

  • FAST Mixer di AudioFlinger: Diperkenalkan di Android 4.1, fitur ini mendukung aplikasi yang menggunakan Java AudioTrack dan AAudio. FAST Mixer melibatkan perubahan minimal pada API klien publik atau API HAL.
  • AAudio MMAP: Diperkenalkan di Android 8.1, fitur ini memungkinkan aplikasi native mencapai latensi yang lebih rendah melalui AAudio. Lihat AAudio dan MMAP untuk mengetahui informasi selengkapnya.

Halaman ini menjelaskan desain latensi audio awal, yang terus berkembang dari waktu ke waktu. Pemahaman yang mendalam tentang desain ini sangat penting bagi OEM perangkat dan vendor SoC untuk memastikan penerapan yang benar pada perangkat dan chipset tertentu mereka. Halaman ini tidak ditujukan untuk developer aplikasi.

Pembuatan jalur

Klien dapat secara opsional menyetel bit AUDIO_OUTPUT_FLAG_FAST dalam parameter audio_output_flags_t dari konstruktor C++ AudioTrack atau AudioTrack::set(). Saat ini, hanya klien berikut yang melakukannya:

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

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

Faktor-faktor yang memengaruhi keputusan meliputi:

  • Kehadiran thread mixer cepat untuk output ini (lihat di bawah)
  • Frekuensi sampel trek
  • Kehadiran thread klien untuk mengeksekusi pengendali callback untuk jalur ini
  • Ukuran buffer trek
  • Slot jalur cepat yang tersedia (lihat di bawah)

Jika permintaan klien diterima, permintaan tersebut disebut jalur cepat. Jika tidak, disebut sebagai jalur normal.

Utas mixer

Saat membuat thread mixer normal, AudioFlinger akan memutuskan apakah akan membuat thread mixer cepat atau tidak. Mixer normal dan mixer cepat tidak dikaitkan dengan trek tertentu, tetapi dengan sekumpulan trek. Selalu ada thread mixer normal. Thread mixer cepat, jika ada, tunduk pada thread mixer normal dan bertindak di bawah kendalinya.

Mixer cepat

Fitur

Thread mixer cepat menyediakan fitur berikut:

  • Pencampuran sub-mix mixer normal dan hingga tujuh jalur cepat klien
  • Peredaman per trek

Fitur yang tidak disertakan:

  • Konversi frekuensi sampel per trek
  • Efek per trek
  • Efek per campuran

Titik

Mixer cepat berjalan secara berkala, dengan periode yang direkomendasikan dua hingga tiga milidetik, atau periode yang sedikit lebih tinggi, yaitu 5 md, jika diperlukan untuk stabilitas penjadwalan. Jumlah ini dipilih agar, dengan memperhitungkan pipeline buffer yang lengkap, total latensi berada pada urutan 10 md. Nilai yang lebih kecil mungkin terjadi, tetapi dapat menyebabkan peningkatan konsumsi daya dan kemungkinan gangguan, bergantung pada prediktabilitas penjadwalan CPU. Nilai yang lebih besar mungkin terjadi, hingga 20 md, tetapi akan menurunkan total latensi, sehingga harus dihindari.

Penjadwalan

Mixer cepat berjalan dengan prioritas SCHED_FIFO yang lebih tinggi. Proses ini memerlukan waktu CPU yang sangat singkat, tetapi harus sering dijalankan dan dengan jitter penjadwalan yang rendah. Jitter menunjukkan variasi waktu siklus: yaitu perbedaan antara waktu siklus sebenarnya dan waktu siklus yang diharapkan. Menjalankan terlalu lambat akan menyebabkan gangguan karena underrun. Menjalankan terlalu awal akan menyebabkan gangguan karena menarik dari jalur cepat sebelum jalur tersebut memberikan data.

Pemblokiran

Idealnya, thread mixer cepat tidak pernah diblokir, kecuali di HAL write(). Kemunculan pemblokiran lainnya dalam mixer cepat dianggap sebagai bug. Khususnya, mutex dihindari. Sebagai gantinya, algoritma non-blocking (juga dikenal sebagai algoritma bebas lock) digunakan. Lihat Menghindari inversi prioritas untuk mengetahui informasi selengkapnya tentang topik ini.

Hubungan dengan komponen lain

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

Mixer cepat menerima perintah dari mixer normal melalui antrean status.

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

Sink utama mixer cepat adalah HAL audio.

Mixer normal

Fitur

Semua fitur diaktifkan:

  • Hingga 32 trek
  • Peredaman per trek
  • Konversi frekuensi sampel per trek
  • Pemrosesan efek

Titik

Periode dihitung sebagai kelipatan integral pertama dari periode mixer cepat yang >= 20 mdtk.

Penjadwalan

Mixer normal berjalan dengan prioritas SCHED_OTHER yang lebih tinggi.

Pemblokiran

Mixer normal diizinkan untuk memblokir, dan sering melakukannya di berbagai mutex serta di saluran pemblokiran untuk menulis sub-mix-nya.

Hubungan dengan komponen lain

Mixer normal berinteraksi secara ekstensif dengan dunia luar, termasuk thread binder, pengelola kebijakan audio, thread mixer cepat, dan trek klien.

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

Tanda

Bagian AUDIO_OUTPUT_FLAG_FAST adalah petunjuk. Tidak ada jaminan bahwa permintaan akan dipenuhi.

AUDIO_OUTPUT_FLAG_FAST adalah konsep tingkat klien. Tidak muncul di server.

TRACK_FAST adalah konsep klien -> server.