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