Android 14'teki yeni araba OEM eklenti hizmetleri, bazı araba bileşenlerinin yapılandırılmasına olanak tanır. Özellikle ses için, OEM'lerin AAOS cihazlarında ses yönetimini esnek bir şekilde yapılandırmasına olanak tanıyan üç yeni eklenti hizmeti tanıtıldı:
- Ses odak kontrolü
- Ses seviyesi ve sessiz kontrolü
- Ses Azaltma kontrolü
Araç eklentisi hizmet mimarisi
Aşağıdaki şekil, araç hizmetlerine ve bunların OEM araç hizmetiyle ilişkilerine genel bir bakış sunmaktadır. Uygulama süreçlerine ve araç servis sürecine benzer şekilde, OEM araç servis süreci de kendi süreç alanını kaplar.
Araba servisi, config_oemCarService
tanımlanan bileşeni bularak OEM araba servisini başlatır. Yapılandırma boşsa, OEM hizmeti mevcut değildir ve hiçbir hizmet başlatılmaz. Bileşen OemCarService'i genişletmelidir. Araç ses sistemi hizmetinin, araç ses sistemi OEM hizmetini alabilmesi için API'lerin üzerine yazması gerekir:
public final class OemCarServiceImp extends OemCarService {
@Override
public OemCarAudioFocusService getOemAudioFocusService();
@Override
public OemCarAudioDuckingService getOemAudioDuckingService();
@Override
public OemCarAudioVolumeService getOemAudioVolumeService();
}
Örneğin , packages/services/Car/tests/OemCarServiceTestApp
içinde tanımlanan referans test uygulamasına bakın.
Hizmet, araç hizmeti tarafından başlatılsa bile, araç ses hizmeti için mevcut olan izinleri otomatik olarak devralmaz. Bu nedenle, OEM hizmetlerinin gerektirdiği her türlü izin, uygun mekanizmayla alınmalıdır. Örneğin, packages/services/Car/data/etc/com.android.car.oemcarservice.testapp.xml
bakın.
OEM hizmet mimarisiyle araç ses hizmeti
AAOS'ta araç ses hizmeti şu eylemleri yönetir:
- Ses yönlendirme
- Ses odağı
- Sesin kısılması
- Ses seviyesi ve sessiz
Android 14'ten önce bu davranış büyük ölçüde statikti ve çok sınırlı sayıda durumda olsa da yalnızca ayarlar aracılığıyla değiştirilebiliyordu. Android 14, araç ses hizmetinin aşağıdakileri yöneten OEM tanımlı bir bileşenle iletişim kurması için bir mekanizma sundu:
- Ses odağı
- Sesin kısılması
- Ses seviyesi ve sessiz
Aşağıdaki şekilde araç ses hizmeti ve araç OEM hizmeti için basitleştirilmiş bir mimari gösterilmektedir. Araç ses hizmeti, ses davranışını yönetmek için araç OEM ses hizmetini arayabilecek farklı kancalar tanımlar. İkincisi yalnızca karşılık gelen OEM araç ses hizmeti bileşeni tanımlandığında gerçekleşir. Aksi halde araç ses sistemi hizmeti varsayılan davranışı kullanır.
Araç ses hizmeti ile araç OEM ses hizmetinin her zaman senkronize olmasını sağlamak için, her aramada araç ses hizmeti, ses yığınının mevcut durumunun gerekli kısımlarını araç OEM ses hizmetine iletir. Örneğin, araç ses hizmeti, ses odağını değerlendirme isteğini yakaladığında, yığının mevcut durumunu araç OEM ses hizmetine aktarır. Mevcut durum, mevcut odak sahibini ve mevcut odak kaybedenleri içerir. Odak kaybedenler, hâlâ yığının bir parçası olan ancak geçici olarak odak noktasını kaybeden odak istekleridir.
Araç ses hizmeti, araçtaki tüm ses etkinliğini yönetmelidir. Araç ses hizmeti ses davranışının bazı bölümlerini yönetemiyorsa, araç OEM ses hizmetine sunulan bilgiler eksik demektir. Örneğin, bir OEM, kendi ses odaklama ilkesini kaydederek araç hizmetindeki ses odaklama işleminin üzerine yazarsa, araç ses hizmeti, araç OEM ses hizmetine tam bilgi sağlayamaz. Bu, araç OEM ses hizmetinin göremediği bilgilerden yoksun olabileceğinden, araç OEM ses hizmetinin karar verme yeteneğini etkileyebilir.
Araç ses hizmeti, işlem yapmak için OEM araç hizmetlerini arar. Bu çağrılar, süreçler arası iletişim (IPC) gerektiren süreçler arasında yapılır. IPC her çağrıya gecikme ekler. OEM hizmetindeki gecikmeyi en aza indirmek önemlidir.
OEM hizmetine yapılan araç ses hizmeti çağrıları engellendiğinden, OEM hizmeti doğrudan API değerlendirmelerinde araç ses hizmetini aramamalıdır. Bunun yerine araç ses hizmeti, iki süreç arasındaki çağrıların yalnızca tek yönde gitmesi için gerekli bilgileri sağlar.
OEM araç ses hizmeti tanımları
OEM araç ses odaklama hizmeti
Araç ses hizmeti, bir ses politikası odak dinleyicisini kaydederek uygulamalardan gelen ses odaklama isteklerini yönetir. Araç ses hizmeti, statik bir Etkileşim matrisine dayalı olarak odaklanma davranışını yöneten bir mekanizmaya sahiptir. Matris üç farklı etkileşim türünü tanımlar:
Eşzamanlı etkileşim. Odak tutucular aynı anda odağı koruyabilirler.
Özel etkileşimler. Gelen odak isteği, odağı geçerli odak sahibinden alır.
Etkileşimi reddet. Mevcut odak sahibine göre gelen odak isteği reddedildi.
Bu, bazı otomotiv kullanım durumları için yeterli olsa da, OEM gereksinimleri nedeniyle farklılık gösterebilecek tüm etkileşim ihtiyaçlarını karşılamaz. Bunun için OemCarAudioFocusService
tanıtıyoruz:
public interface OEmCarAudioFocusService {
OemCarAuddioFocusResults evaluateAudioFocusRequest(
OemCarAudioFocusEvaluationRequest request);
void notifyAudioFocusChange(
List<AudioFocusEntry> holder,
List<AudioFocusEntry> losers, int zoneId);
}
evaluateAudioFocusRequest
API'si, değerlendirilmesi gereken ses odağı talebi olduğunda araç ses hizmetinden çağrılır; sonuçların geri dönmesini engelleyen iki yönlü bir API'dir. İstek, ses yığınının mevcut durumu hakkında bilgi içerir:
Bu bilgi, newFocusRequest
focusHolders
mevcut odak tutucularla ve focusLosers
mevcut odak kaybedenlerle karşılaştırmak için değerlendirmek için kullanılabilir. API sonuçları döndürmelidir:
class OemCarAudioFocusResult {
int audioZoneId;
int audioFocusEvaluationResults;
AudioFocusEntry focusResult;
List<AudioFocusEntry> newLosers;
List<AudioFocusEntry> newlyBlocked;
}
Bu, audioFocusEvaluationResults
gerçek değerlendirme sonuçları hakkındaki bilgileri içerir; bu, geçerli isteğin kabul edilip edilmediğini, geciktiğini veya başarısız olduğunu gösterir. Geçerli odak yığınında yapılacak herhangi bir değişiklik, yığın değişikliğinin niteliğine bağlı olarak newLosers
ve newlyBlocked
girişlerinde ayarlanmalıdır.
newLosers
daha önce odağı koruyan ancak artık kalıcı veya geçici olarak odağı kaybetmesi gereken girişleri içerdiği yer. Kalıcı odak kaybedenler, ses odak yığınından daha da kaldırılacak ve geçici odak kaybedenler, odak yeniden kazanılıncaya veya orijinal odak isteğinde bulunan kişiden ayrılıncaya kadar mevcut odak kaybedenler yığınına taşınacak. Ne olursa olsun, isteklerin odak dinleyicisi karşılık gelen odak kaybıyla karşılaşacaktır.
newlyBlocked
listesi, daha önce odağı kaybedenler listesinde olan ancak şimdi yeni giriş tarafından engellenen girişleri içerir. Blok kalıcı veya geçici olabilir, kalıcı odaklama engellendiğinde giriş yığından kaldırılacak ve odak kaybı odak dinleyicilerine gönderilecektir. Geçici odak kaybı için, giriş odak kaybedenler yığınında kalacak, ancak engelleyici listesine yeni bir odak engelleyici eklenecek, daha önce ilk engellendiğinde gönderildiği gibi odak kaybı gönderilmeyecek. Mevcut tüm engelleyiciler kaldırıldığında isteğin engeli nihayet kaldırılacak veya odaklamadan vazgeçilirse yığından kaldırılacak.
İkinci API, notifyAudioFocusChange
, her ses odaklama isteğinde veya vazgeçildiğinde çağrılan tek yoldur. API çoğunlukla OEM araç ses hizmetinin davranışını etkileyebilecek odak değişiklikleri hakkında OEM hizmetini bilgilendirmek için kullanılır.
Odak değerlendirmesi için yönergeler
AAOS'ta ses odağı, ses oynatmayı yönetmek ve kullanıcıya en iyi deneyimi sağlamak için hangi uygulamanın uyması gerektiğini belirlemek için kullanılır. Bu nedenle OEM eklenti hizmeti, bir ses odaklama isteğini yönetirken aşağıdakileri dikkate almalıdır:
Herhangi bir yüksek öncelikli ses odağı (telefon görüşmesi, acil durum veya güvenlik gibi) olmadan uygulamalar, geçici veya kalıcı olarak ses odağı kazanabilmelidir.
Bir medya odağı etkinken uygulamalar şunu ister:
Çağrı kullanım odağı, eş zamanlı veya özel olarak odağı alabilmelidir.
Gezinme kullanım odağı, eş zamanlı veya özel olarak odağı alabilmelidir.
Asistan kullanım odağı, odağı aynı anda veya özel olarak alabilmelidir.
Durağan yüksek öncelikli ses odaklama (telefon görüşmesi, acil durum uyarısı veya güvenlik uyarısı gibi) uygulamaları etkinken, gelen herhangi bir gecikmeli ses odaklama isteği gerektiği şekilde kabul edilmeli veya geciktirilmelidir.
Yukarıdaki öneriler kapsamlı olmasa da, odaklanma isteğinde bulunan uygulamaların, aktif yüksek öncelikli ses olmadığında odaklanma elde edebilmesi gerektiğini garanti etmeye yardımcı olabilirler. Yüksek öncelikli sesler aktif olsa bile, gecikmeli odaklanma taleplerine yine de uyulmalı ve yüksek öncelikli ses durduğunda odaklanabilmelidir.
OEM araç hacim hizmeti
Araç ses hizmeti, ses seviyesi tuşu olaylarını ses sisteminden ses seviyesi ayarlarını dinleyerek veya ses seviyesi tuşu olaylarını doğrudan araç giriş hizmetinden dinleyerek yönetir. Her durumda, araç ses sistemi hizmetinin varsayılan davranışı, aktif ses oynatıcılarına ve ses bağlamı öncelik listesine göre hangi ses seviyesi grubunun değiştirileceğini belirlemektir.
İki birim öncelik listesi sağlıyoruz. İlk liste tüm ses bağlamlarını bu sırayla ele alır. Liste azalan sırada sunulur; en yüksek öncelik en üstte, en düşük öncelik en altta yer alır. Örneğin, hem navigasyon sesi hem de müzik sesi aynı anda etkinse, bir ses seviyesi tuşu etkinliği sırasında navigasyon ses seviyesi değiştirilir.
- Navigasyon
- Arama
- Müzik
- Duyuru
- Ses komutu
- Çağrı zili
- Sistem sesi
- Emniyet
- Alarm
- Bildiri
- Araç durumu
- Acil durum
Ses seviyesi tuşu olay yönetimini daha az karmaşık hale getirmek için, araç ses hizmetinde ses bağlamına ilişkin ikinci bir öncelik listesi bulunur:
- Arama
- Medya
- Duyuru
- Ses komutu
Bu liste de azalan sırada sunulmaktadır. Bu ikinci listenin amacı, daha yaygın seslerin önemli olaylar yoluyla değiştirilmesine olanak sağlamaktır. Alışılmadık, belki de daha kısa süreli sesler yalnızca ses ayarları kullanıcı arayüzünden yönetilebilir.
Birimin gerçek sürümü audioVolumeAdjustmentContextsVersion
yapılandırmasıyla ayarlanabilir. Yapılandırma 1
veya 2
ayarlanabilir (varsayılan 2
).
Birim yönetimine daha fazla esneklik sağlamak için OemCarAudioVolumeService
Android 14'te kullanıma sunuldu:
public interface OemCarAudioVolumeService {
OemCarvolumeChangeInfo getSuggestedGroupForVolumeChange(
OemCarAudioVolumeRequest request, int volumeAdjustment);
}
OEM araç ses düzeyi hizmetinin, volumeAdjustment
ve OemCarAudioVolumeRequest
öğelerini alan tek bir yöntemi vardır:
class OemCarAudioVolumeRequest {
int audioZoneId;
int callState;
List<AudioAttributes> activePlaybackAttributes;
List<AudioAttributes> duckedAttributes;
List<CarVolumeGroupInfo> volumeGroupState;
}
İsteğin activePlaybackAttributes
aktif ses niteliklerine sahiptir. duckedAttributes
tümü şu anda ördekli ses nitelikleridir. volumeGroupState
, hacim grubunun geçerli durumuna sahiptir. İstek, ses yığınının mevcut durumunu temsil eder ve hangi ses grubunun değiştirilmesi gerektiğini belirlemek için kullanılabilir. Sonuçlar OemCarVolumeChangeInfo
dosyasında döndürülmelidir:
class OemCarVolumeChangeInfo {
boolean change;
CarVolumeGroupInfo volumeGroupChanged;
}
change
boolean'ı herhangi bir birimin değişip değişmediğini belirtir; true
ise bir değişiklik olduğunu ve birim grubunun güncellenmesi gerektiğini belirtir. volumeGroupChanged
, değiştirilmesi gereken gerçek birim grubudur. Bu grup, API'ye iletilen orijinal volumeAdjustment
parametresine göre değiştirilmelidir. Örneğin, sonuçlar gezinme ses grubu grubunun sesinin kapatılması gerektiğini gösteriyorsa boole değeri true
olur ve döndürülen ses düzeyi grubu, gezinme için olanla aynı olmalıdır.
OEM araba eğilme hizmeti
Araç ses hizmeti, ses odak değişikliklerini izleyerek ve AudioControl
HAL'e hangi ses cihazlarının kapatılacağına ilişkin bir sinyal göndererek ses kısmayı yönetir. Odak değiştiğinde, tüm aktif odak sahipleri, bu statik eğilme kuralları dizisine göre hangisinin eğilmesi gerektiğini belirlemek için değerlendirilir:
- Acil durum sesleri, çağrı sesleri dışında her şeyi bastırır
- Güvenlik, acil durum sesleri dışında her şeyi göz ardı ediyor
- Navigasyon, güvenlik ve acil durum sesleri dışında her şeyi göz ardı eder
- Güvenlik, acil durum ve navigasyon sesleri dışında ördeklere her şeyi söyleyin
- Sesli ördekler zil seslerini çağırır
- Müzik ve duyurular her şeyden kaçınılmalıdır
Bu kurallar kapsamlı değildir ve OEM'ler bu yönergelere göre seslerin nasıl bastırılması gerektiğinin belirlenmesinden sorumlu olmaya devam etmektedir. OEM'ler mevcut gereksinimlere göre bu önerileri daha aktif bir şekilde kontrol edebilir. OemCarDuckingService
Android 14'te kullanıma sunuldu:
class OemCarAudioDuckingService {
List<AudioAttributes> evaluateAttributesToDuck(
OemCarAudioVolumeRequest request);
}
Bu API, ses odağı değişikliklerinde araç ses hizmetinden çağrılır. OEM araba hacim hizmetinde tanıtılan OemCarAudioVolumeRequest
yeniden kullanır ve hangi niteliklerin devre dışı bırakılacağına karar vermek için ilgili bilgileri içerir. API'den alınacak ses niteliklerinin listesi mevcut ses durumuyla karşılaştırılır:
Ses özelliği şu anda engellendi:
- Listede yer almaya devam ediyor
- Listede yok, eğilme kapalı
Ses özelliği şu anda eğilmiyor:
- Listede eğildi
- Listede yok, eğilme kapalı
Araç ses hizmeti daha sonra ses özniteliklerinin hangi ses çıkış cihazlarına ait olduğunu belirler ve bunları sırasıyla engellenen ses çıkış cihazı listesine veya bağlantısız ses cihazları listesine ekler. Bu, donanım düzeyinde gerekli azaltma işlemini gerçekleştirmek için sonuçta AudioControl HAL'e gönderilir.
Aşağıdaki şekilde, OEM azaltma hizmeti kullanıldığında bir odak isteği için ses azaltma kontrolünün basitleştirilmiş bir sıra diyagramı gösterilmektedir:
Sıra, bir uygulamanın genel ses yöneticisi API'leri aracılığıyla Ses odağını yönetme isteğinde bulunmasıyla başlar. Sonuçların belirlenmesi için istek araç ses servisine iletilir. Ses odağına karar verildiğinde, sesin kısılması, hangi ses özelliklerinin kısılması gerektiğini değerlendirmek için OemCarAudioDuckingService
çağıran araç ses hizmeti tarafından değerlendirilir. evaluateAttributesToDuck
API'sinden sonuçlar döndürüldükten sonra, eğilecek ses cihazları hesaplanır ve son olarak bilgi, ses donanımına eğilme uygulamak için AudioControl
gönderilir.
OEM araç ses hizmeti referans uygulaması
AAOS, OemCarService
, OemCarAudioFocusService
, OemCarAudioDuckingService
ve OemCarAudioVolumeService
ile birlikte uygulayan packages/services/Car/tests/OemCarServiceTestApp
içinde OEM araç hizmetinin referans uygulamasını sağlar. İkincisi için, her hizmet statik bir davranış yüklemek için XML dosyasını kullanır. Örneğin, OemCarAudioFocusServiceImp
, bir etkileşim matrisi içeren oem_focus_config.xml
dosyasını yükler. Matris, evaluateAudioFocusRequest
çağrıldığında odak isteğini değerlendirmek için kullanılır.
Referans testi uygulamasında hata ayıklama
OEM araç servis testi uygulaması AOSP kaynak kodunun bir parçasıdır. OEM'ler ihtiyaçlarına göre değişiklik yapabilirler. Hata ayıklamak için test uygulamasını etkinleştirmek üzere config_oemCarService
yapılandırmasını kullanın.
<!-- This is the component name for the OEM customization service. OEM can choose to implement
this service to customize car service behavior for different policies. If OEMs choose to
implement it, they have to implement a service extending OemCarService exposed by car-lib,
and implement the required component services.
If the component name is invalid, CarService would not connect to any OEM service.
Component name can not be a third party package. It should be pre-installed -->
<string name="config_oemCarService" translatable="false">
com.android.car.oemcarservice.testapp/.OemCarServiceImpl
</string>
OEM araç servisini doğrulamak için OEM hizmetine yönelik araç servis dump
komutunu kullanır:
adb shell dumpsys car_service --oem-service
Sonuçlar aşağıdaki çıktıya benzer olabilir:
***CarOemProxyService dump***
mIsFeatureEnabled: true
mIsOemServiceBound: true
mIsOemServiceReady: true
mIsOemServiceConnected: true
mInitComplete: true
OEM_CAR_SERVICE_CONNECTED_TIMEOUT_MS: 5000
OEM_CAR_SERVICE_READY_TIMEOUT_MS: 5000
mComponentName: com.android.car.oemcarservice.testapp/.OemCarServiceImpl
Her dump
bilgisi kümesindeki her boole özelliğin ve hizmetin durumunu belirler. Örneğin, mIsOemServiceReady
döküm bilgisi hizmetin kullanıma hazır olup olmadığını belirtir; burada true
hizmetin hazır olduğunu, false
ise hazır olmadığını belirtir.