Android 10 sürümünde, otomotivle ilgili karmaşık kullanım alanlarını destekleme konusunda daha fazla esneklik sağlamak için ses politikası yöneticisinde önemli bir yeniden düzenleme yapılıyor:
- OEM'ye özgü yönlendirme stratejileri.
- Aynı hacim eğrilerinin kullanıldığı eski akış türü grupları için özelleştirilebilir hacim grupları.
- Sabit kodlanmış olmak yerine ses politikası motoru tarafından tanımlanan yönlendirme stratejileri.
- Ses politikası motoru tarafından yönetilen ses düzeyi 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 ses politikası yapılandırma dosya biçimini (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
dosyasının kullanılması gerekiyordu (Galaxy Nexus ses donanımı için bu dosyanın bir örneğini device/samsung/tuna/audio/audio_policy.conf
'te görebilirsiniz). Ancak CONF, televizyonlar ve otomobiller 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 de 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ğırması, istemcileri yakalama yolu değişiklikleri konusunda bilgilendirir.
- Aşağıdaki durumlarda istemci sessiz ses örnekleri alır:
- Gizlilik açısından hassas bir kullanım alanı (örneğin,
VOICE_COMMUNICATION
) etkin. - İ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.
- Gizlilik açısından hassas bir kullanım alanı (örneğin,
- Ses profilleri, HDMI basit ses tanımlayıcılarına benzer bir yapıya sahiptir. Bu yapı, 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ın açık tanımları vardır. Önceden, ses politikasının ses yaması API'leriyle istenen bağlantıları kontrol etmesini engelleyen 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 birçoğunun kullanımda olduğu 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.
Android 12 için ses politikası örneğini göster
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <audioPolicyConfiguration version="7.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <globalConfiguration speaker_drc_enabled="true"/> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>Speaker</item> <item>Earpiece</item> <item>Built-In Mic</item> </attachedDevices> <defaultOutputDevice>Speaker</defaultOutputDevice> <mixPorts> <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> <mixPort name="primary input" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address=""> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> </devicePorts> <routes> <route type="mix" sink="Earpiece" sources="primary output"/> <route type="mix" sink="Speaker" sources="primary output"/> <route type="mix" sink="Wired Headset" sources="primary output"/> <route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/> </routes> </module> <xi:include href="a2dp_audio_policy_configuration.xml"/> </modules> <xi:include href="audio_policy_volumes.xml"/> <xi:include href="default_volume_tables.xml"/> </audioPolicyConfiguration>
Android 12'nin altındaki sürümler için ses politikası örneğini gösterme
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <globalConfiguration speaker_drc_enabled="true"/> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>Speaker</item> <item>Earpiece</item> <item>Built-In Mic</item> </attachedDevices> <defaultOutputDevice>Speaker</defaultOutputDevice> <mixPorts> <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> <mixPort name="primary input" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address=""> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> </devicePorts> <routes> <route type="mix" sink="Earpiece" sources="primary output"/> <route type="mix" sink="Speaker" sources="primary output"/> <route type="mix" sink="Wired Headset" sources="primary output"/> <route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/> </routes> </module> <xi:include href="a2dp_audio_policy_configuration.xml"/> </modules> <xi:include href="audio_policy_volumes.xml"/> <xi:include href="default_volume_tables.xml"/> </audioPolicyConfiguration>
Üst düzey yapı, her ses HAL donanım modülüne karşılık gelen modüller içerir. Her modülde, mix bağlantı noktalarının, cihaz bağlantı noktalarının ve rotaların listesi bulunur:
- Karışık bağlantı noktaları, oynatma ve yakalama için ses HAL'de açılabilen akışlar için olası yapılandırma profillerini açıklar.
- Cihaz bağlantı noktaları, bağlanabilecek cihazları türleriyle (ve isteğe bağlı olarak adres ve ses özellikleri varsa bunlarla birlikte) tanımlar.
- Rotalar, karma bağlantı noktası tanımlayıcısından ayrılarak cihazdan cihaza veya cihazdan cihaza akışla ilgili rotaların açıklanmasına olanak tanı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.
Hacim tablosu örneğini göster
<?xml version="1.0" encoding="UTF-8"?> <volumes> <reference name="FULL_SCALE_VOLUME_CURVE"> <point>0,0</point> <point>100,0</point> </reference> <reference name="SILENT_VOLUME_CURVE"> <point>0,-9600</point> <point>100,-9600</point> </reference> <reference name="DEFAULT_VOLUME_CURVE"> <point>1,-4950</point> <point>33,-3350</point> <point>66,-1700</point> <point>100,0</point> </reference> </volumes>
Hacim örneğini göster
<?xml version="1.0" encoding="UTF-8"?> <volumes> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA"ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_SPEAKER"> <point>1,-5500</point> <point>20,-4300</point> <point>86,-1200</point> <point>100,0</point> </volume> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="SILENT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="SILENT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="SILENT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/> </volumes>
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 Açık Kaynak Projesi (AOSP) ses HAL modülü yapılandırma bilgilerinin tüm ses politikası yapılandırma dosyalarına kopyalanmasını önlemek için de bu yöntemi kullanabilirsiniz (hatalara açık olabilir). 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ı kodunun düzenlenmesi
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 yaygın olarak kullanılan genel arayüzleri ve davranış uygulamasını içerir. Motor işlevselliği ve ortak kavramların soyutlandığı AudioPolicyManager.cpp ile benzerdir. |
/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 ayar 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 için Parametre Çerçevesi'ni kullanarak yapılandırma bölümüne bakın. |
/engineconfigurable |
Parametre çerçevesine 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ı. Bu varsayılan ayardı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. Organizasyon ve ses politikası tasarımı, parametrelerin işlenmesine yönelik eklenti tabanlı ve kural tabanlı bir çerçeve olan Intel Parametre Çerçevesi'ni temel alı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 üst kısmında bulunan ve uygulama geliştiricilerin bağlı ses kayıtları veya kanalları için belirli bir cihaz çıkışı veya girişi için tercih belirtmelerini sağlayan, herkese açık bir Numaralandırma ve Seçim API'sini kullanıma sunmuştur.
Android 7.0'da, Numaralama ve Seçim API'si CTS testleri tarafından 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. Buna ek olarak, 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.
Numaralandırma ve Seçim API'si hakkında ayrıntılı bilgi için Android yapılandırma arayüzleri ve OpenSLES_AndroidConfiguration.h
konularına bakın.
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 aracılığıyla çok kanallı sesi destekliyorsa ses akışını doğrudan ses donanımına gönderebilirsiniz (bu işlem, AudioFlinger mikserini atlayarak iki kanala indirgenmesini engeller.) 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ı ürününüzün çok kanallı çıkışını tanımlayacak şekilde düzenleyin. 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.
HDMI cihaz yapılandırması örneğini göster
<module name="primary" halVersion="2.0"> <attachedDevices> <item>Speaker</item> </attachedDevices> <defaultOutputDevice>Speaker</defaultOutputDevice> <mixPorts> <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> <mixPort name="direct" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT" /> <mixPort name="tunnel" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_HW_AV_SYNC" /> </mixPorts> <devicePorts> <devicePort tagName="Speaker" type="AUDIO_DEVICE_OUT_SPEAKER" role="sink" /> <devicePort tagName="Out Aux Digital" type="AUDIO_DEVICE_OUT_AUX_DIGITAL" role="sink" encodedFormats="AUDIO_FORMAT_AC3 AUDIO_FORMAT_IEC61937" /> </devicePorts> <routes> <route type="mix" sink="Speaker" sources="primary output"/> <route type="mix" sink="Out Aux Digital" sources="primary output,direct,tunnel"/> </routes> </module>
Ayrıca AUDIO_CHANNEL_OUT_5POINT1
gibi statik bir kanal maskesi de belirtebilirsiniz. AudioFlinger'ın mikseri, çok kanallı sesi desteklemeyen bir ses cihazına gönderildiğinde içeriği otomatik olarak stereoya indirgetir.
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.