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:
- 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 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.