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:
- Audio native Android berdasarkan OpenSL ES atau AAudio
android.media.SoundPool
android.media.ToneGenerator
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.