Android 4.1 sürümü, daha düşük gecikmeli bir ses çıkış yolu için dahili çerçeve değişiklikleri getirdi. Minimum genel istemci API'si veya HAL API değişikliği vardı. Bu belge, zaman içinde gelişmeye devam eden ilk tasarımı açıklamaktadır. Bu tasarımın iyi bir şekilde anlaşılması, cihaz OEM ve SoC satıcılarının tasarımı kendi cihazlarına ve yonga setlerine doğru bir şekilde uygulamalarına yardımcı olacaktır. Bu makale, uygulama geliştiricileri için tasarlanmamıştır.
Parça oluşturma
İstemci isteğe bağlı olarak AudioTrack C++ yapıcısının veya AudioTrack::set()
'in audio_output_flags_t
parametresinde AUDIO_OUTPUT_FLAG_FAST
bitini ayarlayabilir. Şu anda bunu yapan tek müşteriler:
- OpenSL ES veya AAudio tabanlı Android yerel ses
- android.media.SoundPool
- android.media.ToneGenerator
AudioTrack C++ uygulaması, AUDIO_OUTPUT_FLAG_FAST
isteğini inceler ve isteğe bağlı olarak istemci düzeyinde isteği reddedebilir. İsteği iletmeye karar verirse, bunu IAudioTrack
fabrika yöntemi IAudioFlinger::createTrack()
'nin track_flags_t
parametresinin TRACK_FAST
bitini kullanarak yapar.
AudioFlinger ses sunucusu, TRACK_FAST
isteğini inceler ve isteğe bağlı olarak isteği sunucu düzeyinde reddedebilir. İstemciye, paylaşılan bellek kontrol bloğunun CBLK_FAST
biti aracılığıyla isteğin kabul edilip edilmediğini bildirir.
Kararı etkileyen faktörler şunları içerir:
- Bu çıktı için hızlı bir karıştırıcı iş parçacığının varlığı (aşağıya bakın)
- Örnek oranını takip et
- Bu iz için geri arama işleyicilerini yürütmek için bir istemci iş parçacığının varlığı
- Tampon boyutunu izle
- Mevcut hızlı yol yuvaları (aşağıya bakın)
Müşterinin talebi kabul edilirse buna "hızlı yol" denir. Aksi takdirde buna "normal yol" denir.
Karıştırıcı iplikler
AudioFlinger normal bir mikser dizisi oluşturduğunda, hızlı bir mikser dizisi de oluşturup oluşturmamaya karar verir. Hem normal mikser hem de hızlı mikser, belirli bir iz ile değil, bir dizi iz ile ilişkilendirilir. Her zaman normal bir karıştırıcı iplik vardır. Hızlı karıştırıcı iplik, eğer varsa, normal mikser ipliğine tabidir ve onun kontrolü altında hareket eder.
Hızlı karıştırıcı
Özellikler
Hızlı karıştırıcı iplik şu özellikleri sağlar:
- Normal mikserin alt miksajını ve 7 adede kadar istemci hızlı parçasını miksleme
- İz başına zayıflama
Atlanan özellikler:
- Parça başına örnekleme hızı dönüşümü
- Parça efektleri başına
- Karışım efektleri başına
Dönem
Hızlı karıştırıcı, önerilen iki ila üç milisaniye (ms) periyoduyla veya programlama kararlılığı için gerekirse beş ms'lik biraz daha yüksek bir periyotla periyodik olarak çalışır. Bu sayı, tam arabellek ardışık düzenini hesaba katarak, toplam gecikmenin 10 ms mertebesinde olacağı şekilde seçilmiştir. Daha küçük değerler mümkündür, ancak CPU programlama öngörülebilirliğine bağlı olarak güç tüketiminin artmasına ve hata olasılığına neden olabilir. 20 ms'ye kadar daha büyük değerler mümkündür, ancak toplam gecikmenin azalmasına neden olur ve bundan kaçınılmalıdır.
planlama
Hızlı karıştırıcı, yükseltilmiş SCHED_FIFO
önceliğinde çalışır. Çok az CPU süresine ihtiyaç duyar, ancak sık sık ve düşük zamanlama seğirmesiyle çalışması gerekir. Jitter , döngü süresindeki değişimi ifade eder: gerçek döngü süresi ile beklenen döngü süresi arasındaki farktır. Çok geç koşmak, yetersiz çalışma nedeniyle aksaklıklara neden olur. Çok erken çalıştırma, yol veri sağlamadan önce hızlı bir yoldan çekilme nedeniyle aksaklıklara neden olur.
engelleme
İdeal olarak, hızlı karıştırıcı iş parçacığı, HAL write()
dışında hiçbir zaman bloke olmaz. Hızlı karıştırıcı içindeki diğer engelleme oluşumları hata olarak kabul edilir. Özellikle, mutekslerden kaçınılır. Bunun yerine, engellemeyen algoritmalar (kilitsiz algoritmalar olarak da bilinir) kullanılır. Bu konu hakkında daha fazla bilgi için Öncelik tersine çevirmeden kaçınma konusuna bakın.
Diğer bileşenlerle ilişki
Hızlı karıştırıcının müşterilerle çok az doğrudan etkileşimi vardır. Özellikle, ciltleyici düzeyindeki işlemleri görmez, ancak istemcinin paylaşılan bellek kontrol bloğuna erişir.
Hızlı karıştırıcı, komutları normal karıştırıcıdan bir durum kuyruğu aracılığıyla alır.
İzleme verilerini çekmenin dışında, müşterilerle etkileşim normal karıştırıcı aracılığıyla gerçekleştirilir.
Hızlı karıştırıcının birincil alıcısı ses HAL'dir.
Normal karıştırıcı
Özellikler
Tüm özellikler etkinleştirildi:
- 32 parçaya kadar
- İz başına zayıflama
- Parça başına örnekleme hızı dönüşümü
- Efekt işleme
Dönem
Periyot, >= 20 ms olan hızlı karıştırıcı periyodunun birinci tam katı olarak hesaplanır.
planlama
Normal karıştırıcı, yükseltilmiş SCHED_OTHER
önceliğinde çalışır.
engelleme
Normal karıştırıcının engellemesine izin verilir ve bunu genellikle çeşitli mutekslerde ve alt karışımını yazmak için bir engelleme borusunda yapar.
Diğer bileşenlerle ilişki
Normal karıştırıcı, ciltleyici diziler, ses politikası yöneticisi, hızlı karıştırıcı iş parçacığı ve istemci izleri dahil olmak üzere dış dünyayla kapsamlı bir şekilde etkileşime girer.
Normal mikserin eviyesi, hızlı mikserin 0 numaralı rayına giden bir tıkama borusudur.
Bayraklar
AUDIO_OUTPUT_FLAG_FAST
biti bir ipucudur. İsteğin yerine getirileceğinin garantisi yoktur.
AUDIO_OUTPUT_FLAG_FAST
, müşteri düzeyinde bir kavramdır. Sunucuda görünmüyor.
TRACK_FAST
bir istemci -> sunucu konseptidir.