Gecikmeyi azaltacak şekilde tasarım yapma

Satıcılar, ses gecikmesini azaltmak için iki temel özelliği uygulayabilir:

  • AudioFlinger'da FAST Mixer: Android 4.1'de kullanıma sunulan bu özellik, Java AudioTrack ve AAudio kullanan uygulamaları destekler. FAST Karıştırıcı, minimum düzeyde herkese açık istemci API'si veya HAL API'si değişikliği içerir.
  • AAudio MMAP: Android 8.1'de kullanıma sunulan bu özellik, yerel uygulamaların AAudio aracılığıyla daha da düşük gecikme süresi elde etmesini sağlar. Daha fazla bilgi için AAudio ve MMAP başlıklı makaleyi inceleyin.

Bu sayfada, zaman içinde gelişmeye devam eden ilk ses gecikmesi tasarımı açıklanmaktadır. Bu tasarımın iyi anlaşılması, cihaz OEM'leri ve SoC satıcılarının belirli cihazlarında ve yonga setlerinde doğru uygulamayı sağlaması açısından çok önemlidir. Bu sayfa, uygulama geliştiriciler için hazırlanmamıştır.

Kanal oluşturma

İstemci, isteğe bağlı olarak AudioTrack C++ oluşturucusunun AUDIO_OUTPUT_FLAG_FAST parametresinde veya AudioTrack::set() içinde audio_output_flags_t bitini ayarlayabilir. Şu anda bunu yapan tek istemciler şunlardır:

AudioTrack C++ uygulaması, AUDIO_OUTPUT_FLAG_FASTisteği inceler ve isteği istemci düzeyinde isteğe bağlı olarak reddedebilir. İsteği iletmeye karar verirse bunu IAudioTrack fabrika yönteminin TRACK_FAST bitlik track_flags_t parametresini kullanarak yapar IAudioFlinger::createTrack().

AudioFlinger ses sunucusu, TRACK_FAST isteğini inceler ve isteği sunucu düzeyinde isteğe bağlı olarak 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 şunlardır:

  • Bu çıkış için hızlı karıştırma iş parçacığının varlığı (aşağıya bakın)
  • Parça örnekleme hızı
  • Bu parça için geri çağırma işleyicilerini yürütecek bir istemci iş parçacığının varlığı
  • Parça arabellek boyutu
  • Kullanılabilir hızlı kayıt yuvaları (aşağıya bakın)

Müşterinin isteği kabul edilirse bu işleme hızlı çözüm 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ığı da oluşturup oluşturmayacağına karar verir. Hem normal mikser hem de hızlı mikser belirli bir parçayla değil, bir dizi parçayla ilişkilendirilir. Her zaman normal bir karıştırıcı iş parçacığı vardır. Hızlı karıştırıcı iş parçacığı varsa 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ığı şu özellikleri sağlar:

  • Normal mikserin alt miksi ile en fazla yedi istemci hızlı parçasının karıştırılması
  • Parça başına zayıflatma

Atlanan özellikler:

  • Parça başına örnekleme hızı dönüştürme
  • Parça başına efektler
  • Miks efektleri başına

Nokta

Hızlı karıştırıcı, iki ila üç milisaniye önerilen süreyle veya planlama kararlılığı için gerekirse biraz daha yüksek bir süreyle (5 ms) düzenli olarak çalışır. Bu sayı, arabellek işlem hattının tamamı hesaba katıldığında toplam gecikmenin 10 ms civarında olması için seçilmiştir. Daha küçük değerler mümkündür ancak CPU planlamasının tahmin edilebilirliğine bağlı olarak güç tüketiminin artmasına ve hataların oluşma olasılığının yükselmesine neden olabilir. 20 ms'ye kadar daha büyük değerler mümkündür ancak toplam gecikmenin düşmesine neden olacağından kaçınılmalıdır.

Planlama

Hızlı karıştırıcı, yüksek SCHED_FIFO öncelikte çalışır. Çok az CPU süresi gerekir ancak sık sık ve düşük planlama titremesiyle çalışmalıdır. Titreşim, 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ç çalıştırma, yetersiz çalıştırmadan kaynaklanan aksaklıklara neden olur. Parça verileri sağlamadan önce hızlı bir parçadan çekme işlemi yapıldığında çok erken çalıştırma, aksaklıklara neden olur.

Blokaj

İdeal olarak, hızlı karıştırıcı iş parçacığı HAL dışında hiçbir zaman engellemez write(). Hızlı karıştırıcıda engellemenin diğer oluşumları hata olarak kabul edilir. Özellikle karşılıklı dışlama (mutex) kullanılmaz. Bunun yerine, engellemeyen algoritmalar (kilit içermeyen algoritmalar olarak da bilinir) kullanılır. Bu konu hakkında daha fazla bilgi için Öncelik ters çevrilmesini önleme başlıklı makaleyi inceleyin.

Diğer bileşenlerle ilişki

Hızlı karıştırıcı, müşterilerle doğrudan etkileşime girmez. Özellikle bağlayıcı düzeyindeki işlemleri görmez ancak istemcinin paylaşılan bellek kontrol bloğuna erişir.

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

Parça verilerini çekme dışında, müşterilerle etkileşim normal mikser üzerinden gerçekleşir.

Hızlı karıştırıcının birincil alıcısı, ses HAL'dir.

Normal mikser

Özellikler

Tüm özellikler etkinleştirilir:

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

Nokta

Dönem, hızlı karıştırıcı döneminin 20 ms'den büyük veya 20 ms'ye eşit olan ilk tam katı olarak hesaplanır.

Planlama

Normal karıştırıcı, yüksek SCHED_OTHER önceliğinde çalışır.

Blokaj

Normal karıştırıcının engellemesine izin verilir ve genellikle alt karışımını yazmak için çeşitli karşılıklı dışlamaların yanı sıra bir engelleme kanalında da engeller.

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 kapsamlı bir şekilde etkileşime girer.

Normal karıştırıcının çıkışı, hızlı karıştırıcının 0. parçası için engelleyici bir kanaldır.

Bayraklar

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

AUDIO_OUTPUT_FLAG_FAST, müşteri düzeyinde bir kavramdır. Sunucuda görünmez.

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