Ses seviyesi yönetimi, CarAudioService
içinde bulunur. Bu API, ses seviyelerinin yazılımda değil, HAL'in altında bir donanım amplifikatörü tarafından uygulanması beklentisiyle sabit ses seviyeleri kullanır. CarAudioService
, bir ses seviyesi grubuyla ilişkili tüm cihazlara aynı kazançları uygulamak için çıkış cihazlarını ses seviyesi gruplarına ayırır.
Sabit birimler
AAOS uygulamaları, ses seviyesini kontrol etmek için yazılım karıştırıcı yerine donanım amplifikatörü kullanı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 karıştırıcısında ses seviyesini akış türüne göre değiştirmek için AudioManager.setStreamVolume()
'yi çağırabilir. Bu, diğer uygulamalar üzerindeki olası etkiler ve yazılım karıştırıcıdaki ses azaltmanın, donanım amplifikatörü tarafından alındığında sinyaldeki önemli bit sayısının azalmasına neden olabileceği gerçeği nedeniyle her zaman istenmeyebilir.
Ses seviyesi grupları
Ses grupları, bir ses bölgesindeki cihaz koleksiyonunun ses düzeylerini yönetir. Her ses grubu için ses seviyesi bağımsız olarak kontrol edilebilir. Elde edilen kazançlar, ilişkili cihazlarda aracın amplifikatörü tarafından uygulanacak şekilde yapılandırılır. Ses ayarları kullanıcı için kalıcı olur ve kullanıcı oturum açtığında yüklenir.
Hacim 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 ses grubu, ilişkili adreslere sahip bir veya daha fazla çıkış cihazı içermelidir. Adresler, audio_policy_configuration.xml
dosyasında tanımlanan çıkış cihazlarına karşılık gelmelidir.
Hacim grubu kazançlarını yapılandırma
Her ses grubu, minimum, maksimum ve varsayılan kazanç değerlerinin yanı sıra ses grubuyla ilişkili cihazlar için audio_policy_configuration.xml
'te yapılandırılan değerlere dayalı bir adım boyutuna sahiptir.
<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>
Hacim grubu, başlatma sırasında 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 cihazlar için 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 grubuyla ilişkili bir cihaz için desteklenen aralığın dışında bir ses grubu kazancı ayarlanabilir. Bu durumda, ilgili cihaz için kazanç, ses grubu değerinin aralığın altında veya üstünde olup olmadığına bağlı olarak cihazın minimum veya maksimum kazanç değerine ayarlanır.
Ses grubu tanımlayıcılar
Ses grupları, XML dosyasında tanımlanan sırada çalışma zamanında tanımlanır.
Ses bölgesindeki kimlikler 0
ile N-1
arasındadır. Burada N
, söz konusu bölgedeki ses seviyesi gruplarının sayısıdır. Bu nedenle, cilt 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
olmadan groupId
alan tüm API'ler varsayılan olarak birincil ses bölgesini kullanır.
Çoklu bölgeli birim yönetimi
Her ses bölgesinin bir veya daha fazla ses seviyesi grubuna sahip olması ve her ses seviyesi grubunun yalnızca tek bir ses bölgesiyle ilişkilendirilmesi gerekir. Bu ilişki, car_audio_configuration.xml
kapsamında tanımlanır. Daha fazla bilgi için Ses seviyesi gruplarını tanımlama bölümündeki yukarıdaki örneği inceleyin.
Her bölgenin mevcut ses seviyeleri, ilgili bölgeyle ilişkili kullanıcı için korunur. Bu ayarlar bölgeye özeldir. Yani bir kullanıcı birincil bölgeyle ilişkili bir ekranda oturum açıp daha sonra ikincil ses bölgesiyle ilişkili bir bölgede oturum açarsa ilk bölge için yüklenen ve kalıcı olan ses seviyeleri ikincil bölgeninkilerden farklıdır.
Minimum ve maksimum etkinleştirme hacmi
Android 15, araç ses sistemlerinde daha fazla güvenlik ve kullanıcı konforu için ses grubu dizinleri üzerinde kontrol sunar. Bu, araç ses yapılandırmasında yapılandırılmış minimum ve maksimum etkinleştirme ses seviyelerinin kullanılmasıyla elde edilir (Ses seviyesi gruplarını tanımlama bölümüne bakın). Araç Servisi RRO'larında audioUseMinMaxActivationVolume
değerini true
olarak ayarlayarak bu özelliği etkinleştirebilirsiniz.
activationVolumeConfigs
içinde, her biri farklı bir minimum ve maksimum etkinleştirme yapılandırmasını temsil eden birden fazla activationVolumeConfig
girişi tanımlayabilirsiniz. Her activationVolumeConfig
:
- Daha sonra ses seviyesi grubunda (
group
) referans verilebilmesi için araç ses sistemi yapılandırma dosyasında benzersiz birname
içermelidir. - Yalnızca bir
activationVolumeConfigEntry
içermelidir.
Her activationVolumeConfig
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 önyükleme işleminden sonra ses grubu grubunda yeni etkinleştirilen ilk oynatma işlemi için geçerlidir.onSourceChanged
: Yalnızca bir ses grubu üzerinde değiştirilmiş bir uygulama veya UID kaynağıyla yeni etkinleştirilen oynatma işlemi için geçerlidir.onPlaybackChanged
: Ses grubundaki yeni etkin her oynatmaya uygulanır.
CarAudioService
, şu anda etkin olan aşağıdaki ses alt bileşenlerini izleyerek minimum ve maksimum etkinleşmeyi yönetir:
- Mevcut etkin oynatma kanalları
- Mevcut arama durumu
- Ses Kontrol HAL'inden gelen ses odak isteğinin Android dışında etkin bir ses oynatmanın gerçekleştiğini işaret ettiği mevcut ses odak isteği
Aşağıdaki resimde, minimum ve maksimum etkinleştirme hacmi yönetimine genel bir bakış gösterilmektedir:
Şekil 1. Minimum ve maksimum etkinleştirme ses hacmi yönetimi etkin ses veri yolları.
Belirtilen minActivationVolumePercentage
, maxActivationVolumePercentage
, minimum ve maksimum hacim artışı dizini ile her hacim grubu için minimum ve maksimum etkinleştirme hacmi artışı dizinlerini hesaplayabilirsiniz. CarAudioService
yeni etkin oynatmaları izler ve aşağıdaki koşullar altında minimum ve maksimum etkinleştirme hacmini uygular:
- Çağırma türü eşleşmeleri: Oynatma işleminin etkinleşme türü (Ses Yöneticisi, Ses Kontrolü HAL'i veya Telefon Yöneticisi'nden türetilir), ses grubuyla ilişkili
activationVolumeConfigEntry
içinde belirtileninvocationType
ile eşleşmelidir. Hacim dizini aralık dışında: Hacim grubunun mevcut hacim artışı dizini, tanımlanan etkinleştirme hacmi artışı dizini aralığının dışında olmalıdır. Daha açık belirtmek gerekirse aşağıdakilerden biri doğrudur:
Dizin, hesaplanan minimum etkinleştirme hacmi artışı dizinden düşüktür.
VEYA
Dizin, hesaplanan maksimum etkinleştirme hacmi artışı dizininden yüksek.
Etkinleştirme eşleşmesi olduğunda, ses grubunun ses kazancı dizini aşağıdakilerden birine ayarlanır:
Minimum etkinleştirme hacmi artışı indeksi, minimum etkinleştirme hacmi artışı indeksinden düşükse
VEYA
Maksimum etkinleştirme hacmi artışı indeksinden yüksekse maksimum etkinleştirme hacmi artışı indeksi
Ayrıca, EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED
etkinlik türüne sahip bir araç ses grubu etkinliği, kayıtlı tüm ses grubu etkinliği geri çağırmalarına gönderilir.
Ses tuşu etkinliklerini işleme
Android, ses seviyesi kontrolü için aşağıdakiler gibi çeşitli tuş kodları tanımlar:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
Android varsayılan olarak ses tuşu etkinliklerini uygulamalara yönlendirir. Otomotiv uygulamalarında bu önemli etkinliklerin CarAudioService
tarafından işlenmesi zorunlu kılınmalıdır. CarAudioService
daha sonra uygun şekilde setGroupVolume
veya setMasterMute
'yi çağırır. Bu davranışı zorlamak için config_handleVolumeKeysInWindowManager
işaretini true
olarak ayarlayın:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
Ses seviyesi önemli etkinlikleri şu anda hangi bölge için tasarlandıklarını ayırt edemez ve hepsinin 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 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
adresinde tanımlanan sabit bir sıralamaya göre belirlenir.
Karartma ve denge
AudioControl HAL'ın her iki sürümü de araçta fade ve denge ayarlamak için API'ler içerir. CarAudioManager için ilgili sistem API'leri, değerleri AudioControl HAL'e iletir. Bu API'ler için android.car.permission.CAR_CONTROL_AUDIO_VOLUME
gereklidir. AudioControl API'leri şunlardır:
setBalanceTowardRight(float value)
, hoparlör sesini aracın sağ (+) veya sol (-) tarafına kaydırır.- 0,0 merkezdedir.
- +1,0 tamamen doğrudur
- -1,0 tamamen solda
- -1 ile 1 arasındaki aralığın dışındaki değerler hata olarak değerlendirilir.
setFadeTowardFront(float value)
, hoparlör sesini aracın ön tarafına (+) veya arka tarafına (-) doğru kaydırır.- 0,0 merkezdedir.
- +1.0 tamamen ileri
- -1,0 tamamen arkaya doğrudur.
- -1 ile 1 arasındaki aralığın dışındaki değerler hata olarak değerlendirilir.
Bu değerlerin nasıl uygulanması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, çıkış cihazlarına ses efektleri uygulama desteği de sunmuştur. Bu sayede, sesin yavaşça azaltılması ve dengesi, bu API'ler yerine uygun çıkış cihazlarındaki ses efektleriyle yönetilebilir.
Sesi kısma
Ses kısma, araç aynı anda çalan başka bir sesin daha net duyulması için bir yayındaki kazancı azalttığında gerçekleşir. AAOS'te ses kısma özelliği HAL tarafından uygulanır. Android, işletim sisteminin dışındaki sesler üzerinde hiçbir kontrole sahip değildir. Android 11'de HAL'in ses azaltma kararları vermesi için kullanabileceği temel bilgi, iki çıkış cihazının her ikisinde de etkin yayın olup olmadığıdır.
Ne zaman eğilmelidir?
Ses azaltmanın HAL tarafından nasıl ele alınacağını belirlemek OEM'ye bağlıdır ancak aşağıdaki yönergeleri uygulamanızı öneririz.
Android'de birden fazla yayının oynatılması genellikle iki uygulama veya hizmetin aynı anda ses odağına sahip olduğunda gerçekleşir. Android'in ne zaman eşzamanlı odaklanma izni verebileceğini öğrenmek için Kısıtlama türleri bölümündeki etkileşim matrisine bakın. Araç 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 ses seviyesi azaltılması gereken tüm akışlar, HAL'in bunları karıştırmadan önce ses seviyesini azaltabilmesi için ayrı çıkış cihazlarına yönlendirilmelidir.
Önerilen eğme davranışı
Aşağıda, ses azaltmanın önerildiği olası eşzamanlı etkileşimler verilmiştir.
Etkileşim | İşlem |
---|---|
EMERGENCY
| SAFETY hariç her şeyi engeller veya sessize alır
|
SAFETY |
EMERGENCY hariç her şeyi engeller |
NAVIGATION |
SAFETY ve EMERGENCY hariç her şeyi atlar |
CALL |
SAFETY , EMERGENCY ve NAVIGATION dışındaki her şeyi atlar |
VOICE |
Ördekler CALL_RING |
VEHICLE_SOUNDS |
Etkin sesin önemini ve diğer sesleri kapatıp kapatmayacağını siz belirlersiniz. |
MUSIC ve ANNOUNCEMENT |
Her şeyden kaçtı. İstisnalar,
SYSTEM_SOUND olarak çalınan dokunma etkileşimi tonlarıdır.
|
Sessiz modu kullanırken dikkat edilmesi gereken noktalar
Navigasyon veya asistan gibi bazı uygulamalar ve hizmetler, işlem yapmak için birden fazla oynatıcı kullanabilir. Bir veri akışı çıkış cihazlarından akmayı durdurduğunda medya ses seviyesinin tam ses seviyesine dönmesini önlemek için ses seviyesini azaltma işlemini agresif bir şekilde yapmayın. Bu sayede, navigasyondan veya bir yardımcı uygulamadan sonraki oynatma işlemine başlamadan önce ses seviyesi azaltılır.
Yeterince iyi yalıtılmış birden fazla ses aralığına sahip araçlarda, sesin sesini azaltmak yerine sesi aracın farklı bölgelerine yönlendirebilirsiniz. Örneğin, kabinde normal ses seviyesinde müzik çalmaya devam ederken navigasyon talimatları sürücünün kafalık hoparlörlerine yönlendirilebilir.
Güvenlik açısından kritik sesler
Android 11'de HAL ses odak API'leri kullanıma sunulmuştur. HAL, güvenlik açısından kritik seslere diğer seslere göre öncelik verilmesini sağlar. HAL, USAGE_EMERGENCY
için ses odağını elinde 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 sessize alınması 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 örtüşebilir. Bu ayrım, birim gruplarının yapılandırması değişirse herhangi bir değişiklik yapılmasını önler.
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ü öğelerini (başlık ve simge kaynaklarını) içerir. Bu dosya, her VolumeGroup
içinde bulunan 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
içerecek şekilde tanımlanmıştır. Araba ayarları kullanıcı arayüzünün varsayılan uygulaması, dosyada ilk eşleşme olduğu için voice_communication
ile ilişkili kaynakları kullanarak VolumeGroup
öğesini 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 özellikler ve değerler packages/apps/Car/Settings/res/values/attrs.xml
içinde tanımlanır. Ses ayarları kullanıcı arayüzü, aşağıdaki VolumeGroup
tabanlı CarAudioManager API'lerini kullanır:
getVolumeGroupCount()
'e giderek kaç kontrol çizilmesi gerektiğini öğrenin.getGroupMinVolume()
vegetGroupMaxVolume()
alt ve üst sınırları elde etmek için.getGroupVolume()
komutunu kullanarak mevcut ses seviyesini öğrenebilirsiniz.registerVolumeChangeObserver()
adresine gönderin.
Araba sesi grubu etkinliği
Ses güncellemesi 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 grubu tarafından sağlanan mevcut ses seviyesi ve sessize alma geri çağırma işlevi, bağlama dayalı sınırlı 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ünü içerir:
CarVolumeGroupInfo
öğesinin listesiEventTypes
(bit eşlemeli)ExtraInfos
öğesinin listesi
CarVolumeGroupInfo
Etkinlik geri çağırmasının alıcısının, etkilenen araç ses grubu bilgilerinin listesine hazır erişimi vardır. Bu, uygulamanın en son durumu almak için Car Audio çerçevesine ek çağrı yapması gerekmediği anlamına gelir. Kullanıcı arayüzünü veya dahili durumları güncellemek için yalnızca alınan CarVolumeGroupInfos
değerini kullanabilir. Uygulamaların daha kolay kullanabilmesi için bir araç ses grubuyla ilgili değişen özellikler, aşağıda açıklandığı şekilde EventTypes
kapsamında da sağlanır.
EventTypes
CarVolumeGroupInfo
öğesinin hangi yönünün değiştiğini tanımlar. Uygulamalar, değişiklikleri tespit etmek ve gerekli işlemleri yapmak için bu özelliği kullanabilir. Örneğin, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
, ilgili CarVolumeGroups
maksimum hacim artışı dizininin değiştiğini ve CarVolumeGroupInfo.getMaxVolumeGainIndex()
tarafından sorgulanabilir olduğunu 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
değerinin neden değiştiğiyle ilgili ek bilgiler sağlar. Uygulamalar, kullanıcıyı işlem yapmaya veya bilgilendirmeye yönelik ek bağlam sağlamak için bu bilgileri kullanabilir. Örneğin, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
termal aşırı yüklenme nedeniyle etkin geçici bir zayıflama olduğunu gösterir. Uygulama, sesi artırmaya çalışan kullanıcıyı bilgilendirebilir.
ExtraInfos
için herhangi bir işlem uygulamıyoruz. ExtraInfos
'ye göre süreci belirleme konusunda takdir sizindir. Örneğin, EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
nedeniyle ses azaltma etkinse kullanıcının sesi değiştirmesini önlemek için ses çubuğu kullanıcı arayüzünü başlangıçta karartmayı da seçebilirsiniz.
Diğerleri, ses azaltmanın etkin olduğunu belirten bir pop-up göstermeyi ve kullanıcının sesi değiştirmesine izin vermeyi tercih edebilir.
Araç ses çerçevesi, önerilen ExtraInfos
'yi sağlamak için AudioControl HAL IAudioGainCallback
'e bağlıdır. Daha fazla bilgi edinmek için Ses Kazancı Geri Çağırma başlıklı makaleyi inceleyin.
CarVolumeGroupEvent
, araç ses çerçevesinin gelecekteki ihtiyaçlarını karşılayacak şekilde ölçeklendirilir. Yeni özellikleri yalnızca CarVolumeGroupEvent
üzerinden desteklemeyi planlıyoruz. Uygulama geliştiricilerin grup ses düzeyini ve sessizleştirme değişikliklerini yönetmek için CarVolumeGroupEvent
kullanmasını önemle tavsiye ederiz.
Araç ses grubu etkinliği geri çağırma işlevi
Android 14, ayrıcalıklı ve platform uygulamalarının kaydolup CarVolumeGroupEvents
hakkında bildirim alması için yeni bir geri çağırma işlevi sağlar.
Geri arama için kaydolmak üzere
CarAudioManager#registerCarVolumeGroupEventCallback()
Geri aramanın kaydını iptal etmek için
CarAudioManager#unregisterCarVolumeGroupEventCallback()
Bir uygulama yeni CarVolumeGroupEventCallback
ve eski CarVolumeCallback
ile kaydolduğunda CarVolumeGroupEventCallbacks
etkinliğine öncelik verilir.
Araç ses grubu artık CarVolumeCallback
'ü tetiklemiyor. Bu sayede, aynı etkinlik için aynı uygulamaya yinelenen tetikleyiciler gönderilmez.
Grup ses düzeyini yönetmek ve sessizleştirme değişikliklerini kontrol etmek için CarVolumeGroupEventCallback
simgesini kullanmanızı önemle tavsiye ederiz.
Ses kazancı geri çağırma işlevi
Android 13'ten beri AudioControl HAL, araç ses sisteminde yapılan değişiklikler nedeniyle ses seviyesi güncellemelerini yönetmek için ayarsız geri çağırma işlevi tetikleyebilir.
HAL API
AudioControl @2.0 AIDL
AudioControl AIDL HAL'ın 2.0 sürümü aşağıdaki API'yi ekler:
API | Amaç |
---|---|
IAudioControl#registerGainCallback |
AudioControl HAL ile bir IAudioGainCallback örneği kaydeder. |
IAudioGainCallback#onAudioDeviceGainsChanged |
Ses kazancı yapılandırmasında yapılan değişiklikleri bildirmek için ayarsız geri çağırma işlevi. |
AudioControl HAL geri çağırma işlevi, nedenlerin listelerini ve ilgili AudioGainConfigInfo
öğesini içerir. AudioGainConfigInfo
şuradan 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 düzeyinde ve sessize alma davranışında geçici değişiklik.
- Nedeni güncelleyin. 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:
- 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 sessize alma açma/kapatma düğmesi |
---|---|---|
Kapat | ❌ | ❌ (sesi aç) ✔ (sesi kapat) |
Blokaj | ❌ | ✔ |
Sınırlama | ❌ (sınırın üzerinde) ✔ (sınırın altında) |
✔ |
Zayıflama | ✔ | ✔ |
Kısıtlamalar arasında öncelik sırası şu şekildedir: Sesi kapatma > Engelleme > Sınırlama > Zayıflatma.
Sessize alma kısıtlamaları
Sessize alma kısıtlamaları şunlardır:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Araç ses sistemi çerçevesi, sessiz modu dahili olarak şu iki durumda tutar:
Kullanıcıyı susturma
CarAudioManager
veya önemli etkinlikler aracılığıyla kullanıcının isteğine göre açılıp kapatılır.HAL sessiz.
AudioGain
geri çağırma işlevi aracılığıyla alınan sessize alma kısıtlamalarına göre açılıp kapatılır.
Ayarlar uygulaması gibi dinleyiciler için ses grubu genel sessize alma (CarVolumeGroupInfo.isMuted()
) durumu, yukarıdaki sessize alma işlemlerinden birinin etkin olup olmadığına bağlıdır.
HAL sessize alma özelliği etkinleştirildiğinde, gelen tüm ses düzeyi değişikliği ve grup sessize alma istekleri kısıtlama süresi boyunca yok sayılır.
Etkileşim örneği: HAL sessize alma etkin ve kullanıcı sessize alma düğmesini açmak istiyor
HAL sessize alma etkinleştirildiğinde ve kullanıcı sessize alma devre dışı bırakıldığında:
- Ses grubu genel sessize alma durumu
true
olarak değiştirilir. - Kullanıcının sessize alma özelliğini etkinleştirme istekleri işlenir.
- Neden: Kullanıcı gizliliğini korumak için kullanıcıların sessize alma istekleri her zaman dikkate alınmalıdır.
HAL sessize alma özelliği ve kullanıcı sessize alma özelliği etkinleştirildiğinde:
Ses grubu genel sessize alma durumu
true
olarak değiştirilir.Kullanıcının sessize alma özelliğini devre dışı bırakma istekleri
NOT
işlenir. Önbelleğe alınan kullanıcı sessize alma durumu etkin kalır.Neden: Kullanıcının sesli mesaj gönderme isteklerini yalnızca etkin kısıtlama yoksa kabul ederiz.
Neden: Önbelleğe alınmış kullanıcının sesini açmak, istenmeyen ses patlamalarına neden olabilir ve kullanıcı güvenliğini tehlikeye atabilir. Bu durum, özellikle açma/kapatma döngülerinde sessiz mod etkinse geçerlidir. Bu durumda kullanıcıların ses seviyesi algısı azalır.
Etkileşim örneği: Kullanıcı sessize alma özelliğinde değişiklik olmamasına rağmen HAL sessize alma özelliği etkinleştirildi ve devre dışı bırakıldı
HAL sessize alma düğmesini açmak, ses grubu genel sessize alma durumunu değiştirir. Ancak bu işlem, kullanıcının sessize alma durumunu doğrudan güncellemez. Kullanıcının sesi kapalıyken HAL sessiz modunu etkinleştirmek için geri çağırma işlevi alındığında:
- Ses grubu genel sessize alma durumu
true
olarak değiştirilir. Kullanıcının ses seviyesini değiştirme istekleri, HAL sessize alma özelliği etkinken
NOT
işlenir.Neden: Kullanıcı, sessize alma özelliği etkinken sesi algılayamaz. Ses seviyesinin değiştirilmesine izin vermek, sesin aniden yükselmesine neden olarak kullanıcı güvenliğini tehlikeye atabilir.
Neden: Ses uygulamaları, geri çağırmalara kaydolabilir ve OEM tarafından beklenen davranış bu ise kullanıcı müdahalesi olmadan sessiz modu kaldırma (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) işlemini otomatik olarak tetikleyebilir.
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ştirilir.Neden: Sessiz durumunun yapışkan hale getirilmesi ve kullanıcıdan sesi açmasını istemek, sessiz durumu sık sık değiştiğinde kullanıcının gereksiz yere kesintiye uğramasına neden olabilir.
Kullanıcılardan gelen ses seviyesi 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ı etkinken kullanıcıların aşağıdaki işlemleri yapması engellenir:
- Ses düzeyi değişiklikleri işleme alınmaz.
- Sesi aç/kapat işlemleri işlenir.
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ı etkinken kullanıcılardan gelen aşağıdaki istekler:
Ses düzeyini değiştirme:
- Sınır dahilinde olanlar işlenir
- Yukarıdaki sınırlamalar işlenmez.
Sesi aç/kapat işlemleri işlenir.
Zayıflama
Zayıflama kısıtlamaları şunlardır:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Zayıflatma kısıtlamaları etkinken kullanıcılardan gelen aşağıdaki istekler:
Ses düzeyini değiştirme işlemleri işlenir. Yeni mevcut ses seviyesi, eski ses seviyesi yerine azaltılmış ses seviyesine ayarlanır. Gelecekte ses düzeyinde yapılacak değişiklikler bu düzeyden yapılır.
Sesi aç/kapat işlemi işlenir.
Dizine ekleme güncellemesi
Aşağıdakiler, zaman uyumsuz cilt dizini güncellemesi olarak kabul edilir:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Bu nedenle, AudioControl HAL ses grubu geçerli dizini belirtilen dizinle güncelleyebilir. Bu değer, öncelikle araç ses sistemi çerçevesinden gelen ses seviyesi değişikliği isteği için ses sisteminden geri bildirim olarak kullanılır. Dizin güncellemesi, dizini senkronize etmek için CarVolumeGroupEvent
geri çağırma olarak da uygulamalarla paylaşılır.
Örnekler
Kullanım alanı: Kullanıcı, ses düzeyi dizini değerini 30 olarak günceller
Kullanıcı, ses indeksini 30'a değiştirmek için Ses uygulamasını kullanır.
Bu dizin, ses kazancına dönüştürülür ve Audio HAL'e gönderilir.
Tedarikçi firmaların
Audio HAL
uygulamalarında yeni ses kazancı alınır ve ses sistemi (harici amplifikatör gibi) güncellenir.Ses sistemi, ses seviyesinin yalnızca 15. dizinle güncellendiğini yanıtlıyor (Android'in bilmediği nedenlerden dolayı).
AudioControl HAL
tetikleyicilerinin tedarikçi firma uygulamaları:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
Araba ses hizmeti, kalıcılığa ve ses uygulamasına geri çağırmalar için kullanılan geri çağırmadaki 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 sonra ilk ses çalma
Askıya alınmadan önceki ses seviyesi dizini 95 gibi yüksek bir seviyeye (aralık: [0-99]) ayarlanır.
Android askıya alınır.
Android askıya alındıktan sonra (örneğin, devam ettir):
Tedarikçi firma
Audio HAL/AudioControl HAL
, ses sistemine yerel olarak 30 değerinde güvenli bir dizin uygular.Tedarikçi firma
AudioControl HAL
, güvenli dizin için geri aramayı da tetikler:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
Araba ses hizmeti, kalıcılığa yönelik olarak kullanılan geri çağırma işlevinden yeni dizini ve dizini senkronize eden ses uygulamasına yönelik kendi geri çağırma işlevlerini tüketir. Askıya alınmadan önceki ses düzeyi dizini 95'tir. Ancak devam etmeden sonra bu dizin,
AudioControl HAL
uygulayıcısı tarafından 30 değerinde güvenli bir ses seviyesine ayarlanır.
Dinamik ses düzeyi yapılandırması
Bu özellik için aşağıdaki birincil kullanım alanlarını göz önünde bulunduruyoruz:
Aracın kullanımdan kaldırma (EOL) yapılandırması.
Otomobil üreticileri, ses sistemi kurulumuna göre araç ses sistemi kurulumuna göre ses seviyesi yapılandırmalarını son kullanım tarihinde güncellemeyi tercih eder. Genellikle bu, Android SW imajını güncellemeden 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, önyükleme sırasında sorgulanan ses aralığı yapılandırmalarını barındırabilir.
İ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 üzerine ses özelliklerine yönelik artan ihtiyacı desteklemek için sunulur. Yeni ses aralığı yapılandırmaları, abonelik süresi boyunca geçerlidir.
Tasarım
Dinamik ses düzeyi yapılandırması üç aşamada gerçekleştirilir:
Discovery Tedarikçi firmanın AudioControl HAL uygulaması, tedarikçi firmaya ait özel bir IPC mekanizması aracılığıyla yeni ses seviyesi aralığı güncellemelerini keşfeder.
Tespit edildikten sonra
AudioControl::IModuleChangeCallback
üzerinden geri arama yapılır.Güncelleme. Araç ses grubu, ses grubu durumlarını yeni ses aralıkları ile günceller.
Ses aralığı güncellendikten sonra aynı ses düzeyinin korunması için gereken çaba gösterilir. Ancak dizin sınırları dışına çıkarsa mevcut ses seviyesi dizini güvenli bir değere ayarlanır. Örneğin, geri arama sırasında tedarikçi tarafından sağlanan varsayılan seviye.
Geri arama
Ses grubu aralığı güncellemelerinden sonra araç ses grubu,
CarVolumeGroupEventCallback
üzerinden kayıtlı uygulamalara geri çağırma işlemi tetikler.CarVolumeGroupEvent
, güncellenenCarVolumeGroupInfo
, Etkinlik-türü (ne değişti) ve Ek-bilgi (neden değişti) bilgilerini 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 IModuleChangeCallback örneği oluşturur. |
IAudioControl#clearModuleChangeCallback | Daha önce AudioControl HAL ile ayarlanan IModuleChangeCallback örneğini temizler. |
IModuleChangeCallback#onAudioPortsChanged | AudioPorts'ta yapılan değişiklikleri bildirmek için geri çağırma |
Sıra
Dinamik hacim yapılandırmasının ardışık düzen şeması aşağıda gösterilmiştir.
Şekil 3. Dinamik ses düzeyi yapılandırması için akış şeması.
Önemli hususlar
Bu özelliği optimize etmek için aşağıdakileri göz önünde bulundurun.
Geri çağırma işlevi kapsamında sağlanan AudioPorts, AutomotiveBUS tanımı ile eşleşmelidir:
- Cihaz bağlantı noktası.
IN_DEVICE
,OUT_DEVICE
- Bağlantı.
BUS
- Adres. Ses HAL tanımında tanımlanmıştır
- Kazanç modu.
JOINT
- Cihaz bağlantı noktası.
Tedarikçi firmalar, Audio HAL politikasında ses aralığı tanımlarının bir süper 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 grubuna birden fazla ses otobüsü aitse her birinin ses aralığı tanımı aynı olmalıdır. Aksi takdirde, araç ses çerçevesi yeni ses aralığı tanımını reddeder.