Ses politikalarını yapılandırma

Android 10 sürümü, karmaşık otomotiv kullanım alanlarını desteklemek için daha fazla esneklik sağlamak amacıyla ses politikası yöneticisinde önemli bir yeniden yapılandırmayı içerir:

  • OEM'ye özgü yönlendirme stratejileri.
  • Aynı ses eğrilerini kullanan eski yayın türleri grupları için özelleştirilebilir ses grupları.
  • Sabit kodlanmış olmak yerine ses politikası motoru tarafından tanımlanan yönlendirme stratejileri.
  • Ses politikası motoru tarafından yönetilen ses eğrileri ve gruplar.
  • Ortak kod ile yapılandırılabilir kod arasında gelecekte yapılacak bir bölünmeye hazırlanmak ve daha zengin ses cihazı yönetimi sunmak için dahili yeniden düzenleme. Örneğin, politika kurallarında cihaz türünün yanı sıra tüm cihaz özelliklerinin kullanılması.

Android 7.0, ses topolojinizi tanımlamak için bir ses politikası yapılandırma dosyası biçimi (XML) kullanıma sundu.

Önceki Android sürümlerinde, ürününüzdeki ses cihazlarını belirtmek için device/<company>/<device>/audio/audio_policy.conf kullanılıyordu (device/samsung/tuna/audio/audio_policy.conf dosyasında Galaxy Nexus ses donanımı için bu dosyanın bir örneğini görebilirsiniz). Ancak CONF, televizyon ve otomobil gibi sektörler için karmaşık topolojileri tanımlamak için çok sınırlı olan basit, özel bir biçimdir.

Android 7.0, audio_policy.conf desteğini sonlandırdı ve daha kolay okunabilen, çok çeşitli düzenleme ve ayrıştırma araçlarına sahip ve karmaşık ses topolojilerini tanımlayacak kadar esnek olan bir XML dosya biçimi kullanarak ses topolojisi tanımlama desteği ekledi. Android 7.0, yapılandırma dosyalarının XML biçimini seçmek için USE_XML_AUDIO_POLICY_CONF derleme işaretini kullanır.

XML biçiminin avantajları

CONF dosyasında olduğu gibi XML dosyası da çıkış ve giriş akış profili sayısını ve türlerini, oynatma ve yakalama için kullanılabilen cihazları ve ses özelliklerini tanımlamayı sağlar. Ayrıca XML biçimi aşağıdaki geliştirmeleri sunar:

  • Android 10'da aynı anda birden fazla etkin kayıt uygulamasına izin verilir.
    • Kayıt başlatma işlemi, eşzamanlılık durumu nedeniyle hiçbir zaman reddedilmez.
    • registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) geri çağırma işlevi, istemcileri yakalama yolu değişiklikleri hakkında bilgilendirir.
  • Aşağıdaki durumlarda istemci sessiz ses örnekleri alır:
    • Gizliliğe duyarlı bir kullanım alanı (örneğin, VOICE_COMMUNICATION) etkindir.
    • İstemcide ön plan hizmeti veya ön plan kullanıcı arayüzü yoktur.
    • Özel roller politika tarafından tanınır:
      • Erişilebilirlik hizmeti: Gizliliğe duyarlı bir kullanım alanı etkin olsa bile kayıt yapabilir.
      • Asistan: Kullanıcı arayüzü üstteyse gizlilik açısından hassas kabul edilir.
  • Ses profilleri, HDMI basit ses tanımlayıcılarına benzer bir yapıya sahiptir ve her ses biçimi için farklı bir örnekleme hızı/kanal maskesi grubu sağlar.
  • Cihazlar ve akışlar arasındaki tüm olası bağlantılar için net tanımlar vardır. Daha önce, ses politikasının ses yaması API'leriyle istenen bağlantıları kontrol etmesini önleyen bir varsayılan kural, aynı HAL modülüne bağlı tüm cihazların bağlanmasını sağlıyordu. XML biçiminde topoloji açıklaması, bağlantı sınırlamalarını tanımlar.
  • Dahildir desteği, standart A2DP, USB veya yeniden yönlendirme gönderme tanımlarının tekrarlanmasını önler.
  • Ses eğrileri özelleştirilebilir. Önceden, hacim tabloları sabit kodluydu. XML biçiminde, hacim tabloları açıklanır ve özelleştirilebilir.

frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml adresindeki şablonda bu özelliklerin çoğunun kullanıldığı gösterilmektedir.

Dosya biçimi ve konumu

Yeni ses politikası yapılandırma dosyası audio_policy_configuration.xml olup /system/etc konumundadır. Aşağıdaki örneklerde, Android 12 ve Android 12'nin altındaki sürümler için XML dosya biçiminde basit bir ses politikası yapılandırması gösterilmektedir.

Üst düzey yapı, her ses HAL donanım modülüne karşılık gelen modüller içerir. Her modülde, karıştırma bağlantı noktalarının, cihaz bağlantı noktalarının ve rotaların listesi bulunur:

  • Karışım bağlantı noktaları, oynatma ve yakalama için ses HAL'inde açılabilen akışların olası yapılandırma profillerini tanımlar.
  • Cihaz bağlantı noktaları, bağlanabilecek cihazları türleriyle (ve isteğe bağlı olarak adres ve ses özellikleri varsa bunlarla birlikte) tanımlar.
  • Yol, cihazdan cihaza veya akıştan cihaza yolların tanımlanmasını sağlayan mix bağlantı noktası tanımlayıcısı ile ayrılır.

Ses seviyesi tabloları, kullanıcı arayüzü indeksinden dB cinsinden ses seviyesine çevirmek için kullanılan eğriyi tanımlayan basit nokta listeleridir. Varsayılan eğriler ayrı bir dahil etme dosyasında sağlanır ancak belirli bir kullanım alanı ve cihaz kategorisine ait her eğri üzerine yazılabilir.

Dosya dahil etme

XML dahil etme (XInclude) yöntemi, diğer XML dosyalarında bulunan ses politikası yapılandırma bilgilerini dahil etmek için kullanılabilir. Dahil edilen tüm dosyalar, aşağıdaki kısıtlamalarla birlikte yukarıda açıklanan yapıya uymalıdır:

  • Dosyalar yalnızca üst düzey öğeler içerebilir.
  • Dosyalar XInclude öğeleri içeremez.

Standart Android Open Source Project (AOSP) ses HAL modülü yapılandırma bilgilerinin tüm ses politikası yapılandırma dosyalarına kopyalanmasını (hatalara yol açabilir) önlemek için includes kullanın. Aşağıdaki ses HAL'leri için standart bir ses politikası yapılandırma XML dosyası sağlanır:

  • A2DP: a2dp_audio_policy_configuration.xml
  • Alt miksi yeniden yönlendirme: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

Ses politikası kodu kuruluşu

AudioPolicyManager.cpp, bakım ve yapılandırmayı kolaylaştırmak için birkaç modüle ayrılmıştır. frameworks/av/services/audiopolicy kuruluşu aşağıdaki modülleri içerir.

Modül Açıklama
/managerdefault Tüm uygulamalarda ortak olan genel arayüzleri ve davranış uygulamalarını içerir. Motor işlevleri ve yaygın kavramlar soyutlanmış şekilde AudioPolicyManager.cpp'e benzer.
/common Temel sınıfları (ör. giriş çıkış ses akışı profilleri, ses cihazı tanımlayıcıları, ses yamaları ve ses bağlantı noktaları için veri yapıları) tanımlar. Bu daha önce AudioPolicyManager.cpp içinde tanımlanıyordu.
/engine

Belirli bir kullanım alanı için hangi cihazın ve hangi birimlerin kullanılacağını tanımlayan kuralları uygular. Belirli bir oynatma veya yakalama kullanım alanı için uygun cihazı almak ya da yönlendirme kararını değiştirebilecek bağlı cihazları veya harici durumu (yani zorunlu kullanım çağrısı durumu) ayarlamak gibi genel kısımla standart bir arayüz uygular.

İki sürümde mevcuttur: yapılandırılabilir ve varsayılan. Sürümün nasıl seçileceği hakkında bilgi edinmek için Parametre çerçevesini kullanarak yapılandırma başlıklı makaleyi inceleyin.

/engineconfigurable Parametre Çerçevesi'ne dayalı politika motoru uygulaması (aşağıya bakın). Yapılandırma, Parametre Çerçevesi'ne dayanır ve politikanın XML dosyaları tarafından tanımlandığı yere bağlıdır.
/enginedefault Önceki Android Audio Policy Manager uygulamalarını temel alan politika motoru uygulaması. Varsayılan olarak bu seçenek kullanılır ve Nexus ile AOSP uygulamalarına karşılık gelen sabit kodlu kurallar içerir.
/service Bağlayıcı arayüzleri, mesaj dizileri ve çerçevenin geri kalanıyla arayüz üzerinden kilitleme uygulamasını içerir.

Parametre çerçevesini kullanarak yapılandırma

Ses politikası kodu, anlaşılmasını ve sürdürülmesini kolaylaştırmak için düzenlenirken tamamen yapılandırma dosyalarıyla tanımlanan bir ses politikasını da destekler. Kuruluş ve ses politikası tasarımı, parametreleri işlemek için eklenti tabanlı ve kural tabanlı bir çerçeve olan Intel'in Parametre Çerçevesi'ne dayanır.

Yapılandırılabilir ses politikasının kullanılması, tedarikçi OEM'lerin şunları yapmasını sağlar:

  • Bir sistemin yapısını ve parametrelerini XML olarak tanımlayın.
  • Açıklanan parametrelere erişmek için arka uç (C++) yazın veya yeniden kullanın (eklenti).
  • Belirli bir parametrenin belirli bir değeri alması gereken koşulları/kuralları (XML'de veya alana özgü bir dilde) tanımlayın.

AOSP, Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml adresinde Parametre Çerçevesi'ni kullanan bir ses politikası yapılandırma dosyası örneği içerir. Ayrıntılar için Parametre Çerçevesi ile ilgili Intel dokümanlarına bakın.

Android 10 veya önceki sürümlerde, yapılandırılabilir ses politikası USE_CONFIGURABLE_AUDIO_POLICY derleme seçeneği kullanılarak seçilir. Android 11 veya sonraki sürümlerde ses politikası motorunun sürümü audio_policy_configuration.xml dosyasında seçilir. Yapılandırılabilir ses politikası motorunu seçmek için globalConfiguration öğesinin engine_libraryözelliğinin değerini aşağıdaki örnekte gösterildiği gibi configurable olarak ayarlayın:

<audioPolicyConfiguration>
    <globalConfiguration engine_library="configurable" />
...
</audioPolicyConfiguration>

Ses politikası yönlendirme API'leri

Android 6.0, ses yaması/ses bağlantı noktası altyapısının üzerine yerleştirilmiş ve uygulama geliştiricilerin bağlı ses kayıtları veya parçalar için belirli bir cihaz çıkışı ya da girişi tercih etmelerine olanak tanıyan herkese açık bir Enumeration and Selection API'yi kullanıma sundu.

Android 7.0'da Enumeration and Selection API, CTS testleriyle doğrulanır ve yerel C/C++ (OpenSL ES) ses akışları için yönlendirmeyi içerecek şekilde genişletilir. Yerel akışların yönlendirmesi Java'da yapılmaya devam eder. Ayrıca, AudioTrack ve AudioRecord sınıflarına özgü açık yönlendirme yöntemlerinin yerini alan, bunları birleştiren ve desteğini sonlandıran bir AudioRouting arayüzü eklenmiştir.

Enumeration and Selection API hakkında ayrıntılı bilgi için Android yapılandırma arayüzleri ve OpenSLES_AndroidConfiguration.h başlıklı makaleyi inceleyin. Ses yönlendirme hakkında ayrıntılı bilgi için AudioRouting bölümüne bakın.

Çok kanallı destek

Donanımınız ve sürücünüz HDMI üzerinden çok kanallı sesi destekliyorsa ses akışını doğrudan ses donanımına gönderebilirsiniz (bu işlem, sesin iki kanala indirgenmemesi için AudioFlinger mikserini atlar). Ses HAL'i, bir çıkış akışı profilinin çok kanallı ses özelliklerini destekleyip desteklemediğini göstermelidir. HAL, özelliklerini gösterirse varsayılan politika yöneticisi HDMI üzerinden çok kanallı oynatmaya izin verir. Uygulama ayrıntıları için device/samsung/tuna/audio/audio_hw.c başlıklı makaleyi inceleyin.

Ürününüzün çok kanallı ses çıkışı içerdiğini belirtmek için ses politikası yapılandırma dosyasını düzenleyerek ürününüzün çok kanallı çıkışını açıklayın. frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml'deki aşağıdaki örnekte dinamik bir kanal maskesi gösterilmektedir. Bu, ses politikası yöneticisinin bağlantıdan sonra HDMI alıcı tarafından desteklenen kanal maskelerini sorguladığını gösterir.

AUDIO_CHANNEL_OUT_5POINT1 gibi statik bir kanal maskesi de belirtebilirsiniz. AudioFlinger'ın karıştırıcısı, çok kanallı sesi desteklemeyen bir ses cihazına gönderilen içeriği otomatik olarak stereoya indirger.

Medya codec'leri

Donanımınızın ve sürücülerinizin desteklediği ses codec'lerinin ürününüz için doğru şekilde tanımlandığından emin olun. Ayrıntılar için Codec'leri Çerçeveye Açma başlıklı makaleyi inceleyin.