Ses yönetimi, seslerin yazılımda değil, donanım amplifikatörü tarafından HAL'ın altında uygulanacağı beklentisiyle sabit sesler kullanan CarAudioService
içinde yer alır. CarAudioService
, çıkış cihazlarını ses grupları halinde düzenler. Böylece, bir ses grubuyla ilişkili tüm cihazlara aynı kazançlar uygulanır.
Sabit birimler
AAOS uygulamalarında ses seviyesini kontrol etmek için yazılım mikseri yerine donanım amplifikatörü kullanılır. Yan etkileri önlemek için config_useFixedVolume
işaretini true
olarak ayarlayın (gerekirse yer paylaşımı yapın):
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
config_useFixedVolume
işareti ayarlanmadığında (veya false
olarak ayarlandığında), uygulamalar yazılım mikserinde akış türüne göre ses seviyesini değiştirmek için AudioManager.setStreamVolume()
işlevini çağırabilir. Bu durum, diğer uygulamalar üzerindeki olası etkiler ve yazılım mikserindeki ses zayıflatmasının, donanım amplifikatörü tarafından alındığında sinyalde daha az önemli bit bulunmasına neden olabileceği için her zaman istenmeyebilir.
Hacim grupları
Ses grupları, bir ses bölgesindeki bir cihaz koleksiyonunun seslerini yönetir. Her ses grubu için ses seviyesi bağımsız olarak kontrol edilebilir. Elde edilen kazançlar, aracın amplifikatörü tarafından uygulanmak üzere ilişkili cihazlarda yapılandırılır. Ses ayarları kullanıcı için kalıcı hale getirilir ve kullanıcı oturum açtığında yüklenir.
Birim gruplarını tanımlama
CarAudioService, car_audio_configuration.xml
içinde tanımlanan ses gruplarını kullanır:
<audioZoneConfiguration version="4">
</deviceConfigurations>
<activationVolumeConfigs>
<activationVolumeConfig name="activation_volume_on_boot_config">
<activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
invocationType="onBoot" />
</activationVolumeConfig>
...
</activationVolumeConfigs>
<zones>
<zone name="primary zone" isPrimary="true">
<zoneConfigs>
<zoneConfig name="primary zone config 0" isDefault="true">
<volumeGroups>
<group activationConfig="activation_volume_on_boot_config">
<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>
</zoneConfig>
...
</zoneConfigs>
</zone>
</zones>
</audioZoneConfiguration>
Her birim grubunda, ilişkili adreslere sahip bir veya daha fazla çıkış cihazı bulunmalıdır. Adresler, audio_policy_configuration.xml
içinde tanımlanan çıkış cihazlarına karşılık gelmelidir.
Hacim grubu kazançlarını yapılandırma
Her ses grubu için minimum, maksimum ve varsayılan kazanç değerlerinin yanı sıra ses grubuyla ilişkili cihazlar için audio_policy_configuration.xml
içinde yapılandırılan değerlere göre bir adım boyutu vardır.
<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, ilişkili cihazların kazanç değerlerini kontrol eder ve grubu aşağıdaki gibi yapılandırır:
- Adım boyutu. Ses grubu tarafından kontrol edilen tüm cihazlarda aynı olmalıdır.
- Minimum 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 göz önüne alındığında, bir ses grubunun kazancını, ses grubuyla ilişkili bir cihaz için desteklenen aralığın dışında ayarlamak mümkündür. Bu durumda, ses grubu değerinin aralığın altında veya üstünde olmasına bağlı olarak, söz konusu cihazın kazancı cihazın minimum ya da maksimum kazanç değerine ayarlanır.
Ses grubu tanımlayıcıları
Ses grupları, XML dosyasında tanımlanan sırayla çalışma zamanında tanımlanır.
Kimlikler, bir ses bölgesinde 0
ile N-1
arasında değişir. Burada N
, söz konusu bölgedeki ses grubu sayısıdır. Bu nedenle, birim grubu kimlikleri bölgeler arasında benzersiz değildir. Bu tanımlayıcılar, CarAudioManager
API'leri için kullanılır. zoneId
olmadan groupId
alan tüm API'ler varsayılan olarak birincil ses bölgesini kullanır.
Çoklu bölge birimi yönetimi
Her ses bölgesinde bir veya daha fazla ses grubu olması beklenir ve her ses grubu yalnızca tek bir ses bölgesiyle ilişkilendirilir. Bu ilişki, car_audio_configuration.xml
kapsamında tanımlanır. Daha fazla bilgi edinmek için Ses grubu tanımlama bölümündeki yukarıdaki örneğe bakın.
Her bölgenin mevcut ses seviyeleri, o bölgeyle ilişkili kullanıcı için kalıcı olarak saklanır. Bu ayarlar bölgeye özeldir. Yani bir kullanıcı birincil bölgeyle ilişkili bir ekranda oturum açtıktan sonra ikincil bir ses bölgesiyle ilişkili bir bölgede oturum açarsa ilk bölge için yüklenen ve kalıcı hale getirilen ses seviyeleri, ikincil bölgedekilerden farklı olur.
Minimum ve maksimum etkinleştirme hacmi
Android 15, araç ses sistemlerinde daha iyi güvenlik ve kullanıcı rahatlığı için ses grubu dizinleri üzerinde kontrol sağlar. Bu, araç ses yapılandırmasında yapılandırılan minimum ve maksimum etkinleştirme hacimlerinin kullanılmasıyla sağlanır (bkz. Hacim gruplarını tanımlama). Bu özelliği, Car Service RRO'larında audioUseMinMaxActivationVolume
değerini true
olarak ayarlayarak etkinleştirebilirsiniz.
activationVolumeConfig
içinde birden fazla activationVolumeConfigs
girişi tanımlayabilirsiniz. Bu girişlerin her biri farklı bir minimum ve maksimum etkinleştirme yapılandırmasını temsil eder. Her activationVolumeConfig
:
- Ses grubu (
group
) içinde daha sonra referans verilebilmesi için araç ses yapılandırma dosyasında benzersiz birname
içermelidir. - Yalnızca bir
activationVolumeConfigEntry
içermelidir.
Her activationVolumeConfig
öğesi aşağıdaki özellikleri içerir:
minActivationVolumePercentage
(tam sayı, 0-100, isteğe bağlı, varsayılan: 0): Minimum etkinleştirme hacmini yüzde olarak belirtir.maxActivationVolumePercentage
(tam sayı, 0-100, isteğe bağlı, varsayılan: 100): Maksimum etkinleştirme hacmini yüzde olarak belirtir.invocationType
(dize, isteğe bağlı, varsayılan:onPlaybackChanged
): Minimum ve maksimum etkinleştirme hacminin uygulandığı koşulları tanımlar:onBoot
: Yalnızca başlatma işleminden sonra bir ses grubu üzerinde yeni etkinleştirilen ilk oynatmaya uygulanır.onSourceChanged
: Yalnızca bir birim grubunda uygulaması veya UID kaynağı değiştirilmiş yeni etkin oynatmalar için geçerlidir.onPlaybackChanged
: Bir ses grubunda yeni etkinleştirilen her oynatmaya uygulanır.
CarAudioService
, şu anda etkin olan aşağıdaki ses alt bileşenlerini izleyerek minimum ve maksimum etkinleştirmeyi yönetir:
- Şu anda etkin olan oynatma parçaları
- Mevcut arama durumu
- Ses Kontrolü HAL'sinden gelen mevcut ses odağı isteği. Ses Kontrolü HAL'sinden gelen ses odağı isteği, Android dışında etkin bir ses oynatmanın gerçekleştiğini belirtir.
Aşağıdaki resimde, minimum ve maksimum etkinleştirme hacmi yönetimine dair genel bir bakış gösterilmektedir:
1. şekil. Minimum ve maksimum etkinleştirme hacmi yönetimi etkin ses verisi yolları.
Belirtilen minActivationVolumePercentage
, maxActivationVolumePercentage
,
minimum ve maksimum ses artışı indeksi ile her ses grubu için minimum ve maksimum
etkinleştirme ses artışı indeksini hesaplayabilirsiniz. CarAudioService
yeni etkinleştirilen her oynatmayı izler ve aşağıdaki koşullarda minimum ve maksimum
etkinleştirme hacmini uygular:
- Çağırma türü eşleşmeleri: Oynatmanın etkinleştirme türü (Audio Manager, Audio Control HAL veya Telephony Manager'dan türetilir) ses grubuyla ilişkili
activationVolumeConfigEntry
içinde belirtileninvocationType
ile eşleşmelidir. Ses dizini aralığın dışında: Ses grubunun mevcut ses kazancı dizini, tanımlanan etkinleştirme ses kazancı dizini aralığının dışında olmalıdır. Özellikle aşağıdakilerden biri geçerlidir:
Dizin, hesaplanan minimum etkinleştirme hacmi kazancından düşük.
VEYA
Dizin, hesaplanan maksimum etkinleştirme hacmi kazancı dizininden yüksek.
Etkinleştirme eşleşmesi verildiğinde, ses grubu için ses artışı indeksi aşağıdakilerden birine göre ayarlanır:
Minimum etkinleştirme hacmi kazancı dizininden düşükse minimum etkinleştirme hacmi kazancı dizini
VEYA
Maksimum etkinleştirme hacmi, maksimum etkinleştirme hacmi kazanç indeksinden yüksekse maksimum etkinleştirme hacmi kazanç indeksi
Ayrıca, etkinlik türü EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED
olan bir araç hacmi grubu etkinliği, kayıtlı tüm hacim grubu etkinliği geri çağırmalarına gönderilir.
Ses seviyesi tuşu etkinliklerini işleme
Android, ses seviyesi kontrolü için aşağıdakiler de dahil olmak üzere çeşitli tuş kodları tanımlar:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
Android, ses tuşu etkinliklerini varsayılan olarak uygulamalara yönlendirir. Otomotiv uygulamaları, bu önemli etkinliklerin CarAudioService
tarafından işlenmesini zorunlu kılmalıdır. CarAudioService
, uygun şekilde setGroupVolume
veya setMasterMute
'ı çağırır. Bu davranışı zorlamak için config_handleVolumeKeysInWindowManager
işaretini true
olarak ayarlayın:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
Şu anda hacim önemli etkinliklerinin hangi bölge için tasarlandığını ayırt etmenin bir yolu yoktur ve tümünün birincil ses bölgesiyle ilişkili olduğu varsayılır. Bir ses seviyesi tuşu etkinliği alındığında CarAudioService
, etkin oynatıcıların ses bağlamlarını getirerek hangi ses seviyesi grubunun ayarlanacağını belirler ve ardından en yüksek öncelikli ses bağlamıyla ilişkili çıkış cihazını içeren ses seviyesi grubunu ayarlar. Önceliklendirme, CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
adresinde tanımlanan sabit bir sıralamaya göre belirlenir.
Solma ve denge
AudioControl HAL'nin her iki sürümünde de araçta fade ve denge ayarı için API'ler bulunur. CarAudioManager için karşılık gelen sistem API'leri, AudioControl HAL'ye değerler iletir. Bu API'ler için android.car.permission.CAR_CONTROL_AUDIO_VOLUME
gerekir. 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 ortalanır
- +1,0 tamamen doğru
- -1,0 tamamen solda
- -1 ile 1 aralığının dışındaki bir değer hatadır.
setFadeTowardFront(float value)
, hoparlör sesini aracın ön (+) veya arka (-) tarafına doğru kaydırır.- 0.0 ortalanır
- +1.0 tamamen ileri
- -1,0 tamamen arkada
- -1 ile 1 aralığının dışındaki bir değer hatadır.
Bu değerlerin nasıl uygulanacağına ve kullanıcılara nasıl gösterileceğine siz karar verirsiniz. Bu ayarlar yalnızca medyaya veya tüm Android seslerine uygulanabilir. Android 11'de çıkış cihazlarına ses efektleri uygulama desteği de sunuldu. Bu sayede, fade ve dengeyi bu API'ler yerine uygun çıkış cihazlarındaki ses efektleri aracılığıyla yönetmek de mümkündür.
Sesi kısma
Sesi kısma özelliği, araç aynı anda çalınan başka bir akışın daha net duyulabilmesi için bir akışın kazancını azalttığında gerçekleşir. AAOS'te sesi kısma, HAL tarafından uygulanır. Android, işletim sisteminin dışındaki sesleri kontrol edemez. Android 11'de, HAL'ın ses kısma kararları vermesi için kullanabileceği temel bilgi, iki çıkış cihazının da etkin akışlara sahip olup olmadığıdır.
Ne zaman eğilmelisiniz?
HAL tarafından ducking işleminin nasıl yapılacağını belirlemek OEM'in sorumluluğundadır. Ancak aşağıdaki yönergeleri uygulamanızı öneririz.
Android'de birden fazla akışın oynatılması genellikle iki uygulama veya hizmet aynı anda ses odağını tuttuğunda gerçekleşir. Android'in eşzamanlı odaklanmaya ne zaman izin verebileceğini öğrenmek için Kısıtlama türleri bölümündeki etkileşim matrisine bakın. Araba ses eklentisinin kullanıma sunulmasıyla birlikte bu durum, AudioFocus yönetiminize de bağlıdır.
Android tarafından karıştırılan tüm akışlar, kazançlar uygulanmadan önce yapılır. Bu nedenle, başka bir akışla eşzamanlı olarak oynatıldığında sesi kısılması gereken tüm akışlar ayrı çıkış cihazlarına yönlendirilmelidir. Böylece HAL, akışları karıştırmadan önce sesi kısabilir.
Önerilen ses kısma davranışı
Aşağıda, eşzamanlı etkileşimlerin olası olduğu ve bu nedenle ducking'in önerildiği durumlar verilmiştir.
Etkileşim | İşlem |
---|---|
EMERGENCY
| SAFETY hariç her şeyin sesini kısar veya kapatır.
|
SAFETY |
EMERGENCY hariç her şeyin sesini kısar. |
NAVIGATION |
SAFETY ve EMERGENCY hariç her şey |
CALL |
SAFETY , EMERGENCY ve NAVIGATION dışındaki her şeyi kapsar. |
VOICE |
Ördekler CALL_RING |
VEHICLE_SOUNDS |
Etkin sesin önemini ve diğer sesleri bastırıp bastırmayacağını siz belirlersiniz. |
MUSIC ve ANNOUNCEMENT |
Her şeyden kaçındı. SYSTEM_SOUND olarak çalınan dokunma etkileşimi tonları istisnadır.
|
Eğilirken dikkat edilmesi gereken noktalar
Rota izleme veya asistan gibi bazı uygulamalar ve hizmetler, işlemleri gerçekleştirmek için birden fazla oynatıcı kullanabilir. Veri akışı çıkış cihazlarından akmayı durdurduğunda, gezinme veya asistan uygulamasından bir sonraki oynatma başlamadan önce medyanın sesinin kısılmadan tam ses seviyesine dönmemesi için agresif ses kısma işleminden kaçının.
Yeterli izolasyona sahip birden fazla ses aşaması olan araçlarda, sesi azaltmak yerine arabanın farklı bölgelerine yönlendirebilirsiniz. Örneğin, navigasyon talimatları sürücünün koltuk başlığı hoparlörlerine yönlendirilirken kabin genelinde müzik çalmaya normal ses seviyesinde devam edilebilir.
Güvenlik açısından kritik sesler
Android 11'de HAL ses odağı API'leri kullanıma sunuldu. HAL, güvenlikle ilgili önemli seslerin diğer seslere göre öncelikli olmasını sağlar. HAL, USAGE_EMERGENCY
için ses odaklanmasını tutuyorsa Android'deki uygulama ve hizmetlerin ses çalmayacağı garanti edilmez. HAL, güvenlik açısından kritik seslerin çalınması için Android'deki hangi akışların karıştırılması veya kapatılması gerektiğini belirler.
Ses ayarları kullanıcı arayüzünü yapılandırma
AAOS, ses ayarları kullanıcı arayüzünü ses grubu yapılandırmasından ayırır. Bunlar, Ses grubu kazançlarını yapılandırma bölümünde açıklandığı şekilde yerleştirilebilir. Bu ayrım, birim gruplarının yapılandırması değiştiğinde herhangi bir değişiklik yapılmasına gerek kalmamasını sağlar.
Araba ayarları kullanıcı arayüzünde, packages/apps/Car/Settings/res/xml/car_volume_items.xml
tanımlanan her AudioAttributes.USAGE
ile ilişkili kullanıcı arayüzü öğeleri (başlık ve simge kaynakları) bulunur. Bu dosya, her bir VolumeGroup
içinde yer alan ilk tanınan kullanımla ilişkili kaynakları kullanarak tanımlanan VolumeGroups
öğesinin makul bir şekilde oluşturulmasını sağlar.
Örneğin, aşağıdaki örnekte VolumeGroup
, voice_communication
ve voice_communication_signalling
'yi içerecek şekilde tanımlanmaktadır. Araba ayarları kullanıcı arayüzünün varsayılan uygulaması, VolumeGroup
öğesini voice_communication
ile ilişkili kaynakları kullanarak oluşturur. Bunun nedeni, dosyadaki ilk eşleşmenin bu olmasıdır.
<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 özellikler ve değerler packages/apps/Car/Settings/res/values/attrs.xml
içinde tanımlanır. Ses düzeyi ayarları kullanıcı arayüzü, aşağıdaki VolumeGroup
tabanlı CarAudioManager API'lerini kullanır:
- Kaç kontrolün çizilmesi gerektiğini öğrenmek için
getVolumeGroupCount()
. - Alt ve üst sınırları elde etmek için
getGroupMinVolume()
vegetGroupMaxVolume()
değerlerini kullanın. getGroupVolume()
ile geçerli ses düzeyini alın.registerVolumeChangeObserver()
, birim değişikliklerinden haberdar edilir.
Araba hacmi grubu etkinliği
Ses güncelleme ve sessize alma düğmesinin otomotiv kullanım alanları, ses ayarları gibi belirli uygulamaların işlemlerini tanımlayabilecek bağlamsal temellere sahiptir. Araba ses yığınından gelen mevcut ses seviyesi ve geri aramayı sessize alma, sınırlı bağlamsal bilgi sağlar. Otomotiv kullanım alanlarına ve gelecekteki ölçeklenebilirliğe daha iyi hizmet vermek için Android 14'e CarVolumeGroupEvent eklendi. Her etkinlik üç kritik bilgi türü içerir:
CarVolumeGroupInfo
listeEventTypes
(bit eşlemli)ExtraInfos
liste
CarVolumeGroupInfo
Etkinlik geri çağırmasının alıcısı, etkilenen araba ses grubu bilgilerinin listesine kolayca erişebilir. Bu, uygulamanın en son durumu almak için Car Audio Framework'e ek çağrı yapması gerekmediği anlamına gelir. Kullanıcı arayüzünü veya dahili durumları güncellemek için alınan CarVolumeGroupInfos
'yı kullanabilir. Uygulamaların işini kolaylaştırmak için, araba ses grubu içinde değişen yönler de aşağıda açıklandığı gibi EventTypes
kapsamında sağlanır.
EventTypes
CarVolumeGroupInfo
'nın hangi yönünün değiştiğini tanımlar. Uygulamalar, değişiklikleri belirlemek ve gerekli işlemleri yapmak için bu bilgileri kullanabilir. Örneğin, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
, ilgili CarVolumeGroups
maksimum hacim artışı dizininin değiştiğini ve CarVolumeGroupInfo.getMaxVolumeGainIndex()
tarafından sorgulanabileceğini gösterir.
Aşağıdaki tabloda EventType
ile CarVolumeGroupInfo
arasındaki ilişki gösterilmektedir.
EventType | CarVolumeGroupInfo |
---|---|
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED |
CarVolumeGroupInfo.getVolumeGainIndex() |
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED |
CarVolumeGroupInfo.getMinVolumeGainIndex() |
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED |
CarVolumeGroupInfo.getMaxVolumeGainIndex() |
EVENT_TYPE_MUTE_CHANGED |
CarVolumeGroupInfo.isMuted() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED |
CarVolumeGroupInfo.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED |
CarVolumeGroupInfo.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED |
CarVolumeGroupInfo.getAudioAttributes() |
ExtraInfos
CarVolumeGroup
simgesinin neden değiştiği hakkında ek bilgiler sağlar. Uygulamalar, kullanıcıyı işlem yapmaya veya bildirim göndermeye yönlendirmek için bu bilgileri kullanarak ek bağlam sağlayabilir. Örneğin, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
, termal aşırı yüklenme nedeniyle etkin bir geçici zayıflamayı gösterir. Uygulama, kullanıcı sesi artırmaya çalıştığında kullanıcıyı bilgilendirebilir.
ExtraInfos
için herhangi bir süreç uygulamıyoruz. Süreci ExtraInfos
temelinde belirlemek sizin takdirinize bağlıdır. Örneğin, zayıflatma EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
nedeniyle etkinse kullanıcının sesi değiştirmesini önlemek için ses seviyesi çubuğu kullanıcı arayüzünü başlangıçta soluklaştırmayı da tercih edebilirsiniz.
Diğerleri, ses kısma özelliğinin etkin olduğunu belirten bir bildirim göstermeyi ve kullanıcının sesi değiştirmesine izin vermeyi tercih edebilir.
Aracın ses çerçevesi, önerilen ExtraInfos
'yi sağlamak için AudioControl HAL IAudioGainCallback
'ye bağlıdır. Daha fazla bilgi edinmek için Audio Gain Callback (Ses Kazancı Geri Arama) başlıklı makaleyi inceleyin.
CarVolumeGroupEvent
, araba ses sistemi çerçevesinin gelecekteki ihtiyaçlarını karşılayacak şekilde ölçeklendirilir. Yeni özellikleri CarVolumeGroupEvent
üzerinden desteklemeyi planlıyoruz. Uygulama geliştiricilerin grup ses seviyesi ve sessize alma değişikliklerini yönetmek için CarVolumeGroupEvent
kullanmalarını önemle tavsiye ederiz.
Car volume group event callback
Android 14, ayrıcalıklı ve platform uygulamalarının CarVolumeGroupEvents
kaydolup bildirim alması için yeni bir geri çağırma işlevi sunar.
Geri arama için kaydolmak üzere
CarAudioManager#registerCarVolumeGroupEventCallback()
simgesini kullanın.Geri arama kaydını silmek için
CarAudioManager#unregisterCarVolumeGroupEventCallback()
kullanın.
Bir uygulama yeni CarVolumeGroupEventCallback
ve eski CarVolumeCallback
ile kaydolursa CarVolumeGroupEventCallbacks
etkinliğine öncelik verilir.
Araba ses yığını artık CarVolumeCallback
'ı tetiklemiyor. Bu, aynı etkinlik için aynı uygulamaya yönelik yinelenen tetiklemeleri önler.
Grup sesini yönetmek ve sessize alma değişikliklerini yapmak için CarVolumeGroupEventCallback
kullanmanızı önemle tavsiye ederiz.
Ses kazancı geri araması
Android 13'ten itibaren AudioControl HAL, araba ses sisteminde yapılan değişiklikler nedeniyle ses seviyesi güncellemelerini yönetmek için eşzamansız bir geri çağırma tetikleyebilir.
HAL API
AudioControl @2.0 AIDL
AudioControl AIDL HAL'in 2.0 sürümünde aşağıdaki API eklenmiştir:
API | Amaç |
---|---|
IAudioControl#registerGainCallback |
AudioControl HAL ile IAudioGainCallback örneğini kaydeder. |
IAudioGainCallback#onAudioDeviceGainsChanged |
Ses kazancı yapılandırmasındaki değişiklikleri bildirmek için kullanılan eşzamansız geri çağırma. |
AudioControl HAL geri çağırması, nedenlerin ve ilgili AudioGainConfigInfo
listelerini içerir. Bu liste şunlardan oluşur:
- Bölge kimliği
- Cihaz bağlantı noktası adresi
- Hacim dizini > dizin, kısıtlanmış bir dizin veya güncelleme dizini olabilir.
Nedenler genel olarak şu şekilde sınıflandırılabilir:
- Kısıtlama nedenleri. Ses seviyesi ve sessize alma davranışında geçici değişiklik.
- Güncelleme nedenleri Ses davranışında kalıcı değişiklik.
Kısıtlama türleri
AudioControl
HAL AIDL
V3
itibarıyla desteklenen kısıtlama türleri şunlardır:
- Sesi kapat
- Blokaj
- Sınırlama
- Zayıflama
Etkin kısıtlama | Kullanıcı tarafından tetiklenen ses seviyesi değişikliği | Kullanıcı tarafından tetiklenen sesi kapatma/açma düğmesi |
---|---|---|
Sesi kapat | ❌ | ❌ (sesi aç) ✔ (sesi kapat) |
Blokaj | ❌ | ✔ |
Sınırlama | ❌ (sınır aşıldı) ✔ (sınırın altında) |
✔ |
Zayıflama | ✔ | ✔ |
Kısıtlamalar arasındaki öncelik sırası şöyledir: Sessize alma > Engelleme > Sınırlama > Zayıflatma.
Sessize alma kısıtlamaları
Sessize alma kısıtlamaları şunlardır:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Aracın ses çerçevesi, bu iki sessize alma durumunu dahili olarak korur:
Kullanıcıyı yoksayma. Kullanıcının isteğine bağlı olarak
CarAudioManager
veya önemli etkinlikler aracılığıyla etkinleştirilir.HAL mute.
AudioGain
geri arama yoluyla alınan sessize alma kısıtlamalarına göre değiştirilir.
Ayarlar uygulaması gibi dinleyiciler için, genel ses grubu sessize alma
(CarVolumeGroupInfo.isMuted()
) durumu, yukarıdaki sessize alma işlemlerinden herhangi birinin etkin olup olmadığına bağlıdır.
HAL sessize alma özelliği etkinleştirildiğinde, kısıtlama süresi boyunca tüm gelen ses düzeyi değişikliği ve grupta sessizliği kaldırma istekleri yoksayılır.
Etkileşim durumu: HAL sessize alma özelliği etkin ve kullanıcı, sessize alma düğmesinin açılmasını istiyor
HAL mute etkinleştirildiğinde ve User mute devre dışı bırakıldığında:
- Ses grubu genelinde sessize alma durumu
true
olarak değiştirildi. - Kullanıcının sessize alma isteği işlenir.
- Gerekçe: Kullanıcı gizliliğini korumak için kullanıcıların sessize alma isteklerine her zaman uyulmalıdır.
HAL sesi kapatma ve kullanıcı sesi kapatma etkinleştirildiğinde:
Ses grubu genelinde sessize alma durumu
true
olarak değiştirildi.Kullanıcının sessize alma özelliğini devre dışı bırakma istekleri
NOT
işlenir. Önbelleğe alınmış kullanıcı sessize alma durumu etkin kalır.Nedeni: Kullanıcının sesi açma istekleri yalnızca etkin kısıtlama yoksa kabul edilir.
Gerekçe: Önbelleğe alınmış kullanıcı sessize alma özelliğinin sessizliğinin kaldırılması, istenmeyen ses patlamasına neden olabilir ve kullanıcının güvenliğini tehlikeye atabilir. Bu durum, özellikle sessize alma durumu ateşleme döngüleri boyunca etkinse geçerlidir. Bu durumda kullanıcıların ses seviyesi algısı azalır.
Etkileşim durumu: Kullanıcı sessize alma özelliği değişmeden HAL sessize alma özelliği etkinleştiriliyor ve devre dışı bırakılıyor
HAL'ı kapatma/açma işlemi, ses grubu genelinde sesi kapatma durumunu değiştirir. Ancak, bu işlem kullanıcının sessize alma durumunu doğrudan güncellemez. Kullanıcı sessize alma özelliği devre dışı bırakıldığında ve etkinleştirmek için HAL sessize alma geri araması alındığında:
- Ses grubu genelinde sessize alma durumu
true
olarak değiştirildi. Kullanıcının ses seviyesini değiştirme istekleri, HAL sessize alma özelliği etkin durumdayken
NOT
işlenir.Nedeni: Kullanıcı, sessize alma özelliği etkin durumdayken sesi algılayamıyor. Ses değişikliğine izin vermek, ses patlamasına neden olabilir ve kullanıcı güvenliğini tehlikeye atabilir.
Nedeni: OEM tarafından beklenen davranış buysa birim uygulamaları, geri çağırma için kaydolabilir ve kullanıcı müdahalesi olmadan otomatik olarak sesi açabilir (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)).
Kullanıcı sessize alma özelliği devre dışıyken HAL sessize alma özelliği devre dışı bırakıldığında:
Ses grubu sessize alma durumu
false
olarak değiştirildi.Gerekçe: Sessiz durumunu yapışkan hale getirmek ve kullanıcının sesi açmasını istemek, sessiz durumları sık sık değiştirildiğinde kullanıcının gereksiz yere kesintiye uğramasına neden olabilir.
Kullanıcıların ses seviyesini değiştirme istekleri normal şekilde işlenir.
Blokaj
Engelleme kısıtlamaları şunlardır:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
Engelleme kısıtlamaları etkin olduğunda kullanıcıların:
- Ses düzeyi değişiklikleri işleme alınmaz.
- Sesi açma/kapatma işlemleri gerçekleştirilir.
Sınırlama
Sınırlama kısıtlamaları şunlardır:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Sınırlama kısıtlamaları etkin olduğunda kullanıcıların:
Ses düzeyini değiştirme:
- Sınırlama dahilinde işlenir
- Yukarıdaki sınırlamalar işlenmez.
Sesi açma/kapatma işlemleri gerçekleştirilir.
Zayıflama
Zayıflatma kısıtlamaları şunlardır:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Zayıflatma kısıtlamaları etkin olduğunda kullanıcıların:
Ses düzeyini değiştirme istekleri işlenir. Yeni mevcut ses düzeyi, önceki ses düzeyi yerine zayıflatılmış ses düzeyine ayarlanır. Gelecekteki ses değişiklikleri bu düzeyden yapılır.
Sesi açma/kapatma işlemi gerçekleştirilir.
Dizini güncelleme
Aşağıdaki işlem, zaman uyumsuz birim dizini güncellemesi olarak kabul edilir:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Bu nedenle, AudioControl HAL, birim grubu geçerli dizinini belirtilen dizine güncelleyebilir. Bu, öncelikle araç ses çerçevesinden gelen ses değişikliği isteği için ses sisteminden alınan geri bildirim olarak kullanılır. Dizin güncelleme işlemi, dizini senkronize etmek için uygulamalara CarVolumeGroupEvent
geri çağırma işleviyle de iletilir.
Örnekler
Kullanım alanı: Kullanıcı, ses düzeyi dizinini 30 olarak güncelliyor
Kullanıcı, ses dizinini 30 olarak değiştirmek için Ses uygulamasını kullanıyor.
Bu dizin, ses kazancına dönüştürülür ve Audio HAL'ye gönderilir.
Tedarikçilerin
Audio HAL
uygulamaları yeni ses kazancını alır ve ses sistemini (ör. harici amfi) günceller.Ses sistemi, ses seviyesinin yalnızca 15. indekse güncellendiğini belirtiyor (Android'in bilmediği nedenlerden dolayı).
Tedarikçi firmaların
AudioControl HAL
tetikleyicilerini uygulama şekilleri:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
Araç ses hizmeti, kalıcılık ve ses uygulamasına geri çağırmalar için kullanılan geri çağırmadan yeni dizini tüketir. Kullanıcı tarafından istenen dizin 30'dur. Ancak ses sistemi eşzamansız geri bildirimi, dizini 15 olarak günceller.
Kullanım alanı: Askıya alma modundan çıktıktan sonraki ilk ses çalma
Askıya alma işleminden önceki hacim dizini 95 gibi yüksek bir seviyeye ayarlanmış (aralık: [0-99]).
Android askıya alınır.
Android'i askıya alma (ör. devam ettirme):
Tedarikçi
Audio HAL/AudioControl HAL
, ses sistemine yerel olarak 30 güvenli dizini uygular.Tedarikçi
AudioControl HAL
, güvenli indeks için geri aramayı da tetikler:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
Aracın ses hizmeti, kalıcılık için kullanılan geri çağırmadan yeni dizini ve dizini senkronize eden ses uygulamasına yönelik kendi geri çağırmalarını kullanır. Askıya alınmadan önceki hacim dizini 95'tir. Ancak devam ettirildikten sonra bu dizin,
AudioControl HAL
uygulayıcısı tarafından güvenli bir ses seviyesi olan 30'a ayarlanır.
Dinamik birim yapılandırması
Bu özellik için aşağıdaki temel kullanım alanlarını göz önünde bulunduruyoruz:
Araç üretim hattı sonu (EOL) yapılandırması.
Otomobil üreticileri, araç ses sistemi kurulumuna göre EOL'de ses yapılandırmalarını güncellemeyi tercih eder. Bu işlem genellikle Android yazılımı görüntüsü güncellenmeden yapılan bir yan yüklemedir.
Otomobil üreticilerinin, servis programı sırasında ses yapılandırmasını güncellemesi gerekebilir.
Çalışma zamanı yapılandırması. Otomotiv ses sistemleri harici amplifikatör yapılandırmalarını destekler ve bu ECU'lar, başlatma sırasında sorgulanan ses aralığı yapılandırmalarına ev sahipliği yapabilir.
İsteğe bağlı yapılandırma Kullanıcıların belirli bir süre boyunca gelişmiş sinyal işlemeye abone olduğu, talep tabanlı ses özelliklerine yönelik artan ihtiyacı karşılamak için sunulur. Yeni ses aralığı yapılandırmaları, abonelik süresi boyunca geçerlidir.
Tasarım
Dinamik ses yapılandırması üç aşamada gerçekleştirilir:
Keşif Satıcı AudioControl HAL uygulaması, satıcıya ait özel bir IPC mekanizması aracılığıyla yeni ses aralığı güncellemelerini keşfeder.
Keşfedildikten sonra
AudioControl::IModuleChangeCallback
üzerinden bir geri çağırma oluşturulur.Güncelleme Aracın ses yığını, ses grubu durumlarını yeni ses aralıklarıyla günceller.
Ses aralığı güncellendikten sonra aynı ses düzeyini korumak için çaba gösterilir. Ancak dizin sınırların dışına çıkarsa mevcut hacim dizini güvenli bir değere ayarlanır. Örneğin, geri arama sırasında satıcı tarafından sağlanan varsayılan seviye.
Geri arama.
Ses grubu aralığı güncellendikten sonra, araba ses yığını
CarVolumeGroupEventCallback
üzerinden kaydedilen uygulamalara geri çağırma tetikler.CarVolumeGroupEvent
, güncellenmişCarVolumeGroupInfo
, Event-type (Etkinlik türü) [ne değişti?] ve Extra-info (Ek bilgi) [neden değişti?] değerlerini içerir.
Şekil 2. Dinamik ses düzeyi yapılandırması.
HAL API
AudioControl @ 3.0 AIDL
AudioControl AIDL HAL'nin 3.0 sürümünde aşağıdaki API'ler kullanıma sunulmuştur:
API | |
---|---|
IAudioControl#setModuleChangeCallback | AudioControl HAL ile bir IModuleChangeCallback örneği ayarlar. |
IAudioControl#clearModuleChangeCallback | Daha önce AudioControl HAL ile ayarlanan IModuleChangeCallback örneğini temizler. |
IModuleChangeCallback#onAudioPortsChanged | AudioPort'larda yapılan değişiklikleri bildirmek için geri arama |
Sıra
Dinamik birim yapılandırmasının sıra diyagramı aşağıda gösterilmektedir.
3.Şekil Dinamik birim yapılandırması için adım sırası diyagramı.
Temel yönler
Bu özelliği optimize etmek için aşağıdakileri göz önünde bulundurun.
Geri çağırma işlevinin bir parçası olarak sağlanan AudioPort'lar, Automotive BUS tanımıyla eşleşmelidir:
- Cihaz bağlantı noktası.
IN_DEVICE
,OUT_DEVICE
- Bağlantı
BUS
- Adres. Ses HAL tanımında tanımlanır.
- Kazanç modu.
JOINT
- Cihaz bağlantı noktası.
Tedarikçiler, Audio HAL politikasında ses aralığı tanımlarının bir üst kümesini tanımlamalı ve geri çağırma işlevini kullanarak bunu araç varyantları için özelleştirmelidir. Daha fazla bilgi için
IModuleChangeCallbac
AIDL tanımına bakın.Aynı ses seviyesi grubuna birden fazla ses BUS'ı ait olduğunda her birinin mutlaka aynı ses seviyesi aralığı tanımlarına sahip olması gerekir. Aksi takdirde, araç ses çerçevesi yeni ses aralığı tanımını reddeder.