AAOS'un CarAudioService
içinde kendi ses düzeyi yönetimi vardır. Hacimlerin HAL'nin altına yazılım yerine bir donanım amplifikatörü tarafından uygulanması beklentisiyle sabit hacimler kullanır. Ayrıca, aynı kazanımları birim grubuyla ilişkili tüm aygıtlara uygulamak için çıkış aygıtlarını birim grupları halinde düzenler.
Sabit hacimleri kullanma
AAOS uygulamaları, ses seviyesini bir yazılım karıştırıcısı yerine bir donanım amplifikatörü kullanarak kontrol etmelidir. Yan etkilerden kaçınmak için config_useFixedVolume
bayrağını true olarak ayarlayın (gerektiğinde kaplama):
<resources> <!-- Car uses hardware amplifier for volume. --> <bool name="config_useFixedVolume">true</bool> </resources>
config_useFixedVolume
bayrağı ayarlanmadığında (veya false değerine ayarlandığında), uygulamalar AudioManager.setStreamVolume()
çağırabilir ve ses düzeyini yazılım karıştırıcısında akış türüne göre değiştirebilir. Bu, diğer uygulamalar üzerindeki potansiyel etki nedeniyle ve yazılım karıştırıcısındaki ses seviyesi zayıflamasının, donanım yükselticisinden alındığında sinyalde daha az sayıda önemli bit bulunmasına yol açması nedeniyle istenmeyen bir durum olabilir.
Cilt grupları
Ses seviyesi grupları, bir ses bölgesi içindeki bir dizi cihaz için ses birimlerini yönetir. Her ses grubu için ses düzeyi bağımsız olarak kontrol edilebilir ve elde edilen kazanımlar, aracın amplifikatörü tarafından uygulanacak ilgili cihazlar üzerinde yapılandırılır. Ses düzeyi ayarları kullanıcı için kalıcı olur ve kullanıcı oturum açtığında yüklenir.
Birim gruplarını tanımlama
CarAudioService, car_audio_configuration.xml
dosyasında tanımlanan birim gruplarını kullanır:
<audioZoneConfiguration version="2.0"> <zones> <zone name="primary zone" isPrimary="true"> <volumeGroups> <group> <device address="bus0_media_out"> <context context="music"/> </device> </group> <group> <device address="bus1_navigation_out"> <context context="navigation"/> </device> <device address="bus2_voice_command_out"> <context context="voice_command"/> </device> </group> ... </volumeGroups> </zone> </zones> </audioZoneConfiguration>
Örnek car_audio_configuration.xml
uygulaması.
Her birim grubu, ilişkili adreslere sahip bir veya daha fazla çıkış aygıtı içermelidir. Bu adresler audio_policy_configuration.xml
dosyasında tanımlanan çıkış aygıtlarına karşılık gelmelidir.
Hacim grubu kazançlarını yapılandırma
Her hacim grubunun minimum, maksimum ve varsayılan kazanç değerlerinin yanı sıra bir adım boyutu da vardır. Bunlar, ses grubuyla ilişkili cihazlar için audio_policy_configuration.xml
dosyasında yapılandırılan değerlere göre belirlenir.
<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> <gains> <gain name="" mode="AUDIO_GAIN_MODE_JOINT" minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/> </gains> </devicePort>
Başlatma sırasında birim grubu, ilgili cihazların kazanç değerlerini kontrol edecek ve grubu aşağıdaki gibi yapılandıracaktır:
- Adım boyutu. Birim grubu tarafından kontrol edilen tüm cihazlar için aynı olmalıdır
- Asgari kazanç. Gruptaki cihazlar arasında en küçük minimum kazanç
- Maksimum kazanç. Gruptaki cihazlar arasında en yüksek maksimum kazanç
- Varsayılan kazanç. Gruptaki cihazlar arasında en yüksek varsayılan kazanç
Bu değerlerin yapılandırılma şekli nedeniyle, bir ses seviyesi grubunun kazancını, ses grubuyla ilişkili bir cihaz için desteklenen aralığın dışında ayarlamak mümkündür. Bu durumda, o cihaz için kazanç, ses grubu değerinin aralığın altında veya üstünde olmasına bağlı olarak cihazın minimum veya maksimum kazanç değerine ayarlanacaktır.
Birim grubu tanımlayıcıları
Birim grupları çalışma zamanında XML dosyasındaki tanım sıralarına göre tanımlanır. Kimlikler bir ses bölgesi içinde 0 ile N-1 arasında değişir; burada N, o bölgedeki ses seviyesi gruplarının sayısıdır. Bu şekilde, birim grubu kimlikleri bölgeler arasında benzersiz değildir. Bu tanımlayıcılar, birim gruplarıyla ilişkili CarAudioManager
API'leri için kullanılır. zoneId
olmayan bir groupId
alan herhangi bir API, varsayılan olarak birincil ses bölgesini kullanır.
Çok bölgeli ses düzeyi yönetimi
Her ses bölgesinin bir veya daha fazla ses seviyesi grubuna sahip olması beklenir ve her ses seviyesi grubu yalnızca tek bir ses bölgesiyle ilişkilendirilir. Bu ilişki car_audio_configuration.xml
dosyasının bir parçası olarak tanımlanır. Yukarıdaki Hacim gruplarını tanımlama bölümünde verilen örneğe bakın.
Her bölgenin geçerli ses seviyesi seviyeleri, o bölgeyle ilişkili kullanıcı için kalıcı olur. Bu ayarlar bölgeye özeldir, yani bir kullanıcı birincil bölgeyle ilişkili bir ekranda oturum açarsa ve daha sonra ikincil ses bölgesiyle ilişkili bir bölgede oturum açarsa, ilk bölge için yüklenen ve sürdürülen ses seviyeleri, ikincil bölge için olanlar.
Ses seviyesi tuşu olaylarını yönetme
Android, ses kontrolü için KEYCODE_VOLUME_UP
, KEYCODE_VOLUME_DOWN
ve KEYCODE_VOLUME_MUTE
dahil olmak üzere çeşitli tuş kodları tanımlar. Varsayılan olarak Android, ses seviyesi tuşu olaylarını uygulamalara yönlendirir. Otomotiv uygulamaları bu önemli olayları CarAudioService
zorlamalıdır; bu daha sonra uygun şekilde setGroupVolume
veya setMasterMute
çağırabilir.
Bu davranışı zorlamak için config_handleVolumeKeysInWindowManager
bayrağını true
olarak ayarlayın:
<resources> <bool name="config_handleVolumeKeysInWindowManager">true</bool> </resources>
Ses seviyesi tuşu etkinliklerinin şu anda hangi bölgeye yönelik olduklarını ayırt etmenin bir yolu yoktur ve bu nedenle hepsinin birincil ses bölgesiyle ilişkili olduğu varsayılmaktadır. Bir ses seviyesi tuşu olayı alındığında CarAudioService
aktif oynatıcılar için ses bağlamlarını getirerek ve ardından en yüksek öncelikli ses bağlamıyla ilişkili çıkış cihazını içeren ses seviyesi grubunu ayarlayarak hangi ses seviyesi grubunun ayarlanacağını belirler. Önceliklendirme, CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
tanımlanan sabit sıralamaya göre belirlenir.
Solma ve denge
AudioControl HAL'in her iki sürümü de araçta solma ve dengeyi ayarlamak için API'ler içerir. CarAudioManager için değerleri AudioControl HAL'a ileten ilgili sistem API'leri vardır. Bu API'ler android.car.permission.CAR_CONTROL_AUDIO_VOLUME
gerektirir.
AudioControl API'leri şunlardır:
-
setBalanceTowardRight(float value)
. Hoparlör sesini arabanın sağ (+) veya sol (-) tarafına doğru kaydırır. 0,0 ortalanmış, +1,0 tamamen sağ, -1,0 tamamen sol ve -1 ila 1 aralığının dışındaki bir değer hatadır. -
setFadeTowardFront(float value)
- Hoparlör sesini arabanın önüne (+) veya arkasına (-) doğru kaydırır. 0,0 ortalanmış, +1,0 tamamen ileri, -1,0 tamamen geri ve -1 ila 1 aralığının dışındaki bir değer bir hatadır.
Bu değerlerin nasıl uygulanması gerektiğine ve kullanıcılara nasıl gösterileceklerine karar vermek OEM'lere kalmıştır. Kesinlikle medyaya veya genel olarak tüm Android seslerine uygulanabilirler.
Android 11 ayrıca çıkış cihazlarına ses efektleri uygulama desteğini de tanıttı. Bununla alternatif olarak solma ve dengeyi bu API'ler yerine uygun çıkış cihazlarındaki ses efektleri aracılığıyla yönetmek mümkündür.
Sesin kısılması
Araç, aynı anda çalan başka bir akışın daha net duyulabilmesi için bir akışın kazancını azalttığında ses kısılması meydana gelir. AAOS'ta, Android dışında işletim sisteminin üzerinde hiçbir kontrolü olmayan birçok ses potansiyel olarak mevcut olduğundan, ses kısma işlemi HAL'e bırakılmıştır. Android 11'de, HAL'in kullanabileceği ana bilgi, iki çıkış cihazının her ikisinin de aktif akışlara sahip olup olmadığıdır.
Ne zaman eğilmeli
Eğilmenin HAL tarafından nasıl ele alınacağına karar vermek bireysel OEM'e kalmış olsa da önerdiğimiz bazı genel kurallar vardır. Android'de oynatılan birden fazla akış, çoğunlukla iki uygulama/hizmet ses odağını aynı anda tuttuğunda meydana gelir. Bunu akılda tutarak, Android'in ne zaman eşzamanlı odaklama sağlayabileceğini ve dolayısıyla iki farklı akışın eş zamanlı olarak oynatılmasının ne zaman mümkün olabileceğini öğrenmek için Etkileşim matrisine bakın.
Android tarafından karıştırılan tüm akışların, herhangi bir kazanç uygulanmadan önce yapılacağını unutmayın. Bu nedenle, bir başkasıyla eş zamanlı oynatıldığında eğilmesi gereken herhangi bir akış, HAL'in bunları birbirine karıştırmadan önce kıstırma uygulayabilmesi için ayrı çıkış cihazlarına yönlendirilmelidir.
Önerilen eğilme davranışı
Aşağıda, eğilmenin uygulanmasını önerdiğimiz olası eşzamanlı etkileşimler yer almaktadır:
-
EMERGENCY
. Sürücünün sesi duyduğundan emin olmak içinSAFETY
dışındaki her şeyi kısın veya sessize alın -
SAFETY
. Sürücünün sesi duyduğundan emin olmak içinEMERGENCY
dışındaki her şeyi eğilin -
NAVIGATION
.SAFETY
veEMERGENCY
dışındaki her şeyi göz ardı edin -
CALL
.SAFETY
,EMERGENCY
veNAVIGATION
dışındaki her şeyi göz ardı edin -
VOICE
. ÖrdekCALL_RING
- Aktif
VEHICLE_SOUNDS
önemini ve sürücünün bunları duymasını sağlamak için diğer sesleri susturup kaçırmamalarını belirlemek OEM'lere kalmıştır. -
MUSIC
veANNOUNCEMENT
her şeyden kaçınılmalıdır. Bunun ana istisnası şu andaSYSTEM_SOUND
olarak çalınan dokunma etkileşimi tonlarıdır.
Eğilirken dikkat edilmesi gereken diğer hususlar
Navigasyon veya asistan gibi bazı uygulamalar/hizmetler, işlemlerini tamamlamak için birden fazla oynatıcı kullanabilir. OEM'ler, kullanıcının navigasyondan veya asistan uygulamasından bir sonraki oynatma başladığında medyanın bir an için tam ses düzeyine geri dönmemesini sağlamak için akış verilerinin bu çıkış cihazlarından gelmesinin ne zaman durduğuna bağlı olarak çok agresif bir şekilde ses kısmaktan kaçınmalıdır.
Yeterince iyi izolasyona sahip birden fazla ses aşamasına sahip araçlar için, sesi eğilmek yerine arabanın farklı bölgelerine yönlendirme seçeneği de mevcut. Örneğin, müzik kabinde normal ses seviyesinde çalmaya devam ederken, navigasyon talimatları sürücünün koltuk başlığı hoparlörlerine yönlendirilebilir.
Güvenlik açısından kritik sesler
Android 11, HAL ses odaklama API'lerini kullanıma sunmuş olsa da, güvenlik açısından kritik seslerin diğerlerine göre önceliklendirilmesi hala HAL'e kalmıştır. HAL, USAGE_EMERGENCY
için ses odağını tutsa bile bu, Android içindeki uygulama ve hizmetlerin ses çalmayacağını garanti etmez. Güvenlik açısından kritik sesler çalınırken Android'den hangi akışların karıştırılması veya sessize alınması gerektiğini belirlemek HAL'a kalmıştır.
Ses düzeyi ayarları kullanıcı arayüzünü yapılandırma
AAOS, birim ayarları kullanıcı arayüzünü birim grubu yapılandırmasından ayırır (bu, birim gruplarını yapılandırma bölümünde açıklandığı gibi üst üste yerleştirilebilir). Bu ayırma, gelecekte birim grubu yapılandırmasının değişmesi durumunda herhangi bir değişikliğe gerek kalmamasını sağlar.
Araç Ayarları kullanıcı arayüzünde, packages/apps/Car/Settings/res/xml/car_volume_items.xml
dosyası, tanımlanan her AudioAttributes.USAGE
ile ilişkili kullanıcı arayüzü öğelerini (başlık ve simge kaynakları) içerir. Bu dosya, her VolumeGroup'ta yer alan ilk tanınan kullanımla ilişkili kaynakları kullanarak tanımlanan VolumeGroups
makul bir şekilde oluşturulmasını sağlar.
Örneğin, aşağıdaki örnek bir VolumeGroup'u hem voice_communication
hem de voice_communication_signalling
içerecek şekilde tanımlar. Araç ayarları kullanıcı arayüzünün varsayılan uygulaması, dosyadaki ilk kaynak olduğu için voice_communication
ile ilişkili kaynakları kullanarak VolumeGroup'u oluşturur.
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto"> <item car:usage="voice_communication" car:title="@*android:string/volume_call" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="voice_communication_signalling" car:title="@*android:string/volume_call" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="media" car:title="@*android:string/volume_music" car:icon="@*android:drawable/ic_audio_media"/> <item car:usage="game" car:title="@*android:string/volume_music" car:icon="@*android:drawable/ic_audio_media"/> <item car:usage="alarm" car:title="@*android:string/volume_alarm" car:icon="@*android:drawable/ic_audio_alarm"/> <item car:usage="assistance_navigation_guidance" car:title="@string/navi_volume_title" car:icon="@drawable/ic_audio_navi"/> <item car:usage="notification_ringtone" car:title="@*android:string/volume_ringtone" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistant" car:title="@*android:string/volume_unknown" car:icon="@*android:drawable/ic_audio_vol"/> <item car:usage="notification" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_communication_request" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_communication_instant" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_communication_delayed" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_event" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistance_accessibility" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistance_sonification" car:title="@*android:string/volume_unknown" car:icon="@*android:drawable/ic_audio_vol"/> <item car:usage="unknown" car:title="@*android:string/volume_unknown" car:icon="@*android:drawable/ic_audio_vol"/> </carVolumeItems>
Yukarıdaki yapılandırmada kullanılan nitelikler ve değerler packages/apps/Car/Settings/res/values/attrs.xml
dosyasında beyan edilmiştir. Ses seviyesi ayarları kullanıcı arayüzü aşağıdaki VolumeGroup tabanlı CarAudioManager API'lerini kullanır:
- Kaç kontrolün çizilmesi gerektiğini bilmek için
getVolumeGroupCount()
. - Alt ve üst sınırları almak için
getGroupMinVolume()
vegetGroupMaxVolume()
. - Geçerli birimi almak için
getGroupVolume()
. - Ses seviyesi değişikliklerinde bildirim almak için
registerVolumeChangeObserver()
.