Araç ses sistemi eklentisi hizmeti

Android 14'teki yeni araba OEM eklenti hizmetleri, bazı araba bileşenlerinin yapılandırılmasını sağlar. Özellikle ses için, OEM'lerin AAOS cihazlarda ses yönetimini esnek bir şekilde yapılandırmasına olanak tanıyan üç yeni eklenti hizmeti kullanıma sunuldu:

  • Ses odağı kontrolü
  • Ses düzeyi ve sesi kapatma kontrolü
  • Sesi kısma kontrolü

Araba eklentisi hizmeti mimarisi

Aşağıdaki şekilde, araç hizmetlerine ve bunların OEM araç hizmetiyle ilişkisine genel bir bakış sunulmaktadır. Uygulama süreçlerine ve araç servisi sürecine benzer şekilde, OEM araç servisi süreci de kendi süreç alanını kullanır.

resim

Araba hizmeti, config_oemCarService içinde tanımlanan bileşeni bularak OEM araba hizmetini başlatır. Yapılandırma boşsa OEM hizmeti yoktur ve herhangi bir hizmet başlatılmaz. Bileşen, OemCarService'i genişletmelidir. Araba ses hizmeti, araba ses OEM hizmetini edinmeye yönelik API'lerin üzerine yazmalıdır:

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ç servisi tarafından başlatılsa da araç ses hizmetinde kullanılabilen izinleri otomatik olarak devralmaz. Bu nedenle, OEM hizmetleri tarafından gerekli olan tüm izinler uygun mekanizma kullanılarak alınmalıdır. Örneğin, packages/services/Car/data/etc/com.android.car.oemcarservice.testapp.xml bölümüne bakın.

OEM hizmet mimarisine sahip araç ses sistemi hizmeti

AAOS'te araba ses hizmeti şu işlemleri yönetir:

  • Ses yönlendirme
  • Ses odağı
  • Sesi kısma
  • Ses düzeyi ve sesi kapatma

Android 14'ten önce bu davranış büyük ölçüde statikti ve yalnızca çok sınırlı sayıda durum için ayarlardan değiştirilebiliyordu. Android 14, araç ses hizmetinin aşağıdakileri yöneten OEM tanımlı bir bileşenle iletişim kurmasını sağlayan bir mekanizma sunar:

  • Ses odağı
  • Sesi kısma
  • Ses düzeyi ve sesi kapatma

Aşağıdaki şekilde, araç ses hizmeti ve araç OEM hizmeti için basitleştirilmiş bir mimari gösterilmektedir. Araba ses hizmeti, ses davranışını yönetmek için araba OEM ses hizmetini çağırabilen farklı kancalar tanımlar. Bu durum yalnızca ilgili OEM araç ses hizmeti bileşeni tanımlanmışsa gerçekleşir. Aksi takdirde, araç ses hizmeti varsayılan davranışı kullanır.

resim

Araç ses hizmetinin ve araç OEM ses hizmetinin her zaman senkronize olmasını sağlamak için araç ses hizmeti, her aramada ses yığınının mevcut durumunun gerekli kısımlarını araç OEM ses hizmetine iletir. Örneğin, araba ses hizmeti ses odağını değerlendirme isteğini yakaladığında yığının mevcut durumunu araba OEM ses hizmetine iletir. Mevcut durum, mevcut odak sahibi ve mevcut odak kaybedenleri içerir. Odaklanma kaybedenler, yığında yer almaya devam eden ancak geçici olarak odaklanmayı kaybetmiş odaklanma istekleridir.

Araç ses hizmeti, araçtaki tüm ses etkinliklerini yönetmelidir. Araba ses hizmeti, ses davranışının bazı kısımlarını yönetmiyorsa araba OEM ses hizmetine sunulan bilgiler eksiktir. Örneğin, bir OEM kendi ses odağı politikasını kaydederek araç hizmetindeki ses odağı işleme özelliğinin üzerine yazarsa araç ses hizmeti, araç OEM ses hizmetine eksiksiz bilgi sağlayamaz. Bu durum, otomobil ses hizmetine görünmeyen bilgiler eksik olabileceğinden otomobil OEM ses hizmetinin karar verme yeteneğini etkileyebilir.

Araç ses hizmeti, işlem yapmak için OEM araç hizmetlerini çağırır. Bu çağrılar işlemler arasında yapılır ve işlemler arası iletişim (IPC) gerektirir. IPC, her çağrıya gecikme ekler. OEM hizmetinde 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 çağırmamalıdır. Bunun yerine, araç ses hizmeti gerekli bilgileri sağlar. Böylece iki işlem arasındaki aramaların yalnızca tek yönde ilerlemesi gerekir.

OEM araç ses hizmeti tanımları

OEM araç ses odağı hizmeti

Aracın ses hizmeti, bir ses politikası odak dinleyicisi kaydederek uygulamalardan gelen ses odağı isteklerini yönetir. Araba ses hizmeti, odak davranışını statik bir etkileşim matrisine göre yönetme mekanizmasına sahiptir. Matris üç farklı etkileşim türünü tanımlar:

  • Eşzamanlı etkileşim Odak sahipleri aynı anda odaklanabilir.

  • Özel etkileşimler Gelen odak isteği, mevcut odak sahibinden odağı alır.

  • Etkileşimi reddet Mevcut odak sahibi nedeniyle gelen odak isteği reddedildi.

Bu, bazı otomotiv kullanım alanları için yeterli olsa da OEM gereksinimleri nedeniyle farklılık gösterebilecek tüm etkileşim ihtiyaçlarını karşılamaz. Bu amaçla OemCarAudioFocusService özelliğini kullanıma sunuyoruz:

public interface OEmCarAudioFocusService {
    OemCarAuddioFocusResults evaluateAudioFocusRequest(
        OemCarAudioFocusEvaluationRequest request);
    
    void notifyAudioFocusChange(
        List<AudioFocusEntry> holder,
        List<AudioFocusEntry> losers, int zoneId);
}

API evaluateAudioFocusRequest, değerlendirilmesi gereken bir ses odağı isteği olduğunda araba ses hizmetinden çağrılır. Sonuçların döndürülmesi için engelleme yapan iki yönlü bir API'dir. İstek, ses yığınının mevcut durumuyla ilgili bilgileri içerir:

Bu bilgiler, newFocusRequest ile focusHolders'deki mevcut odaklanma sahipleri ve focusLosers'deki mevcut odaklanma kaybedenler karşılaştırılırken kullanılabilir. API, sonuçları döndürmelidir:

class OemCarAudioFocusResult {
    int audioZoneId;
    int audioFocusEvaluationResults;
    AudioFocusEntry focusResult;
    List<AudioFocusEntry> newLosers;
    List<AudioFocusEntry> newlyBlocked;
}

Bu, audioFocusEvaluationResults içindeki gerçek değerlendirme sonuçlarıyla ilgili bilgileri içerir. Bu bilgiler, mevcut isteğin kabul edilip edilmediğini, geciktirilip geciktirilmediğini veya başarısız olup olmadığını gösterir. Mevcut odak yığınında yapılan değişiklikler, yığın değişikliğinin niteliğine bağlı olarak newLosers ve newlyBlocked girişlerinde ayarlanmalıdır.

newLosers, daha önce odaklanılmış ancak artık kalıcı veya geçici olarak odaklanmayı bırakması gereken girişler içerdiğinde. Kalıcı odak kaybedenler, ses odağı yığınından daha da uzaklaştırılır. Geçici odak kaybedenler ise odağı yeniden kazanana veya orijinal odak isteğinde bulunan tarafından bırakılana kadar mevcut odak kaybedenler yığınına taşınır. Her durumda, isteklerin odak dinleyicisi, odak kaybıyla ilgili bir yanıt alır.

newlyBlocked listesi, daha önce odak kaybedenler listesinde yer alan ancak yeni giriş tarafından engellenen girişleri içerir. Engelleme kalıcı veya geçici olabilir. Kalıcı odak engellemesinde giriş yığından kaldırılır ve odak kaybı, odak dinleyicilerine gönderilir. Odaklanmanın geçici olarak kaybolması durumunda giriş, odaklanmayı kaybedenler yığınında kalır ancak engellenenler listesine yeni bir odaklanma engelleyici eklenir. Daha önce ilk engellendiğinde gönderildiği için odaklanma kaybı gönderilmez. Tüm mevcut engelleyiciler kaldırıldığında istek nihayet engellenmeyecek veya odaklanma bırakılırsa istek yığından kaldırılacaktır.

İkinci API olan notifyAudioFocusChange, her ses odağı isteğinde veya bırakma işleminde çağrılan tek yönlü bir API'dir. API, genellikle OEM servisinin davranışını etkileyebilecek odak değişiklikleri hakkında OEM servisine bilgi vermek için kullanılır.

Odak değerlendirmesi yönergeleri

AAOS'te ses odaklanması, ses oynatmayı yönetmek ve kullanıcıya optimum deneyim sunmak için hangi uygulamanın uyması gerektiğini belirlemek için kullanılır. Bu nedenle, OEM eklenti hizmeti bir ses odağı isteğini yönetirken aşağıdakileri göz önünde bulundurmalıdır:

  • Yüksek öncelikli ses odağı (ör. telefon görüşmesi, acil durum veya güvenlik) yoksa uygulamalar geçici ya da kalıcı olarak ses odağı kazanabilmelidir.

  • Medya odağı etkin durumdayken istekte bulunan uygulamalar:

    • Arama kullanımına odaklanılmalıdır. Odak, eşzamanlı veya özel olarak alınabilmelidir.

    • Gezinme kullanımına odaklanılmalıdır. Odak, eşzamanlı veya ayrı ayrı alınabilmelidir.

    • Asistan kullanımına odaklanılmalıdır. Odak, eşzamanlı veya ayrı ayrı alınabilmelidir.

  • Yüksek öncelikli ses odağı (ör. telefon araması, acil durum uyarısı veya güvenlik uyarısı) uygulamaları etkin durumdayken, gelen gecikmeli ses odağı istekleri gerektiği şekilde verilmeli veya geciktirilmelidir.

Yukarıdaki öneriler kapsamlı olmasa da odaklanma isteğinde bulunan uygulamaların, etkin ve yüksek öncelikli sesler olmadığında odaklanabilmesini sağlamaya yardımcı olabilir. Yüksek öncelikli sesler etkin olsa bile, gecikmeli odaklanma isteklerine uyulmaya devam edilmeli ve yüksek öncelikli ses durduktan sonra odaklanma sağlanabilmelidir.

OEM araba ses seviyesi hizmeti

Araç ses hizmeti, ses sisteminden gelen ses ayarlamalarını veya doğrudan araç giriş hizmetinden gelen ses seviyesi tuşu etkinliklerini dinleyerek ses seviyesi tuşu etkinliklerini yönetir. Her durumda, araba ses hizmetinin varsayılan davranışı, etkin ses oynatıcılar ve ses bağlamı öncelik listesine göre hangi ses grubu değiştirileceğini belirlemektir.

İki birim öncelik listesi sunuyoruz. İlk listede tüm ses bağlamları bu sırayla değerlendirilir. Liste azalan düzende sunulur. En yüksek öncelik en üstte, en düşük öncelik ise en altta yer alır. Örneğin, hem navigasyon sesi hem de müzik sesi aynı anda etkinse ses tuşu etkinliği sırasında navigasyon sesi değiştirilir.

  1. Gezinme
  2. Telefon et
  3. Müzik
  4. Duyuru
  5. Sesli komut
  6. Aramada zili çaldırılacak cihaz
  7. Sistem sesi
  8. Güvenlik
  9. Alarm
  10. Bildirim
  11. Araç durumu
  12. Acil durum

Ses seviyesi tuşu etkinlik yönetimini daha az karmaşık hale getirmek için araba ses hizmetinde ikinci bir ses bağlamı öncelik listesi bulunur:

  1. Telefon et
  2. Medya
  3. Duyuru
  4. Sesli komut

Bu liste de azalan düzende sunulur. Bu ikinci listenin amacı, daha yaygın seslerin önemli etkinlikler aracılığıyla değiştirilmesine olanak tanımaktır. Daha kısa süreli sesler gibi nadir sesler yalnızca ses ayarları kullanıcı arayüzü üzerinden yönetilebilir.

Cildin gerçek sürümü, audioVolumeAdjustmentContextsVersion yapılandırmasıyla ayarlanabilir. Yapılandırma 1 veya 2 olarak ayarlanabilir (varsayılan ayar 2'dır).

Android 14'te, ses yönetimiyle ilgili daha fazla esneklik sağlamak için OemCarAudioVolumeService özelliği kullanıma sunulmuştur:

public interface OemCarAudioVolumeService {
    OemCarvolumeChangeInfo getSuggestedGroupForVolumeChange(
OemCarAudioVolumeRequest request, int volumeAdjustment);
}

OEM araç ses düzeyi hizmetinin, volumeAdjustment ve OemCarAudioVolumeRequest 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 bölümünde etkin ses özellikleri bulunur. duckedAttributes şu anda ses azaltma uygulanan ses özellikleridir. volumeGroupState, birim grubunun mevcut durumunu gösterir. İstek, ses yığınının mevcut durumunu temsil eder ve hangi ses grubu değiştirilmesi gerektiğini belirlemek için kullanılabilir. Sonuçlar OemCarVolumeChangeInfo biçiminde döndürülmelidir:

class OemCarVolumeChangeInfo {
    boolean change;
    CarVolumeGroupInfo volumeGroupChanged;
}

change Boole değeri, herhangi bir hacmin değişip değişmediğini gösterir. true ise bir değişiklik olduğunu ve hacim grubunun güncellenmesi gerektiğini gösterir. 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 için sesin kapatılması gerektiğini gösteriyorsa Boole değeri true olur ve döndürülen ses grubu gezinme ses grubu olmalıdır.

OEM araç ses kısma hizmeti

Araba ses hizmeti, ses odaklanma değişikliklerini izleyerek ve hangi ses cihazlarının sesinin kısılacağı konusunda AudioControl HAL'ye sinyal göndererek ses kısma işlemini yönetir. Odak değiştiğinde, bu statik odaklanma kurallarına göre hangisinin odaklanması gerektiğini belirlemek için tüm etkin odak tutucular değerlendirilir:

  • Acil durum sesleri, arama sesleri hariç her şeyin sesini kısar
  • Güvenlik, acil durum sesleri hariç her şeyi susturur.
  • Navigasyon, güvenlik ve acil durum sesleri hariç her şeyi kısar
  • Güvenlik, acil durum ve navigasyon sesleri dışındaki her şeyi sessize alır.
  • Voice, arama zili seslerini kısar
  • Müzik ve duyuruların sesi her şey tarafından kısılmalıdır.

Bu kurallar kapsamlı değildir ve OEM'ler, bu yönergelere göre seslerin nasıl kısılacağını belirlemekten sorumludur. OEM'ler, mevcut koşullara göre bu önerileri daha etkin bir şekilde kontrol edebilir. Android 14'te OemCarDuckingService tanıtıldı:

class OemCarAudioDuckingService {
List<AudioAttributes>   evaluateAttributesToDuck(
        OemCarAudioVolumeRequest request);
}

Bu API, ses odağı değişikliklerinde araç ses hizmetinden çağrılır. OEM car volume service'te kullanıma sunulan OemCarAudioVolumeRequest özelliğini yeniden kullanır ve hangi özelliklerin gizleneceğiyle ilgili karar vermek için gerekli bilgileri içerir. API'den gelen ses özelliklerinin listesi, mevcut ses durumuyla karşılaştırılır:

  • Şu anda sesi kısılan ses özelliği:

    • Listede, ses kısılmaya devam ediyor
    • Listede yok, ses kısma özelliği devre dışı
  • Ses özelliği şu anda kısılmıyor:

    • Listede, eğilmiş
    • Listede yok, ses kısma özelliği devre dışı

Ardından araç ses hizmeti, ses özelliklerinin hangi ses çıkışı cihazlarına ait olduğunu belirler ve bunları sırasıyla ses çıkışı cihazı listesine veya ses çıkışı cihazı listesine ekler. Bu, donanım düzeyinde gerekli ses kısma işlemini gerçekleştirmek için nihayetinde AudioControl HAL'ye gönderilir.

Aşağıdaki şekilde, OEM ducking hizmeti kullanıldığında odaklanma isteği için ses azaltma kontrolünün basitleştirilmiş bir sıra şeması gösterilmektedir:

resim

Sıra, bir uygulama herkese açık ses yöneticisi API'leri aracılığıyla Ses odağını yönet isteğinde bulunduğunda başlar. Sonuçları belirlemek için istek, araç ses hizmetine yönlendirilir. Ses odağına karar verildiğinde, hangi ses özelliklerinin kısılacağını değerlendirmek için OemCarAudioDuckingService işlevini çağıran araç ses hizmeti tarafından ses kısma özelliği değerlendirilir. evaluateAttributesToDuck API'sinden sonuçlar döndürüldükten sonra, ses seviyesini düşürme işleminin uygulanacağı ses cihazları hesaplanır ve son olarak, ses donanımına ses seviyesini düşürme işlemini uygulamak için bilgiler AudioControl'ye gönderilir.

OEM araç ses sistemi hizmeti referans uygulaması

AAOS, packages/services/Car/tests/OemCarServiceTestApp içinde OEM araç hizmetinin referans uygulamasını sağlar. Bu uygulama, OemCarService ile birlikte OemCarAudioFocusService, OemCarAudioDuckingService ve OemCarAudioVolumeService'yi uygular. İkincisi için her hizmet, statik bir davranışı yüklemek üzere XML dosyası kullanır. Örneğin, OemCarAudioFocusServiceImp, etkileşim matrisi içeren oem_focus_config.xml öğesini yükler. evaluateAudioFocusRequest çağrıldığında odaklanma isteğini değerlendirmek için matris kullanılır.

Referans test uygulamasında hata ayıklama

OEM araç hizmeti test uygulaması, AOSP kaynak kodunun bir parçasıdır. OEM'ler, ihtiyaçlarına göre değişiklik yapabilir. Hata ayıklama 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ç hizmetinin, OEM hizmeti için araç hizmeti dump komutunu kullandığını doğrulamak üzere:

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

dump bilgilerinin her grubundaki her boole değeri, özelliğin ve hizmetin durumunu belirler. Örneğin, mIsOemServiceReady döküm bilgisi, hizmetin kullanıma hazır olup olmadığını belirtir. Burada true hazır olduğunu, false ise hazır olmadığını gösterir.