Ses Odaklanma

Bir mantıksal akış başlatmadan önce, bir uygulama, mantıksal akışı için kullanacağı aynı ses özniteliklerini kullanarak ses odağı talep etmelidir. Böyle bir odak talebinin gönderilmesi tavsiye edilirken, sistem tarafından zorunlu tutulmaz. Bazı uygulamalar, belirli davranışlar elde etmek için (örneğin, bir telefon görüşmesi sırasında kasıtlı olarak ses çalmak için) istek göndermeyi açıkça atlayabilir.

Bu nedenle, odağı birincil ses kontrol mekanizması olarak değil, oynatmayı dolaylı olarak kontrol etmenin ve çakışmayı gidermenin bir yolu olarak düşünmelisiniz; araç, ses alt sisteminin çalışması için odak sistemine bağlı olmamalıdır.

Odak etkileşimleri

AAOS'un ihtiyaçlarını desteklemek için, ses odak 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, reddetme ve eşzamanlı.

Özel etkileşim

Ö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. Buna bir örnek, mevcut bir uygulamada müzik zaten çalarken bir kullanıcının yeni bir müzik uygulaması başlatması olabilir. Her ikisi de medya oynattığından, uygulamalardan yalnızca birinin aynı anda odaklanmasına izin verilir. Sonuç olarak, yeni başlatılan uygulamanın odak isteği AUDIOFOCUS_REQUEST_GRANTED ile geri dönecek ve şu anda müzik çalan uygulama, yapılan isteğin türüne karşılık gelen bir kayıp durumu ile bir odak değiştirme olayı alacaktır. Bu, Android ile en sık görülen etkileşim modelidir.

Etkileşimi reddet

Reddetme etkileşimleri ile gelen istek her zaman reddedilir. Bir arama devam ederken müzik çalmaya çalışmak, reddedilen bir etkileşim örneğidir. Bu durumda, çevirici halihazırda bir arama için ses odağını ve müzik çalmak için ikinci bir uygulama istek odağını elinde tutuyorsa, müzik uygulaması talebine yanıt olarak AUDIOFOCUS_REQUEST_FAILED alacaktır. Odaklanma isteği reddedildiğinden, geçerli odak sahibine hiçbir türde odak kaybı gönderilmez.

Eşzamanlı etkileşim

AAOS için en benzersiz olan eşzamanlı etkileşimlerdir. Bu, arabada ses odaklama talep eden uygulamalara, diğer uygulamalarla aynı anda odak tutma yeteneği verir. Eşzamanlı bir etkileşimin gerçekleşmesi için aşağıdaki koşulların karşılanması gerekir. bu:

Bu kriterler karşılanırsa, odak isteği AUDIOFOCUS_REQUEST_GRANTED ile geri dönerken, mevcut odak sahibinin odakta hiçbir değişikliği olmaz. Bununla birlikte, mevcut odak tutucu, ördek olaylarını almayı veya eğildiğinde duraklamayı seçerse, mevcut odak tutucu, özel bir etkileşimde olduğu gibi odağı kaybedecektir.

Eşzamanlı akışları işleme

Eşzamanlı etkileşimin birçok yararlı uygulaması olsa da, OEM'ler, çıktı aygıtları arasında donanım düzeyinde karıştırma ve dağıtma ile ilgilenmek zorundadır. Bu nedenle, CarAudioContext yalnızca CarAudioContext aynı anda oynatamayacakları aynı çıkış aygıtına yönlendirilmeleri şiddetle tavsiye edilir. Eşzamanlı akışlar için ayrı çıkış aygıtlarına sahip olarak, bu, HAL'nin akışlardan birini karıştırmadan önce yönlendirmesini veya fiziksel akışları araçtaki farklı hoparlörlere yönlendirmesini sağlar. Mantıksal akışlar Android içinde karıştırılırsa kazançları değişmeyecek ve aynı fiziksel akışın parçası olarak teslim edilecektir.

Örneğin, navigasyon ve medya aynı anda teslim edildiğinde, navigasyon talimatlarının daha net duyulabilmesi için medya akışının kazanımı geçici olarak azaltılabilir (bükülebilir). 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österir. Satırlar, geçerli odak sahibinin CarAudioContext temsil eder ve sütunlar, gelen isteği temsil eder.

Bir müzik medya uygulamasının şu anda odağı elinde tuttuğu ve bir navigasyon uygulaması istek odağının olduğu bir örneğe bakıldığında, matris, Eşzamanlı etkileşimler için diğer kriterlerin karşılandığı varsayılarak iki etkileşimin aynı anda oynatılabileceğini gösterir.

Eşzamanlı etkileşimler nedeniyle, birden fazla odak tutucunun var olması mümkündür. Bu durumda, ne tür bir etkileşimin uygulanacağına karar vermeden önce, gelen bir odak talebi mevcut odak sahiplerinin her biri ile karşılaştırılacaktır. Bu durumda, en muhafazakar etkileşim kazanır (reddet, sonra dışla ve nihayet eşzamanlı).

Aşağıdaki tabloda, gelen bir odak isteği (sütunlar) için CarAudioContext ile mevcut odak tutucuların (satırlar) bağlamı arasındaki odak etkileşimleri sağlanmaktadır. Her hücre, iki bağlam için beklenen etkileşim türünü temsil eder, burada:

  • R: Etkileşimi reddet
  • E: Özel etkileşim
  • C: Eşzamanlı etkileşim

Ses odak etkileşimleri

Şekil 1. Ses odak etkileşimleri

Android 11'de, kullanıcıların navigasyon ve telefon görüşmeleri arasındaki etkileşim davranışını değiştirmesine olanak tanıyan yeni bir kullanıcı ayarı tanıtıldı. 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 reddetmeye değiştirir. Bu nedenle, bir kullanıcı navigasyon talimatlarının aramasını kesintiye uğratmasını istemezse bu ayarı etkinleştirebilir. Bu, kullanıcı için kalıcıdır ve sonraki odak isteklerinin yeni ayar değerine uymasını sağlamak için dinamik olarak ayarlanabilir.

Gecikmeli ses odaklama

Android 11'de AAOS, gecikmeli ses odağı istemek için destek ekledi. Bu, geçici olmayan odak isteklerinin, mevcut odak sahipleri ile etkileşimleri normalde reddedilmeleriyle sonuçlanacağı zaman ertelenmesine olanak tanır. Odaktaki bir değişiklik, geciken isteğin odak kazanabileceği bir duruma yol açtığında, istek verilecektir.

Gecikmeli ses odak istekleri için kurallar

  • Yalnızca geçici olmayan istekler - daha önce belirtildiği gibi, gecikmeli bir istek yalnızca geçici olmayan kaynaklar için yapılabilir. Bu, alakalı olduktan uzun süre sonra geçici bir ses çalmasını önlemek içindir.
  • Bir seferde yalnızca bir istek ertelenebilir - Halihazırda gecikmiş bir istek varken geciktirilebilir bir istek yapılırsa, orijinal geciken istek bir AUDIOFOCUS_LOSS değişiklik olayı alacak ve yeni istek AUDIOFOCUS_REQUEST_DELAYED eş zamanlı yanıtını alacak.
  • Gecikebilir isteklerin bir OnAudioFocusChangeListener sahip olması gerekir . Bir istek geciktiğinde, dinleyici, istek sonunda verildiğinde ( AUDIOFOCUS_GAIN ) veya daha sonra reddedilirse ( AUDIOFOCUS_LOSS ) istekte bulunanı bilgilendirmek için kullanılacaktır.

Gecikmeli odak iste

Gecikebilecek bir istek oluşturmak için 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();

Ardından, istekte AUDIOFOCUS_REQUEST_DELAYED yanıtını işleyin:

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;
}

İstek geciktiğinde, odak dinleyicisi odaktaki değişiklikleri işlemekten sorumludur:

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ölgesine sahip araçlarda, ses odağı her bir bölge için bağımsız olarak yönetilecektir. Bu nedenle, bir bölgeye yapılan istek, diğer bölgelerde odağı tutan şeyi hesaba katmaz ve diğer bölgelerdeki odak sahiplerinin odağı kaybetmesine neden olmaz. Bununla, ana kabinin odağı arka koltuk eğlence sisteminden ayrı olarak yönetilebilir, böylece bir bölgedeki odak değişiklikleriyle bir bölgedeki ses çalmanın kesintiye uğraması önlenir.

Tüm uygulamalar için odak yönetimi, CarAudioService tarafından otomatik olarak halledilir. Bir odak isteğinin ses bölgesi, ilişkili UserId veya UID göre belirlenir. Ayrıntılar için, bkz. Ses Yönlendirme .

Aynı anda birden fazla bölgeden ses isteme

Bir uygulama aynı anda birden fazla bölgede ses çalmak istiyorsa AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID her bölge için odak talep etmelidir:

//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 belirtilen bölge kimliğini kullanmak için otomatik ses bölgesi eşlemelerini geçersiz kılmasına izin verir. Bu nedenle, bununla bir uygulama, farklı ses bölgeleri için ayrı isteklerde bulunabilir.

HAL Ses Odaklanma

Android 11'den başlayarak, HAL artık harici akışlar adına odak isteğinde bulunmak üzere etkinleştirilmiştir. İsteğe bağlı olmakla birlikte, bu API'ler, harici seslerin Android ekosisteminde daha iyi katılımcılar olmasını sağlamak ve daha sorunsuz bir kullanıcı deneyimi sağlamak için şiddetle teşvik edilir.

Hangi seslerin öncelikli olması gerektiği konusunda son çağrıyı yapmaktan HAL'nin hala sorumlu olduğunu unutmayın. Bu kapsamda, HAL'a 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 etmelidir. Aynısı, yönetmeliklerin gerektirdiği tüm sesler için de geçerlidir.

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

AudioControl@2.0

AudioControl HAL 2.0 Sürümü birkaç yeni API sunar:

API Amaç
IAudioControl#registerFocusListener AudioControl HAL ile bir IFocusListener örneğini kaydeder. Bu dinleyici, HAL'nin ses odağını istemesini ve bırakmasını sağlar. HAl'ın, dinleyicinin kaydını silmek için Android tarafından kullanılacak bir ICloseHandle örneği sağlaması beklenir.
IAudioControl#onAudioFocusChange HAL tarafından IFocusListener aracılığıyla yapılan odak isteklerine odaklanmak için durumdaki değişiklikleri IFocusListener . Bu, ilk odak isteklerine verilen yanıtları içerir.
IFocusListener#requestAudioFocus İstekler, belirtilen bir kullanım, bölge kimliği ve odak kazancı türü için HAL adına odaklanır.
IFocusListener#abandonAudioFocus Belirtilen kullanım ve bölge kimliği için mevcut HAL odak isteklerini terk eder.

HAL, aynı anda birden fazla odak isteğine sahip olabilir, ancak kullanım ve bölge kimliği eşleştirmesi başına bir istekle sınırlıdır. Android'in, bir istek yapıldığında HAL'ın kullanım için hemen ses çalmaya başlayacağını ve odaktan ayrılana kadar bunu yapmaya devam edeceğini varsaydığını unutmayın.

registerFocusListener dışında, bu isteklerin tümü, bir odak isteği işlenirken Android'in HAL'ı geciktirmemesini sağlamak için oneway . HAL, güvenlik açısından kritik sesleri çalmadan önce odaklanmayı beklememelidir . Uygun olduğunda teşvik edilse de, IAudioControl#onAudioFocusChange aracılığıyla ses odağındaki değişiklikleri dinlemesi ve bunlara yanıt vermesi isteğe bağlıdır.