Gecikmeyi azaltacak şekilde tasarım yapma

Android 4.1 sürümü, daha düşük gecikmeli ses çıkışı yolu için dahili çerçeve değişiklikleri getirdi. Herkese açık istemci API'sinde veya HAL API'sinde çok az değişiklik yapıldı. Bu belgede, zaman içinde gelişmeye devam eden ilk tasarım açıklanmaktadır. Bu tasarımı iyi anlamak, cihaz OEM'lerinin ve SoC tedarikçi firmalarının tasarımı kendi cihazlarına ve yonga setlerine doğru şekilde uygulamalarına yardımcı olacaktır. Bu makale, uygulama geliştiriciler için değildir.

Parça oluşturma

İstemci, isteğe bağlı olarak AudioTrack C++ oluşturucusunun audio_output_flags_t parametresinde AUDIO_OUTPUT_FLAG_FAST bitini veya AudioTrack::set() değerini ayarlayabilir. Şu anda bunu yapan tek müşteriler şunlardır:

AudioTrack C++ uygulaması, AUDIO_OUTPUT_FLAG_FAST isteklerini inceler ve isteği isteğe bağlı olarak istemci seviyesinde reddedebilir. İsteği iletmeye karar verirse bunu IAudioTrack fabrika yönteminin track_flags_t parametresinin TRACK_FAST bitini kullanarak yaparIAudioFlinger::createTrack().

AudioFlinger ses sunucusu, TRACK_FAST isteğini inceler ve isteği isteğe bağlı olarak sunucu düzeyinde reddedebilir. Paylaşılan bellek kontrol bloğunun CBLK_FAST biti aracılığıyla isteğinin kabul edilip edilmediğini istemciye bildirir.

Kararı etkileyen faktörler arasında şunlar yer alır:

  • Bu çıkış için hızlı bir karıştırıcı iş parçacığı bulunması (aşağıya bakın)
  • Parça örnek hızı
  • Bu parça için geri çağırma işleyicilerini yürütecek bir istemci iş parçacığı bulunması
  • Parça arabellek boyutu
  • Kullanılabilir hızlı takip aralıkları (aşağıya bakın)

Müşterinin isteği kabul edildiyse bu işleme "hızlı takip" adı verilir. Aksi takdirde "normal parça" olarak adlandırılır.

Mikser ileti dizileri

AudioFlinger, normal bir karıştırıcı iş parçacığı oluştururken hızlı bir karıştırıcı iş parçacığı oluşturup oluşturmayacağına karar verir. Hem normal karıştırıcı hem de hızlı karıştırıcı belirli bir parçayla değil, bir parça grubuyla ilişkilendirilir. Her zaman normal bir karıştırıcı iplik vardır. Varsa hızlı karıştırıcı iş parçacığı, normal karıştırıcı iş parçacığına bağlıdır ve onun kontrolü altında çalışır.

Hızlı karıştırıcı

Özellikler

Hızlı karıştırıcı iş parçacığı aşağıdaki özellikleri sağlar:

  • Normal karıştırıcının alt karışımı ve en fazla 7 istemci hızlı parçasının karıştırılması
  • Parça başına zayıflama

Atlanan özellikler:

  • Parça başına örnekleme hızı dönüşümü
  • Parça başına efektler
  • Miksaj başına efektler

Nokta

Hızlı karıştırıcı, önerilen iki ila üç milisaniye (ms) aralıkla veya planlama kararlılığı için gerekirse beş milisaniyelik biraz daha yüksek bir aralıkla düzenli olarak çalışır. Bu sayı, tam arabellek ardışık düzeni hesaba katıldığında toplam gecikmenin 10 ms civarında olması için seçilmiştir. Daha küçük değerler de kullanılabilir ancak CPU planlamasının öngörülebilirliğine bağlı olarak güç tüketiminin artmasına ve aksama olasılığının yükselmesine neden olabilir. 20 ms'ye kadar daha büyük değerler kullanılabilir ancak toplam gecikmenin azalmasına neden olduğundan bu değerlerden kaçınılmalıdır.

Planlama

Hızlı karıştırıcı, yüksek SCHED_FIFO önceliğinde çalışır. Çok az CPU süresine ihtiyaç duyar ancak sık sık ve düşük planlama jitter'iyle çalışmalıdır. 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ç yayınlanması, yetersiz yayın nedeniyle aksamalara neden olur. Çok erken çalıştırırsanız kanal henüz veri sağlamadan hızlı kanaldan veri çekildiği için aksaklıklar yaşanır.

Blokaj

İdeal olarak hızlı karıştırıcı iş parçacığı, HALwrite() dışında hiçbir zaman engellenmez. Hızlı karıştırıcıda engellemenin diğer gerçekleşmeleri hata olarak kabul edilir. Özellikle de kilitli maçları kullanmaktan kaçınılır. Bunun yerine, engellemeyen algoritmalar (kilitsiz algoritmalar olarak da bilinir) kullanılır. Bu konuyla ilgili daha fazla bilgi için Öncelik tersine çevirme sorununu önleme başlıklı makaleyi inceleyin.

Diğer bileşenlerle ilişki

Hızlı karıştırıcı, istemcilerle çok az doğrudan etkileşime sahiptir. Özellikle, bağlayıcı düzeyindeki işlemleri görmez ancak istemcinin ortak bellek kontrol bloğuna erişir.

Hızlı karıştırıcı, normal karıştırıcıdan bir durum kuyruğu aracılığıyla komut alır.

Parça verilerini çekme dışında, istemcilerle etkileşim normal karıştırıcı üzerinden gerçekleşir.

Hızlı karıştırıcının birincil havuzu ses HAL'dir.

Normal mikser

Özellikler

Tüm özellikler etkindir:

  • En fazla 32 parça
  • Parça başına zayıflama
  • Parça başına örnekleme hızı dönüşümü
  • Efekt işleme

Nokta

Dönem, hızlı karıştırıcı döneminin ilk tam katları olacak şekilde hesaplanır ve bu değer >= 20 ms olmalıdır.

Planlama

Normal karıştırıcı, yüksek SCHED_OTHER öncelikli olarak çalışır.

Blokaj

Normal karıştırıcının engellemesine izin verilir ve genellikle alt karışımını yazmak için çeşitli mutex'lerde ve engelleme borusunda bunu yapar.

Diğer bileşenlerle ilişki

Normal karıştırıcı, bağlayıcı iş parçacıkları, ses politikası yöneticisi, hızlı karıştırıcı iş parçacığı ve istemci parçaları dahil olmak üzere dış dünyayla geniş kapsamlı bir şekilde etkileşim kurar.

Normal karıştırıcının havuzu, hızlı karıştırıcının 0 numaralı kanalına giden bir engelleme borusu olur.

Bayraklar

AUDIO_OUTPUT_FLAG_FAST bit bir ipucu. İsteğin yerine getirileceği garanti edilmez.

AUDIO_OUTPUT_FLAG_FAST, istemci düzeyinde bir kavramdır. Sunucuda görünmüyor.

TRACK_FAST, istemci -> sunucu kavramıdır.