Ses düzeyi yönetimi

Ses düzeyi yönetimi, CarAudioService uygulamasında yer alır. Bu birimde, birimlerin HAL'nin altında yazılım yerine bir donanım yükseltici tarafından uygulanması beklentisiyle sabit birimler kullanılır. CarAudioService, çıkış cihazlarını ses grupları halinde düzenleyerek aynı kazanımları bir birim grubuyla ilişkili tüm cihazlara uygular.

Sabit hacimler

AAOS uygulamaları, sesi kontrol etmek için yazılım mikser yerine bir donanım amplifikatörü kullanır. Yan etkilerden kaçınmak için config_useFixedVolume işaretini true olarak ayarlayın (gerektiğinde yer paylaşımlı olarak):

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

config_useFixedVolume işareti ayarlanmadığında (veya false olarak ayarlandığında) uygulamalar, yazılım karıştırıcıdaki akış türüne göre ses düzeyini değiştirmek için AudioManager.setStreamVolume() yöntemini çağırabilir. Bu, diğer uygulamalar üzerindeki olası etkiler ve yazılım karıştırıcıdaki ses seviyesi azaltma işleminin donanım amplifikatörü tarafından alındığında sinyalde daha az sayıda anlamlı bit kullanılmasına yol açabileceğinden her zaman istenen bir durum olmayabilir.

Birim grupları

Ses düzeyi grupları, bir ses bölgesindeki cihaz koleksiyonunun ses düzeylerini yönetir. Ses düzeyi, her ses grubu için bağımsız olarak kontrol edilebilir. Sonuçta ortaya çıkan kazançlar, araç amplifikatörü tarafından uygulanacak ilişkili cihazlarda yapılandırılır. Birim ayarları, kullanıcı için kalıcı olur ve kullanıcı oturum açtığında yüklenir.

Ses gruplarını tanımlama

CarAudioService, car_audio_configuration.xml içinde tanımlanan ses düzeyi gruplarını kullanır:

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <device address="bus0_media_out">
                        <context context="music"/>
                    </device>
                </group>
                <group>
                    <device address="bus1_navigation_out">
                        <context context="navigation"/>
                    </device>
                    <device address="bus2_voice_command_out">
                        <context context="voice_command"/>
                    </device>
                </group>
                ...
            </volumeGroups>
        </zone>
     </zones>
</audioZoneConfiguration>

Her birim grubunda, ilişkili adreslere sahip bir veya daha fazla çıkış cihazı bulunmalıdır. Adresler, audio_policy_configuration.xml özelliğinde tanımlanan çıkış cihazlarına karşılık gelmelidir.

Birim grubu kazançlarını yapılandırma

Her ses grubu için minimum, maksimum ve varsayılan kazanç değerlerinin yanı sıra ses düzeyi grubuyla ilişkilendirilmiş cihazlar için audio_policy_configuration.xml içinde yapılandırılmış değerlere dayalı bir adım boyutu bulunur.

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

Ses düzeyi grubu, başlatma sırasında ilişkili cihazların kazanç değerlerini kontrol eder ve grubu aşağıdaki şekilde yapılandırır:

  • Adım boyutu. Ses düzeyi grubu tarafından kontrol edilen tüm cihazlar için aynı olmalıdır.
  • Minimum kazanç. Gruptaki cihazlar arasındaki en düşük minimum kazanç.
  • Maksimum kazanç. Gruptaki cihazlar arasında en yüksek maksimum kazanım.
  • Varsayılan kazanç. Gruptaki cihazlar arasında en yüksek varsayılan kazanç.

Bu değerlerin yapılandırılma şekli göz önünde bulundurulduğunda, ses seviyesi grubuyla ilişkilendirilmiş bir cihaz için desteklenen aralığın dışındaki bir hacim grubunun kazancını ayarlamak mümkündür. Bu durumda bu cihaz için kazanç, ses düzeyi grubunun değerinin aralığın altında mı yoksa üzerinde mi olduğuna bağlı olarak cihazın minimum veya maksimum kazanç değerine ayarlanır.

Birim grubu tanımlayıcıları

Birim grupları, çalışma zamanında XML dosyasında tanımlanan sırayla tanımlanır. Kimlikler, bir ses alt bölgesinde 0 ile N-1 arasında değişir. N bu bölgedeki ses düzeyi gruplarının sayısıdır. Bu şekilde, birim grubu kimlikleri alt bölgeler arasında benzersiz olmaz. Bu tanımlayıcılar, hacim gruplarıyla ilişkilendirilmiş CarAudioManager API'leri için kullanılır. zoneId olmadan bir groupId alan API'leri varsayılan olarak birincil ses bölgesini kullanır.

Çoklu alt bölge hacim yönetimi

Her ses bölgesinin bir veya daha fazla ses düzeyi grubuna sahip olması beklenir ve her ses düzeyi grubu yalnızca tek bir ses bölgesiyle ilişkilendirilir. Bu ilişki car_audio_configuration.xml kapsamında tanımlanmıştır. Daha fazla bilgi edinmek için yukarıdaki Birim gruplarını tanımlama bölümündeki örneğe bakın.

Her alt bölgenin mevcut ses düzeyleri, söz konusu alt bölgeyle ilişkilendirilmiş kullanıcı için kalıcı olur. Bu ayarlar alt bölgeye özgüdür. Yani, kullanıcı birincil alt bölgeyle ilişkilendirilmiş bir ekranda oturum açar ve daha sonra ikincil bir ses alt bölgesiyle ilişkilendirilmiş alt bölgede oturum açarsa birinci alt bölge için yüklenen ve devam eden ses düzeyleri, ikincil alt bölgeninkinden farklıdır.

Ses düzeyiyle ilgili önemli etkinlikleri işleme

Android, ses seviyesi kontrolü için çeşitli tuş kodları tanımlar. Örneğin:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Varsayılan olarak Android, ses seviyesi önemli etkinliklerini uygulamalara yönlendirir. Otomotiv uygulamaları, bu önemli etkinlikleri CarAudioService tarafından işlenmeye zorlamalıdır. Bu işlem daha sonra setGroupVolume veya setMasterMute yöntemini uygun şekilde çağırır. Bu davranışı zorunlu kılmak için config_handleVolumeKeysInWindowManager işaretini true değerine ayarlayın:

<resources>
    <bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>

Ses seviyesi önemli etkinlikleri şu anda hangi alt bölgeye yönelik olduğunu ayırt edemez ve tümünün birincil ses alt bölgesiyle ilişkilendirilmiş olduğu varsayılır. Ses düzeyi önemli bir etkinlik alındığında CarAudioService, etkin oynatıcılar için ses bağlamlarını getirip en yüksek öncelikli ses bağlamıyla ilişkilendirilmiş çıkış cihazını içeren ses düzeyi grubunu ayarlayarak hangi ses düzeyi grubunun ayarlanacağını belirler. Önceliklendirme, CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY içinde tanımlanan sabit bir sıralamaya göre belirlenir.

Kararma ve dengeleme

AudioControl HAL'nin her iki sürümü de araçta karartmayı ve dengeyi ayarlamak için API'ler içerir. CarAudioManager için karşılık gelen sistem API'leri, değerleri AudioControl HAL'ye iletir. Bu API'ler için android.car.permission.CAR_CONTROL_AUDIO_VOLUME gereklidir. AudioControl API'leri şunlardır:

  • setBalanceTowardRight(float value), hoparlörün ses düzeyini arabanın sağ (+) veya sol (-) tarafına doğru kaydırır.

    • 0,0 ortalandı
    • +1.0 tamamen doğru
    • -1,0 tamamen sol tarafta
    • -1 ila 1 aralığının dışındaki bir değer hatadır
  • setFadeTowardFront(float value), hoparlörün ses düzeyini arabanın ön (+) veya arkasına (-) doğru kaydırır.

    • 0,0 ortalandı
    • +1.0 tamamen ileridir
    • -1,0 tamamen arkadır
    • -1 ila 1 aralığının dışındaki bir değer hatadır

Bu değerlerin nasıl uygulanacağına ve değerlerin kullanıcılara nasıl gösterileceğine siz karar verirsiniz. Yalnızca medyaya veya genel olarak tüm Android seslerine uygulanabilirler. Android 11, çıkış cihazlarına ses efektleri uygulama desteğini de sundu. Bu sayede, bu API'ler yerine uygun çıkış cihazlarındaki ses efektleriyle solma ve dengelemeyi alternatif olarak yönetebilirsiniz.

Sesi kısma

Sesi kısma, araç aynı anda oynatılan başka bir akışın daha net duyulabilmesi için bir akışta kazancı azalttığında gerçekleşir. AAOS'ta sesi kısma, HAL tarafından uygulanır. Android'in, işletim sistemi dışındaki sesler üzerinde kontrolü yoktur. Android 11'de uygulamaların kısma kararı vermek için HAL'nin kullanabileceği temel bilgi, her iki çıkış cihazının da etkin akış olup olmadığıdır.

Ne zaman kapatılmalı?

Sesi kısma özelliğinin HAL tarafından nasıl ele alınacağına karar vermek bireysel OEM'in sorumluluğunda olsa da aşağıdaki yönergeleri öneririz.

  • Android'de birden fazla akış, genellikle iki uygulama veya hizmet aynı anda ses odağını koruduğunda ortaya çıkar. Android'in ne zaman eşzamanlı odaklanma sağlayabileceğini öğrenmek için Kısıtlama türleri bölümündeki etkileşim matrisine bakın. Araç ses eklentisi kullanıma sunulduğunda bu, aynı zamanda AudioFocus yönetiminize de bağlıdır.

  • Android ile karıştırılan tüm akışlar, herhangi bir kazanç uygulanmadan önce yapılır. Bu nedenle, bir başkasıyla eş zamanlı olarak oynatıldığında düşürülmesi gereken akışlar, ayrı çıkış cihazlarına yönlendirilmelidir. Böylece HAL, karıştırmadan önce kısmayı uygulayabilir.

Aşağıda, etkisinin azaltılması önerilir. Eşzamanlı olası etkileşimleri görebilirsiniz.

Etkileşim İşlem
EMERGENCY SAFETY hariç her şeyin sesini kapatır veya sesini kapatır
SAFETY EMERGENCY dışındaki her şeyi kapatır
NAVIGATION SAFETY ve EMERGENCY dışındaki her şeyi kapatır
CALL SAFETY, EMERGENCY ve NAVIGATION dışındaki her şeyi keser
VOICE Ördekler CALL_RING
VEHICLE_SOUNDS Aktif sesin önemini ve diğer sesleri kıslayıp kesmediğini siz belirlersiniz.
MUSIC ve ANNOUNCEMENT Her şeyden mahrum kaldım. SYSTEM_SOUND olarak çalınan dokunma etkileşimi tonları istisnadır.

Sesi kısma sırasında dikkat edilmesi gereken noktalar

Navigasyon veya asistan gibi bazı uygulamalar ve hizmetler, işlem gerçekleştirmek için birden fazla oynatıcı kullanabilir. Navigasyon veya asistan uygulaması başlatılmadan önceki oynatmadan önce medyanın küçülmeden önce tam ses düzeyine dönmediğinden emin olmak için, veri akışının çıkış cihazlarından durdurulduğu durumlarda agresif bir ayrıntılandırmadan kaçının.

Yeterince iyi izolasyona sahip birden fazla ses sahnesine sahip araçlarda, sesi kısmak yerine arabanın farklı alanlarına yönlendirebilirsiniz. Örneğin, navigasyon talimatları kabin içinde normal ses seviyesinde müzik çalmaya devam ederken sürücünün koltuk başlığı hoparlörlerine yönlendirilebilir.

Güvenlikle ilgili önemli sesler

Android 11'de HAL ses odağı API'leri kullanıma sunuldu. HAL, güvenlik açısından kritik seslerin diğer seslere göre öncelikli olmasını sağlar. HAL, ses odağını USAGE_EMERGENCY için tutuyorsa Android uygulama ve hizmetlerin ses çalmayacağı garanti edilmez. HAL, Android'den gelen hangi akışların güvenlik açısından kritik seslerin çalınması için karıştırılması veya sesinin kapatılması gerektiğini belirler.

Ses düzeyi ayarları kullanıcı arayüzünü yapılandırma

AAOS, ses düzeyi ayarları kullanıcı arayüzünü ses düzeyi grubu yapılandırmasından ayırır. Bunların üzerine, Hacim grubu kazançlarını yapılandırma bölümünde açıklandığı gibi yerleştirilebilirler. Bu ayırma, birim gruplarının yapılandırmasının değişmesi durumunda hiçbir değişiklik yapılmasını gerektirmez.

Araba ayarları kullanıcı arayüzünde packages/apps/Car/Settings/res/xml/car_volume_items.xml, tanımlanan her AudioAttributes.USAGE ile ilişkili kullanıcı arayüzü öğelerini (başlık ve simge kaynakları) içerir. Bu dosya, her bir VolumeGroup öğesinde bulunan ilk tanınan kullanımla ilişkili kaynakları kullanarak tanımlanan VolumeGroups öğesinin makul şekilde oluşturulmasını sağlar.

Örneğin, aşağıdaki örnekte VolumeGroup öğesi, voice_communication ve voice_communication_signalling dahil olarak tanımlanmaktadır. Araba ayarları kullanıcı arayüzünün varsayılan olarak uygulanması, VolumeGroup öğesini, dosyadaki ilk dosya olan voice_communication ile ilişkili kaynakları kullanarak oluşturur.

<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
    <item car:usage="voice_communication"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="voice_communication_signalling"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="media"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="game"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="alarm"
          car:title="@*android:string/volume_alarm"
          car:icon="@*android:drawable/ic_audio_alarm"/>
    <item car:usage="assistance_navigation_guidance"
          car:title="@string/navi_volume_title"
          car:icon="@drawable/ic_audio_navi"/>
    <item car:usage="notification_ringtone"
          car:title="@*android:string/volume_ringtone"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistant"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="notification"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_request"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_instant"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_delayed"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_event"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_accessibility"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_sonification"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="unknown"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>

Yukarıdaki yapılandırmada kullanılan özellikler ve değerler packages/apps/Car/Settings/res/values/attrs.xml içinde tanımlanmıştır. Ses düzeyi ayarları kullanıcı arayüzü, aşağıdaki VolumeGroup tabanlı CarAudioManager API'lerini kullanır:

  • Kaç tane kontrol çizilmesi gerektiğini öğrenmek için getVolumeGroupCount().
  • Alt ve üst sınırları almak için getGroupMinVolume() ve getGroupMaxVolume().
  • Mevcut ses seviyesini öğrenmek için getGroupVolume() tuşlarına basın.
  • Hacim değişiklikleri hakkında bildirim almak için registerVolumeChangeObserver().

Arabanın ses seviyesi grubu etkinliği

Ses düzeyi güncelleme ve sesi kapatma açma/kapatma gibi otomotiv kullanım alanlarında, belirli uygulamaların işlemlerini (ör. ses düzeyi ayarları) tanımlayabilecek bağlamsal alt öğeler bulunur. Araç ses yığınından gelen mevcut ses düzeyi ve sesi kapatma geri çağırması, sınırlı bağlam bilgisi sağlar. CarVolumeGroupEvent, otomotiv kullanım alanlarını ve gelecekteki ölçeklenebilirliği daha iyi sunmak için Android 14'e eklendi. Her etkinlikte üç kritik bilgi türü bulunur:

  • CarVolumeGroupInfo listesi
  • EventTypes (bit eşlenmiş)
  • ExtraInfos listesi

AraçbirimiGrupBilgisi

Etkinlik geri çağırmasının alıcısı, etkilenen araç ses seviyesi grubu bilgilerinin listesine hazır erişime sahip. Bu, uygulamanın en son durumu almak için Araba ses çerçevesine ek çağrı yapmasına gerek olmadığı anlamına gelir. Kullanıcı arayüzünü veya dahili durumları güncellemek için sadece alınan CarVolumeGroupInfos'yi kullanabilir. Uygulamaların kullanımını kolaylaştırmak için, bir araç ses seviyesi grubunda değişen özellikler, aşağıda açıklandığı gibi EventTypes kapsamında da sağlanır.

Etkinlik Türleri

CarVolumeGroupInfo özelliğinin hangi özelliğinin değiştiğini tanımlar. Uygulamalar bunu değişiklikleri tespit etmek ve gerekli işlemleri yapmak için kullanabilir. Örneğin, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED, ilgili CarVolumeGroups maksimum hacim kazanç dizininin değiştiğini ve CarVolumeGroupInfo.getMaxVolumeGainIndex() ile sorgulanabileceğini gösterir.

Aşağıdaki tabloda EventType ile CarVolumeGroupInfo arasındaki ilişki gösterilmektedir.

Etkinlik Türü AraçbirimiGrupBilgisi
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isSessiz()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
ETKİNLİK_TÜRÜ_ATTENUATION_DEĞİŞTİRİLDİ CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_DEĞİŞTİRİLDİ CarVolumeGroupInfo.getAudioAttributes()

Ek bilgiler

CarVolumeGroup belgesinin neden değiştiğiyle ilgili ek bilgi sağlar. Uygulamalar bu bilgileri, kullanıcıyı harekete geçmesi veya bilgilendirmesi için ek bağlam sağlamak amacıyla kullanabilir. Örneğin EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL, termal aşırı yük nedeniyle aktif bir geçici zayıflamayı gösterir. Uygulama, kullanıcıyı sesi artırmaya çalıştığında bilgilendirebilir.

ExtraInfos için herhangi bir süreç zorunlu kılınmamaktadır. Sürecin ExtraInfos doğrultusunda belirlenmesi sizin takdirinize bağlıdır. Örneğin, EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED nedeniyle ses azaltma etkinse kullanıcının ses düzeyini değiştirmesini önlemek için başlangıçta ses düzeyi çubuğunun kullanıcı arayüzünü karartmayı da seçebilirsiniz. Diğerleri ise kısmanın etkin olduğunu belirten bir kısa mesaj göstererek kullanıcının ses seviyesini değiştirmesine izin vermeyi tercih edebilir.

Araç ses çerçevesi, önerilen ExtraInfos öğesini sağlamak için AudioControl HAL IAudioGainCallback kullanır. Daha fazla bilgi edinmek için Ses Artışı Geri Çağırması bölümüne bakın.

CarVolumeGroupEvent, araç ses çerçevesinin gelecekteki ihtiyaçlarını karşılayacak şekilde ölçeklendirilir. Yeni özellikleri yalnızca CarVolumeGroupEvent üzerinden desteklemeyi amaçlıyoruz. Uygulama geliştiricilerin grup hacmini yönetmek ve değişiklikleri yoksaymak için CarVolumeGroupEvent kullanmalarını önemle tavsiye ederiz.

Araba ses düzeyi grubu etkinliği geri araması

Android 14, ayrıcalıklı ve platform uygulamaları için yeni bir geri çağırma olanağı sunar ve CarVolumeGroupEvents ile ilgili bildirim alma ve kaydetme olanaklarını sağlar.

  • Geri çağırmaya kaydolmak için şunu kullanın: CarAudioManager#registerCarVolumeGroupEventCallback()

  • Geri çağırma kaydını iptal etmek için CarAudioManager#unregisterCarVolumeGroupEventCallback() işlevini kullanın

Bir uygulama yeni CarVolumeGroupEventCallback ve eski CarVolumeCallback ile kaydolursa CarVolumeGroupEventCallbacks etkinliğine öncelik verilir. Araba ses yığını artık CarVolumeCallback cihazını tetiklemiyor. Böylece aynı etkinlik için aynı uygulamanın yinelenen tetikleyicileri önlenmiş olur.

Grup hacmini yönetmek ve değişiklikleri yoksaymak için CarVolumeGroupEventCallback kullanmanızı kesinlikle öneririz.

Ses kazancı geri çağırması

AudioControl HAL, Android 13'ten itibaren araba ses sisteminde yapılan değişiklikler nedeniyle ses seviyesi güncellemelerinin yönetilmesi için eşzamansız bir geri çağırma tetikleyebilmektedir.

HAL API'sı

2.0 AIDL'de AudioControl

AudioControl AIDL HAL sürüm 2.0 aşağıdaki API'yı eklemektedir:

API Amaç
IAudioControl#registerGainCallback AudioControl HAL ile bir IAudioGainCallback örneğini kaydeder.
IAudioGainCallback#onAudioDeviceGainsChanged Ses kazancı yapılandırmasındaki değişiklikleri bildirmek için eşzamansız geri arama.

AudioControl HAL geri çağırması nedenlerin listesini ve ilgili AudioGainConfigInfo öğesini içerir. Bu listeler şunları içerir:

  • Bölge Kimliği
  • Cihaz bağlantı noktası adresi
  • Hacim dizini > dizin, kısıtlanmış bir dizin veya güncelleme dizini olabilir.

Nedenler geniş bir şekilde aşağıdaki şekilde kategorize edilebilir:

  • Kısıtlama nedenleri. Ses düzeyi ve sesi kapatma davranışında geçici değişiklik.
  • Nedenleri güncelleyin. Hacim davranışında kalıcı değişiklik.

Kısıtlama türleri

AudioControl HAL AIDL V3 itibarıyla desteklenen kısıtlama türleri şunlardır:

  • Sesi kapatın
  • Blokaj
  • Sınırlama
  • Zayıflama
Etkin kısıtlama Kullanıcı tarafından tetiklenen hacim değişikliği Kullanıcı tarafından tetiklenen sesi kapatma açma/kapatma düğmesi
Sesi kapatın ❌ (sesi aç)

✔ (sesi aç)
Blokaj
Sınırlama ❌ (sınırın üzerinde)

✔ (sınırın altında)
Zayıflama

Kısıtlamalar arasındaki öncelik, Sesi kapat > Engelleme > Sınırlama > Azaltma'dır.

Kısıtlamaları yoksay

Sesi kapatma kısıtlamaları şunlardır:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Araç ses çerçevesi dahili olarak aşağıdaki iki ses kapatma durumunu korur:

  • Kullanıcı yoksayar. Kullanıcının isteğine göre CarAudioManager veya önemli etkinlikler aracılığıyla açılır.

  • HAL sesini kapatma. AudioGain geri çağırması üzerinden alınan sesi kapatma kısıtlamalarına göre açıldı.

Ayarlar uygulaması gibi dinleyiciler için ses grubu genel sesini kapatma (CarVolumeGroupInfo.isMuted()) durumu, yukarıdaki ses kapatma işlemlerinden herhangi birinin etkinleştirilip etkinleştirilmediğine bağlı olarak belirlenir.

HAL sesini kapatma etkinleştirildiğinde, gelen ses seviyesi değişikliği ve grubun sesini açma istekleri, kısıtlama süresince yoksayılır.

Etkileşim destek kaydı: HAL sesini kapatma etkin etkin ve Ses kapatma için kullanıcı istekleri.

HAL kapatma etkin olduğunda ve Kullanıcı sessize alma devre dışı bırakıldığında:

  • Ses grubu genel sesini kapatma durumu true olarak değiştirildi.
  • Kullanıcının yoksaymayı etkinleştirme istekleri işleme alınır.
    • Nedeni: Kullanıcıların gizliliğini korumak amacıyla, kullanıcıların yoksayma istekleri her zaman dikkate alınmalıdır.

HAL kapatma etkin ve Kullanıcı yoksayma etkin olduğunda:

  • Ses grubu genel sesini kapatma durumu true olarak değiştirildi.

  • Kullanıcının yoksaymayı devre dışı bırakma istekleri NOT işlenir. Önbelleğe Alınan Kullanıcı sessiz durumu etkin kalır.

    • Neden: Kullanıcıların yoksaymaktan vazgeçme istekleri yalnızca etkin kısıtlama yoksa kabul edilir.

    • Neden: Önbelleğe alınan Kullanıcı sesini kapatma özelliğinin kapatılması, istenmeyen ses patlamalarına neden olabilir ve kullanıcı güvenliğini tehlikeye atabilir. Bu durum, özellikle ses seviyesi algısının kullanıcıların farkındalığını azaltan ateşleme döngüleri genelinde ses kapatma durumunun etkinleştirildiği durumlarda geçerlidir.

Etkileşim destek kaydı: Kullanıcı sessize alma işleminde herhangi bir değişiklik yokken HAL sessize alma etkinleştirildi ve devre dışı bırakıldı

HAL sesinin kapatılması, ses grubunun genel sesini kapatma durumunu değiştirir. Ancak kullanıcının yoksayma durumunu doğrudan güncellemez. Kullanıcı sesini kapatma devre dışı bırakıldığında ve etkinleştirmek için HAL yoksayma geri çağırması alındığında:

  • Ses grubu genel sesini kapatma durumu true olarak değiştirildi.
  • HAL kapatma etkin durumdayken, kullanıcının ses düzeyini değiştirme istekleri NOT işlenir.

    • Neden: Ses kapatma etkin durumdayken kullanıcı sesi algılayamaz. Ses seviyesinin değiştirilmesine izin verilirse ses patlayabilir ve kullanıcı güvenliğini tehlikeye atabilir.

    • Neden: Ses düzeyi uygulamaları geri çağırma işlevlerine kaydolabilir ve sesi açmayı tetikleyebilir (CarAudioManager.setVolumeGroupSes, OEM tarafından beklenen davranış buysa, kullanıcı müdahalesi olmadan bu işlemleri otomatik olarak yapar).

Kullanıcı sessize alma özelliği devre dışıyken HAL kapatma özelliği devre dışı bırakıldığında:

  • Ses grubunun sesini kapatma durumu false olarak değiştirildi.

    Nedeni: Sesi kapatma durumunu sabit hale getirmek ve Kullanıcının sesi açmasını istemek, sesi kapatma durumları sık sık geçiş yaptığında gereksiz yere Kullanıcı'nın çalışmasını kesintiye uğratabilir.

  • Kullanıcıların hacmi değiştirme istekleri normal şekilde işlenir.

Blokaj

Engelleme kısıtlamaları şu şekildedir:

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE.

Engelleme kısıtlamaları etkin olduğunda kullanıcılardan gelen istekler:

  • Ses değişiklikleri iş edilmez.
  • Sesi kapatma/açma işlemleri işlenir.

Sınırlama

Sınırlama kısıtlamaları şunlardır:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Sınırlama kısıtlamaları etkin olduğunda kullanıcılardan gelen istekler:

  • Ses düzeyini değiştirme:

    • Sınırlama içinde işlenir
    • Sınırlamanın üzerindeki öğeler işlenmez
  • Sesi kapatma/açma işlemleri işlenir.

Zayıflama

Azaltma kısıtlamaları şunlardır:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

Zayıflama kısıtlamaları etkin olduğunda kullanıcılardan gelen istekler:

  • Ses seviyesi değişiklikleri işlenir. Yeni geçerli ses düzeyi, sesi azaltılmış sese (eski ses düzeyi yerine) ayarlanır. Gelecekteki hacim değişiklikleri bu düzeyden yapılır.

  • Sesi kapatma/açma işlemi işlendi.

Dizine güncelle

Aşağıdakiler, eşzamansız hacim dizini güncellemesi olarak kabul edilir: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

Bu nedenle, AudioControl HAL, ses düzeyi grubunun mevcut dizinini belirtilen dizine güncelleyebilir. Bu, esas olarak Araba ses çerçevesinden gelen ses seviyesi değişikliği isteği için ses sisteminden geri bildirim olarak kullanılır. Dizin güncellemesi, dizini senkronize etmek için Apps'e bir CarVolumeGroupEvent geri çağırması olarak da iletilir.

Örnekler

Kullanım Örneği: Kullanıcı, hacim dizinini 30 olarak günceller

  • Kullanıcı, hacim dizinini 30 olarak değiştirmek için Cilt uygulamasını kullanır.

  • Bu dizin, ses kazancına dönüştürülür ve Ses HAL'ye gönderilir.

  • Audio HAL tedarikçi firma uygulamaları, yeni ses seviyesi kazancını alır ve ses sistemini (ör. harici amplifikatör) günceller.

  • Ses sistemi, ses düzeyinin yalnızca dizin 15 olarak güncellendiğini (Android tarafından bilinmeyen nedenlerle) yanıt verir.

  • AudioControl HAL tetikleyicilerinin satıcı uygulamaları:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Araba ses hizmeti, kalıcılık ve ses seviyesi uygulamasına geri çağrılar için kullanılan geri çağırmanın yeni dizinini kullanır. Kullanıcının istediği dizin 30'dur. Ancak, ses sistemi eşzamansız geri bildirimi, dizini 15 olarak günceller.

Kullanım alanı: Askıya alma işleminden çıkıldıktan sonra ilk ses çalma

  • Askıya alma işleminden önceki hacim dizini 95 değerine (aralık: [0-99]) ayarlandı.

  • Android, askıya alma işlemine girer.

  • Android askıya alındığında (örneğin, devam ettirme):

    • Audio HAL/AudioControl HAL tedarikçisi, ses sistemine yerel olarak 30'luk güvenli bir dizin uygular.

    • AudioControl HAL tedarikçisi, güvenli dizin için geri çağırmayı da tetikliyor:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Araba ses hizmeti, kalıcılık için kullanılan geri çağırmanın yeni dizinini ve dizini senkronize eden ses düzeyi uygulamasına kendi geri çağırmasını kullanır. Askıya alma işleminden önceki hacim dizini 95'tir. Ancak devam ettirildikten sonra bu dizin, AudioControl HAL uygulaması tarafından güvenli ses düzeyi olarak 30'a ayarlanır.

Dinamik birim yapılandırması

Bu özellik için aşağıdaki temel kullanım alanlarını göz önünde bulundururuz:

  1. Araç çizgi sonu (EOL) yapılandırması.

    • Otomobil üreticileri, araç ses sistemi kurulumuna bağlı olarak EOL'deki ses düzeyi yapılandırmalarını güncellemeyi tercih ederler. Genellikle bu, Android SW görüntüsü güncellenmeden dışa aktarılan bir yüklemedir.

    • Otomobil üreticilerinin bir hizmet planı sırasında birim yapılandırmasını güncellemesi gerekebilir.

  2. Çalışma zamanı yapılandırması. Otomotiv ses sistemleri, harici amplifikatör yapılandırmalarını destekler ve bu ECU'lar, başlatma sırasında sorgulanan ses aralığı yapılandırmaları barındırabilir.

  3. İsteğe bağlı yapılandırma. Kullanıcıların bir süreliğine gelişmiş sinyal işlemeye abone olduğu talebe dayalı ses özelliklerine yönelik artan ihtiyacı desteklemek için sunulur. Yeni hacim aralığı yapılandırmaları abonelik süresince geçerlidir.

Tasarım

Dinamik birim yapılandırması üç aşamada gerçekleştirilir:

  • Keşif. Tedarikçi firma AudioControl HAL uygulaması, tedarikçi firmaya ait özel bir IPC mekanizması aracılığıyla yeni ses seviyesi güncellemelerini tespit eder.

    Bulunduktan sonra AudioControl::IModuleChangeCallback üzerinden bir geri çağırma oluşturulur.

  • Güncelleyin. Araç ses grubu, ses düzeyi grubu durumlarını yeni ses düzeyi aralıklarıyla günceller.

    Hacim aralığı güncellemesinden sonra aynı hacim düzeyini korumak için çalışılmaktadır. Bununla birlikte, dizin sınırların dışında kalırsa mevcut hacim endeksi güvenli bir değere ayarlanır. Örneğin, geri arama sırasında tedarikçi firma tarafından sağlanan varsayılan düzey.

  • Geri arama.

    • Ses grubu aralığı güncellendikten sonra araç ses yığını, CarVolumeGroupEventCallback üzerinden kaydedilen uygulamalara bir geri çağırma tetikler.

    • CarVolumeGroupEvent, güncellenmiş CarVolumeGroupInfo, Etkinlik türü (ne değişti) ve Ek bilgiler (neden değiştiği) bilgilerini içerir.

resim

Şekil 1. Dinamik birim yapılandırması.

HAL API'sı

3.0 AIDL'de AudioControl

AudioControl AIDL HAL sürüm 3.0 aşağıdaki API'leri sunmaktadır:

API
IAudioControl#setModuleChangeCallback AudioControl HAL ile IModuleChangeCallback örneğini ayarlar.
ISesDenetimi#clearModuleChangeCallback Daha önce AudioControl HAL ile ayarlanmış IModuleChangeCallback örneğini temizler.
IModuleChangeCallback#onAudioPortsChanged AudioPorts'ta yapılan değişiklikleri bildirmek için geri arama

Sıra

Dinamik birim yapılandırmasının sıra şeması aşağıda gösterilmektedir.

resim

Şekil 2. Dinamik birim yapılandırması için sıra şeması.

Temel unsurlar

Bu özelliği optimize etmek için aşağıdakileri göz önünde bulundurun.

  • Geri çağırmanın bir parçası olarak sağlanan AudioPort'lar, Automotive BUS tanımıyla eşleşmelidir:

    • Cihaz bağlantı noktası. IN_DEVICE OUT_DEVICE
    • Bağlantı. BUS
    • Adres. Ses HAL tanımında tanımlanmıştır
    • Kazanç modu. JOINT
  • Tedarikçi firmalar, Ses HAL politikasında ses seviyesi aralığı tanımlarının üst kümesini tanımlamalı ve araç varyantlarına göre özelleştirmek için geri çağırmayı kullanmalıdır. Daha fazla bilgi için IModuleChangeCallbac AIDL tanımına bakın.

  • Aynı ses düzeyi grubuna ait birden fazla ses BUS'u olduğunda, her biri aynı ses düzeyi aralığı tanımlarına sahip olmalıdır. Aksi takdirde, araç ses çerçevesi yeni ses aralığı tanımını reddeder.