Ses odağı

Bir uygulama, mantıksal akışı başlatmadan önce mantıksal akış için kullanılan ses özelliklerini kullanarak ses odağını ister. Uygulama, otomotiv kullanım alanlarında beklendiği gibi performans göstermek için odaklanma kaybına dikkat etmelidir.

Odak isteği göndermek önerilir ancak sistem tarafından zorunlu kılınmaz. Bu nedenle, odağı birincil ses kontrol mekanizması yerine oynatma sırasındaki çakışmaları dolaylı olarak kontrol etmek ve önlemek için kullanın. Araç, ses alt sisteminin çalışması için odak sistemine bağlı olmamalıdır.

Odak etkileşimleri

AAOS'u desteklemek için ses odak istekleri, istek CarAudioContext ile mevcut odak sahiplerinin CarAudioContext arasında önceden tanımlanmış etkileşimlere göre işlenir. Üç tür etkileşim vardır:

  • Özel
  • Reddet
  • Eşzamanlı

Özel etkileşim

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

Özel etkileşimlerde, aynı anda yalnızca bir uygulamanın odakta kalmasına izin verilir. Bu nedenle, gelen bir odak isteğine odak verilirken mevcut odak sahibi odağını kaybeder. Her iki uygulama da medya oynattığından yalnızca bir uygulamanın odakta kalmasına izin verilir. Sonuç olarak, yeni başlatılan uygulamanın odak isteği AUDIOFOCUS_REQUEST_GRANTED ile döndürülürken, şu anda müzik çalan uygulama, yapılan istek türüne karşılık gelen bir kayıp durumu içeren bir odak değişikliği etkinliği alır.

Etkileşimi reddetme

Reddet etkileşimlerinde gelen istek her zaman reddedilir. Örneğin, arama devam ederken müzik çalmaya çalışırken. Bu durumda, Arama uygulaması bir arama için ses odağını elinde tutuyorsa ve ikinci bir uygulama müzik çalmak için odak isterse müzik uygulaması, isteğe yanıt olarak AUDIOFOCUS_REQUEST_FAILED alır. Odak isteği reddedildiği için mevcut odak sahibine odak kaybı gönderilmez.

Eşzamanlı etkileşim

AAOS'a özgü olan eşzamanlı etkileşimlerdir. Bu sayede, araçta ses odak isteğinde bulunan uygulamalar diğer uygulamalarla aynı anda odak tutabilir. Eşzamanlı etkileşimin gerçekleşmesi için aşağıdaki koşulların karşılanması gerekir. Aşağıdakiler:

Bu ölçütler karşılanırsa odak isteği AUDIOFOCUS_REQUEST_GRANTED ile döndürülür. Mevcut odak sahibinin odağında ise herhangi bir değişiklik olmaz. Ancak, mevcut odak sahibi, gizleme etkinlikleri almayı veya gizlendiğinde duraklatmayı seçerse mevcut odak sahibi, özel etkileşimde olduğu gibi odağı kaybeder.

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

Eşzamanlı etkileşimin birçok kullanımı olsa da çıkış cihazları arasında donanım düzeyinde karıştırma ve ses azaltma işlemlerinde dikkatli olun. Eşzamanlı olarak oynatılmasına izin verilen CarAudioContext'lerin farklı çıkış cihazlarına yönlendirilmesini önemle tavsiye ederiz.

Eşzamanlı yayınlar için ayrı çıkış cihazları olması, HAL'ın yayınları karıştırmadan önce bunlardan birini susturmasına veya fiziksel yayınları araçtaki farklı hoparlörlere yönlendirmesine olanak tanır. Mantıksal akışlar Android'de karıştırılırsa kazançlar değiştirilmez ve aynı fiziksel akış kapsamında yayınlanır.

Örneğin, gezinme ve medya aynı anda yayınlanırken gezinme talimatlarının daha net duyulması için medya akışının kazancı geçici olarak azaltılabilir (veya azaltılabilir). Alternatif olarak, navigasyon akışı sürücü tarafı hoparlörlere yönlendirilebilir. Bu sırada medya, kabinin geri kalanında çalmaya devam eder.

Etkileşim matrisi

Aşağıdaki tabloda, CarAudioService tarafından tanımlanan etkileşim matrisi gösterilmektedir. Her satır, mevcut odak sahibinin CarAudioContext değerini, her sütun ise gelen isteğin CarAudioContext değerini temsil eder.

Örneğin, bir müzik medya uygulaması, navigasyon uygulaması odaklanmayı istediğinde odaklanmayı koruduğunda matris, eşzamanlı etkileşimler ile ilgili diğer ölçütlerin karşılandığı varsayılarak iki etkileşimin eşzamanlı olarak oynatılabileceğini gösterir.

Eşzamanlı etkileşimler nedeniyle birden fazla odak noktası olabilir. Bu durumda, hangi etkileşimin uygulanacağı belirlenmeden önce gelen bir odak isteği, mevcut odak sahiplerinin her biri ile karşılaştırılır. Bu durumda en muhafazakar etkileşim kazanır. Reddetme, ardından özel ve son olarak eşzamanlı.

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

Android 11'de, kullanıcıların navigasyon ile telefon görüşmeleri arasındaki etkileşim davranışını değiştirmesine olanak tanıyan yeni bir kullanıcı ayarı kullanıma sunuldu. Ayarlandığında android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL, gelen NAVIGATION odak istekleriyle mevcut CALL odak tutucular arasındaki etkileşimi eşzamanlı yerine reddeder olarak değiştirir. Bir kullanıcı, navigasyon talimatlarının aramayı kesintiye uğratmamasını tercih ederse bu ayarı etkinleştirebilir. Bu değer kullanıcı için kalıcı olur ve sonraki odaklanma isteklerinin yeni ayara uyması için dinamik olarak ayarlanabilir.

Ertelenebilen ses odağı

Android 11'de AAOS, ertelenebilir ses odağını isteme desteği ekledi. Bu sayede, geçici olmayan odak isteklerinin, mevcut odak sahipleriyle etkileşimi normalde reddedilmeleriyle sonuçlandığında geciktirilmesi sağlanır. Odaktaki bir değişiklik, gecikmeli isteğin odak alabileceği bir duruma yol açtığında istek kabul edilir.

Gecikmeli ses odak istekleri için kurallar

  • Yalnızca geçici olmayan istekler. Geçici seslerin, alakalı olduktan çok sonra çalınmasını önlemek için gecikmeli istek yalnızca geçici olmayan kaynaklar için gönderilebilir.

  • Tek seferde yalnızca bir istek ertelenebilir. Geciktirilebilir bir istek, gecikmeli bir istek varken yapılırsa orijinal gecikmeli istek bir AUDIOFOCUS_LOSS değişiklik etkinliği alır ve yeni istek AUDIOFOCUS_REQUEST_DELAYED eşzamanlı yanıtı alır.

  • Ertelenebilen isteklerin bir OnAudioFocusChangeListener değeri olmalıdır Bir istek ertelendiğinde, istek sonunda onaylandığında (AUDIOFOCUS_GAIN) veya daha sonra reddedildiğinde (AUDIOFOCUS_LOSS) istek sahibini bilgilendirmek için dinleyici kullanılır.

Ertelenebilen odaklanma isteğinde bulunma

Ertelenebilecek bir istek oluşturmak için:

  1. AudioFocusRequest.Builder#setAcceptsDelayedFocusGain hesabını kullan.

    mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener();
    
    mDelayedFocusRequest = new AudioFocusRequest
         .Builder(AudioManager.AUDIOFOCUS_GAIN)
         .setAudioAttributes(mMusicAudioAttrib)
         .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener)
         .setForceDucking(false)
         .setWillPauseWhenDucked(false)
         .setAcceptsDelayedFocusGain(true)
         .build();
    
  2. İsteği gönderirken AUDIOFOCUS_REQUEST_DELAYED yanıtını ele alı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 gecikirse odağı dinleyen, odaktaki değişiklikleri işler:

    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
    

Çoklu bölgeli odak yönetimi

Birden fazla ses bölgesi olan araçlarda ses odak noktası her bölge için ayrı ayrı yönetilir. Bu nedenle, bir alt bölgeye gönderilen istek, diğer alt bölgelerde hangi öğenin odakta olduğunu dikkate almaz ve diğer alt bölgelerdeki odak tutucuların odağını kaybetmesine neden olmaz. Bu sayede, ana kabinin odağı arka koltuk eğlence sisteminden ayrı olarak yönetilebilir. Böylece, odakta yapılan değişiklikler nedeniyle bir bölgedeki ses oynatımı kesintiye uğramaz.

CarAudioService, tüm uygulamalarda odağı otomatik olarak yönetir. Odak isteğinin ses bölgesi, ilişkili UserId veya UID tarafından belirlenir (ayrıntılar için Çok bölgeli ses yönlendirmesi bölümüne bakın).

Eşzamanlı olarak birden fazla bölgeden ses isteğinde bulunma

Bir uygulama birden fazla bölgede aynı anda ses çalmak istiyorsa pakete AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID ekleyerek her bölge için odaklanmayı istemelidir:

//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 belirtilen bölge kimliğini kullanmasına olanak tanır. Bu nedenle, bir uygulama farklı ses bölgeleri için ayrı istekler gönderebilir.

HAL ses odağı

Android 11'den itibaren HAL, harici akışlar adına odaklanma isteğinde bulunabilir. İsteğe bağlı olsa da harici seslerin Android ekosisteminde en iyi şekilde kullanılabilmesi ve sorunsuz bir kullanıcı deneyimi sunulması için bu API'lerin kullanılması önemle tavsiye edilir.

Hangi seslerin öncelikli olması gerektiğine dair nihai kararı HAL verir. Bu nedenle, HAL'e ses odağının verilip verilmediğinden bağımsız olarak acil durum ve güvenlik açısından kritik sesler çalınmalı ve HAL ses odağını kaybetse bile uygun şekilde çalınmaya devam etmelidir. Aynı durum, resmi düzenlemeler uyarınca gerekli olan tüm sesler için de geçerlidir.

HAL, acil durum veya güvenlik açısından kritik seslerin net bir şekilde duyulmasını sağlamak için Android akışlarını gerektiğinde proaktif olarak sessize almalıdır.

AudioControl@2.0

AudioControl HAL'ın 2.0 sürümünde aşağıdaki yeni API'ler kullanıma sunulmuştur:

API Amaç
IAudioControl#registerFocusListener AudioControl HAL ile bir IFocusListener örneği kaydeder. Bu dinleyici, HAL'in ses odağını istemesini ve terk etmesini sağlar. HAl, dinleyicinin kaydını iptal etmek için Android tarafından kullanılacak bir ICloseHandle örneği sağlar.
IAudioControl#onAudioFocusChange İlk odak isteklerine verilen yanıtlar da dahil olmak üzere, HAL tarafından IFocusListener üzerinden yapılan odak isteklerinin durumundaki değişiklikleri HAL'e bildirir.
IFocusListener#requestAudioFocus Belirli bir kullanım, bölge kimliği ve odak kazancı türü için HAL adına odaklanma isteğinde bulunur.
IFocusListener#abandonAudioFocus Belirtilen kullanım ve bölge kimliği için mevcut HAL odaklanma isteklerini terk eder.

HAL'de aynı anda birden fazla odak isteği olabilir ancak kullanım ve bölge kimliği eşleştirme başına bir istekle sınırlıdır. Android, istek gönderildikten sonra HAL'ın ilgili kullanım için sesleri hemen çalmaya başlayacağını ve odak kaybolana kadar bunu yapmaya devam edeceğini varsayar.

registerFocusListener dışındaki bu istekler, Android'in bir odaklanma isteği işlenirken HAL'i geciktirmemesi için oneway olur. HAL, güvenlik açısından kritik sesleri oynatmadan önce odaklanmayı beklememelidir. HAL'in IAudioControl#onAudioFocusChange üzerinden ses odağındaki değişiklikleri dinlemesi ve bunlara yanıt vermesi isteğe bağlıdır.

OEM araç ses odak hizmeti

Android 14'te AAOS, bazı araç bileşenlerinin yapılandırılabilirliğini sağlamak için araç OEM eklenti hizmetlerini kullanıma sundu. Araç Ses Sistemi Eklentisi Hizmeti için eklenti hizmeti, OEM'lerin araç ses sistemi hizmeti tarafından yakalanan odaklanma isteklerini yönetmesine olanak tanır. Bu sayede OEM'ler, kurallar ve yönetmelikler uyarınca odaklanmayı yönetme konusunda daha fazla esneklik elde eder. Bu nedenle, ses odak etkileşimi üreticiler ve bölgeler arasında farklılık gösterebilir. Ses odağının temel fikri geçerliliğini koruyor. Uygulamaların, kullanıcı deneyimini iyileştirmek için sesleri daha iyi yönetmek amacıyla odak isteğinde bulunması gerekiyor. Genel olarak, uygulamaların ses odak isteğinde bulunması için belirli kurallar geçerli olmaya devam eder:

  • Telefon araması, acil durum uyarısı veya güvenlik bildirimi dahil olmak üzere herhangi bir kalıcı yüksek öncelikli ses odak noktası olmadan uygulamalar geçici veya kalıcı olarak ses odak noktası elde edebilmelidir.

  • Medya odağı etkinken:

    • Telefon kullanımı odağına odaklanmayı isteyen uygulamalar, aramayı eşzamanlı olarak veya münhasıran alabilmelidir.

    • Gezinme kullanımı odağı isteyen uygulamalar, gezinme odağını eşzamanlı olarak veya münhasıran alabilmelidir.

    • Asistan kullanım odağını isteyen uygulamalar, kullanım odağını eşzamanlı olarak veya münhasıran alabilmelidir.

  • Ayaktayken yüksek öncelikli ses odaklı uygulamalar (telefon araması, acil durum uyarısı veya güvenlik bildirimi dahil) etkinken gelen gecikmeli ses odaklı isteklerin tümü izin verilmeli veya gerektiği şekilde ertelenmelidir.

Yukarıdaki öneriler her şeyi kapsamasa da etkin yüksek öncelikli ses yoksa odaklanma isteğinde bulunan uygulamaların odaklanmasına yardımcı olabilir. Yüksek öncelikli sesler etkinken bile gecikmeli odaklanma isteklerine yine de uyulmalıdır ve yüksek öncelikli ses durduğunda odaklanmaya başlanabilmelidir.