Ses odağı

Mantıksal bir akışı başlatmadan önce, bir uygulama, mantıksal akış için kullanılanla aynı ses niteliklerini kullanan ses odağı ister. Uygulamanın, otomotiv kullanım durumlarında beklendiği gibi performans gösterebilmesi için odak kayıplarına saygı göstermesi gerekir.

Odaklanma isteği gönderilmesi önerilir ancak sistem tarafından zorunlu kılınmaz. Bu nedenle, odaklamayı birincil ses kontrol mekanizması yerine, oynatma sırasında dolaylı olarak kontrol etme ve çatışmayı önleme aracı olarak düşünün. Araç, ses alt sisteminin çalışması için odaklama sistemine bağımlı olmamalıdır.

Odak etkileşimleri

AAOS'u desteklemek için ses odaklama istekleri, isteğin CarAudioContext ile mevcut odak sahiplerininki arasındaki önceden tanımlanmış etkileşimlere dayalı olarak işlenir. Üç tür etkileşim vardır:

  • Özel
  • Reddetmek
  • Eşzamanlı

Özel etkileşim

Bu, Android'de en sık kullanılan etkileşim modelidir.

Özel etkileşimlerde aynı anda yalnızca bir uygulamanın odağı tutmasına izin verilir. Bu nedenle, mevcut odak sahibi odağı kaybederken gelen odak isteğine odak verilir. Her iki uygulama da medya oynattığı için yalnızca bir uygulamanın odağı tutmasına izin verilir. Sonuç olarak, yeni başlatılan uygulamanın odak isteği AUDIOFOCUS_REQUEST_GRANTED ile döndürülürken, o anda müzik çalan uygulama, yapılan isteğin türüne karşılık gelen kayıp durumuna sahip bir odak değişikliği olayı alır.

Etkileşimi reddet

Reddetme etkileşimlerinde gelen istek her zaman reddedilir. Örneğin, bir arama devam ederken müzik çalmaya çalıştığınızda. Bu durumda, Çevirici bir çağrı için ses odağını tutarsa ​​ve ikinci bir uygulama müzik çalmak için odaklanma talebinde bulunursa, müzik uygulaması bu isteğe yanıt olarak AUDIOFOCUS_REQUEST_FAILED alır. Odaklanma isteği reddedildiğinden mevcut odak sahibine odak kaybı gönderilmez.

Eşzamanlı etkileşim

Eş zamanlı etkileşimler AAOS'a özgüdür. Bu, arabada ses odağı talep eden uygulamalara, odağı diğer uygulamalarla eş zamanlı olarak tutma yeteneği verir. Eşzamanlı bir etkileşimin gerçekleşebilmesi için aşağıdaki koşulların karşılanması gerekir. Şunlar:

Bu kriterler karşılanırsa, odak isteği AUDIOFOCUS_REQUEST_GRANTED ile geri dönerken mevcut odak sahibinin odakta herhangi bir değişikliği olmaz. Ancak mevcut odak sahibi, eğilme olaylarını almayı veya eğildiğinde duraklamayı tercih ederse, özel bir etkileşimde olduğu gibi mevcut odak sahibi, odağı kaybeder.

Eşzamanlı akışları yönetme

Eşzamanlı etkileşimin çok sayıda kullanımı olsa da, çıkış aygıtları arasında donanım düzeyinde karıştırma ve azaltma işlemlerine dikkat edin. Aynı anda oynatılmasına izin verilen CarAudioContext farklı çıkış cihazlarına yönlendirilmesi gerektiğini önemle tavsiye ederiz.

Eş zamanlı akışlar için ayrı çıkış cihazlarına sahip olmak, HAL'in akışlardan birini karıştırmadan önce kesmesine veya fiziksel akışları araçtaki farklı hoparlörlere yönlendirmesine olanak tanır. Mantıksal akışlar Android içinde karıştırılırsa kazanımlar değiştirilmez ve aynı fiziksel akışın parçası olarak sunulur.

Örneğin, navigasyon ve medya aynı anda iletildiğinde, medya akışının kazancı geçici olarak azaltılabilir (veya azaltılabilir), böylece navigasyon talimatları daha net duyulabilir. Alternatif olarak, medya kabinin geri kalanında oynatılmaya devam ederken navigasyon akışı sürücü tarafındaki hoparlörlere yönlendirilebilir.

Etkileşim matrisi

Aşağıdaki tablo CarAudioService tarafından tanımlanan etkileşim matrisini göstermektedir. Her satır, geçerli odak sahibinin CarAudioContext temsil eder ve her sütun, gelen isteği temsil eder.

Örneğin, bir navigasyon uygulaması odak isteğinde bulunurken bir müzik medya uygulaması odağı tuttuğunda, eşzamanlı etkileşimler için diğer kriterlerin karşılandığı varsayılarak matris, iki etkileşimin eşzamanlı olarak yürütülebileceğini gösterir.

Eş zamanlı etkileşimler nedeniyle birden fazla odak tutucuya sahip olmak mümkündür. Bu durumda, hangi etkileşimin uygulanacağına karar verilmeden önce gelen odak isteği mevcut odak sahiplerinin her biriyle karşılaştırılır. Bu durumda en muhafazakar etkileşim kazanır. Reddet, sonra özel ve son olarak eşzamanlı.

Ses odaklama etkileşim matrisi

Şekil 1. Ses odağı etkileşim matrisi.

Android 11'de kullanıcıların navigasyon ve telefon aramaları arasındaki etkileşim davranışını değiştirmesine olanak tanıyan yeni bir kullanıcı ayarı sunuldu. Ayarlandığında, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL , gelen NAVIGATION odak istekleri ile mevcut CALL odak sahipleri arasındaki etkileşimi eşzamanlıdan reddeder olarak değiştirir. Kullanıcı navigasyon talimatlarının aramayı kesmemesini tercih ederse bu ayarı etkinleştirebilir. Bu, kullanıcı için kalıcıdır ve sonraki odaklama isteklerinin yeni ayara uyması için dinamik olarak ayarlanabilir.

Geciktirilebilir ses odağı

Android 11'de AAOS, gecikebilir ses odağı isteği için destek ekledi. Bu, mevcut odak sahipleri ile etkileşimlerinin normalde reddedilmeleriyle sonuçlanacağı durumlarda, geçici olmayan odaklama isteklerinin ertelenmesine olanak tanır. Odaktaki bir değişiklik, geciken isteğin odaklanabileceği bir durumla sonuçlandığında istek kabul edilir.

Gecikmeli ses odaklama isteklerine ilişkin kurallar

  • Yalnızca geçici olmayan istekler. Gecikmeli bir istek, ilgili olduktan uzun süre sonra geçici bir ses çalınmasını önlemek amacıyla yalnızca geçici olmayan kaynaklar için yapılabilir.

  • Aynı anda yalnızca bir istek ertelenebilir. Zaten gecikmiş bir istek varken geciktirilebilir bir istek yapılırsa, orijinal gecikmiş istek bir AUDIOFOCUS_LOSS değişiklik olayı alır ve yeni istek, AUDIOFOCUS_REQUEST_DELAYED eşzamanlı yanıtını alır.

  • Gecikebilen isteklerde bir OnAudioFocusChangeListener bulunmalıdır Bir istek geciktiğinde, dinleyici, istek sonunda kabul edildiğinde ( AUDIOFOCUS_GAIN ) veya daha sonra reddedildiğinde ( AUDIOFOCUS_LOSS ) istek sahibini bilgilendirmek için kullanılır.

Geciktirilebilir odak isteği

Gecikebilecek bir istek oluşturmak için:

  1. AudioFocusRequest.Builder#setAcceptsDelayedFocusGain kullanın.

    mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener();
    
    mDelayedFocusRequest = new AudioFocusRequest
         .Builder(AudioManager.AUDIOFOCUS_GAIN)
         .setAudioAttributes(mMusicAudioAttrib)
         .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener)
         .setForceDucking(false)
         .setWillPauseWhenDucked(false)
         .setAcceptsDelayedFocusGain(true)
         .build();
    
  2. Talepte bulunurken AUDIOFOCUS_REQUEST_DELAYED yanıtını kullanın:

    int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest);
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        // start audio playback
        return;
    }
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
         // audio playback delayed to audio focus listener
         return;
    }
    
  3. İstek geciktiğinde odak dinleyicisi odaktaki değişiklikleri yönetir:

    private final class MediaWithDelayedFocusListener implements
    OnAudioFocusChangeListener {
           @Override
           public void onAudioFocusChange(int focusChange) {
               synchronized (mLock) {
                   switch (focusChange) {
                       case AudioManager.AUDIOFOCUS_GAIN:
                           … // Start focus playback
                       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                           … // Pause media transiently
                       case AudioManager.AUDIOFOCUS_LOSS:
                           … // Stop media
    

Çok bölgeli odak yönetimi

Birden fazla ses bölgesi olan araçlarda ses odağı her bölge için bağımsız olarak yönetilir. Bu nedenle, bir bölgeye yapılan talep, diğer bölgelerde odağı tutan şeyin ne olduğunu hesaba katmaz ve diğer bölgelerdeki odak sahiplerinin odağını kaybetmesine neden olmaz. Bu sayede, ana kabinin odağı arka koltuk eğlence sisteminden ayrı olarak yönetilebiliyor ve böylece bir bölgedeki ses oynatımı, odakta yapılan değişiklikler nedeniyle diğerine kesintiye uğramıyor.

CarAudioService , tüm uygulamalar için odağı otomatik olarak yönetir. Odaklanma isteğinin ses bölgesi, ilişkili UserId veya UID tarafından belirlenir (ayrıntılar için bkz . Ses Yönlendirme ).

Aynı anda birden fazla bölgeden ses isteyin

Bir uygulama aynı anda birden fazla bölgede ses çalmak istiyorsa pakete AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID ekleyerek her bölge için odaklanma talebinde bulunmalıdır:

//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
               zoneId);

AudioAttributes attributesWithZone = new AudioAttributes.Builder()
     .setUsage(AudioAttributes.USAGE_MEDIA)
     .addBundle(bundle)
     .build();

//Create focus request using built attributesWithZone

Bu paket parametresi, istek sahibinin otomatik ses bölgesi eşlemelerini geçersiz kılarak bunun yerine belirtilen bölge kimliğini kullanmasına olanak tanır. Bu nedenle bir uygulama, farklı ses bölgeleri için ayrı istekler yayınlayabilir.

HAL ses odağı

Android 11'den itibaren HAL, harici akışlar adına odaklanma isteğinde bulunabilecek şekilde etkinleştirildi. İsteğe bağlı olmakla birlikte, harici seslerin Android ekosisteminde en iyi katılımcılar olmasını sağlamak ve kusursuz bir kullanıcı deneyimi sağlamak için bu API'lerin kullanılması şiddetle tavsiye edilir.

HAL, hangi seslerin öncelikli olması gerektiği konusunda nihai kararı verir. Bu kapsamda, HAL'e ses odağı verilip verilmediğine bakılmaksızın acil durum ve güvenlik açısından kritik sesler çalınmalı ve HAL ses odağını kaybetse bile uygun şekilde çalınmaya devam edilmelidir. Aynı durum hükümet düzenlemelerinin gerektirdiği sesler için de geçerlidir.

HAL, acil durum veya güvenlik açısından kritik sesler oynatılırken, bunların net bir şekilde duyulmasını sağlamak için Android akışlarını proaktif olarak uygun şekilde kapatmalıdır.

Ses Kontrolü@2.0

AudioControl HAL'in 2.0 Sürümü şu yeni API'leri sunar:

API'si Amaç
IAudioControl#registerFocusListener IFocusListener örneğini AudioControl HAL'ye kaydeder. Bu dinleyici HAL'in ses odağını istemesine ve terk etmesine olanak tanır. HAl, Android tarafından dinleyicinin kaydını silmek için kullanılacak bir ICloseHandle örneği sağlar.
IAudioControl#onAudioFocusChange İlk odaklama isteklerine verilen yanıtlar da dahil olmak üzere, IFocusListener aracılığıyla HAL tarafından yapılan odaklanma isteklerindeki durum değişikliklerini HAL'ye bildirir.
IFocusListener#requestAudioFocus Belirli bir kullanım, bölge kimliği ve odak kazanç türü için HAL adına odaklanma istekleri.
IFocusListener#abandonAudioFocus Belirtilen kullanım ve bölge kimliği için mevcut HAL odak isteklerini iptal eder.

HAL aynı anda birden fazla odak isteğine sahip olabilir ancak kullanım ve bölge kimliği eşleştirme başına bir istekle sınırlıdır. Android, HAL'in bir istek yapıldığında hemen kullanım için ses çalmaya başladığını ve odağı terk edene kadar bunu yapmaya devam ettiğini varsayar.

registerFocusListener dışındaki bu istekler, bir odak isteği işlenirken Android'in HAL'yi geciktirmemesini sağlamak için oneway yönlüdür. HAL, güvenlik açısından kritik sesleri çalmadan önce odaklanmayı beklememelidir . HAL'ın IAudioControl#onAudioFocusChange aracılığıyla ses odağındaki değişiklikleri dinlemesi ve bunlara yanıt vermesi isteğe bağlıdır.

OEM araç ses odaklama hizmeti

Android 14'te AAOS, bazı araç bileşenleri için yapılandırılabilirliği sağlamak amacıyla araç OEM eklenti hizmetlerini kullanıma sundu. Araç Ses Eklentisi Hizmeti için eklenti hizmeti, OEM'lerin araç ses hizmeti tarafından yakalanan odak isteklerini yönetmesine olanak tanır. Bu, OEM'lere kuralların ve düzenlemelerin gerektirdiği şekilde odaklanmayı yönetme konusunda daha fazla esneklik sağlar. Bu nedenle, ses odak etkileşimi üreticiler arasında ve bölgeden bölgeye farklılık gösterebilir. Ses odağına ilişkin temel önerme hâlâ geçerliliğini koruyor; kullanıcı deneyimini geliştirmek amacıyla uygulamaların daha iyi ses yönetimi için odaklanma talep etmesi gerekiyor. Genel olarak uygulamalar tarafından yapılan ses odaklama istekleri için hâlâ belirli kurallar geçerlidir:

  • Herhangi bir ayakta durma olmadan, yüksek öncelikli ses odağı (telefon görüşmesi, acil durum uyarısı veya güvenlik bildirimi dahil) uygulamaları, ses odağını geçici veya kalıcı olarak kazanabilmelidir.

  • Medya odağı etkinken:

    • Çağrı kullanımına odaklanılmasını isteyen uygulamalar, çağrıyı aynı anda veya özel olarak alabilmelidir.

    • Gezinme kullanım odağını isteyen uygulamalar, gezinme odağını eşzamanlı olarak veya özel olarak alabilmelidir.

    • Asistan kullanım odağını talep eden uygulamalar, kullanım odağını aynı anda veya özel olarak alabilmelidir.

  • Durağan yüksek öncelikli ses odaklama (telefon görüşmesi, acil durum uyarısı veya güvenlik bildirimi dahil) uygulamaları etkinken, gelen herhangi bir gecikmeli ses odaklama isteği gerektiği şekilde kabul edilmeli veya geciktirilmelidir.

Yukarıdaki öneriler kapsamlı olmasa da, aktif yüksek öncelikli ses yoksa odaklanma isteyen uygulamaların odaklanma elde etmesine yardımcı olabilirler. Yüksek öncelikli sesler aktif olsa bile, gecikmeli odaklanma isteklerine yine de uyulmalı ve yüksek öncelikli ses durduğunda odaklanabilmelidir.