Hacim yönetimi

Ses yönetimi, seslerin yazılımda değil, donanım amplifikatörü tarafından HAL'ın altında uygulanacağı beklentisiyle sabit sesler kullanan CarAudioService içinde yer alır. CarAudioService, çıkış cihazlarını ses grupları halinde düzenler. Böylece, bir ses grubuyla ilişkili tüm cihazlara aynı kazançlar uygulanır.

Sabit birimler

AAOS uygulamalarında ses seviyesini kontrol etmek için yazılım mikseri yerine donanım amplifikatörü kullanılır. Yan etkileri önlemek için config_useFixedVolume işaretini true olarak ayarlayın (gerekirse yer paylaşımı yapın):

<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 mikserinde akış türüne göre ses seviyesini değiştirmek için AudioManager.setStreamVolume() işlevini çağırabilir. Bu durum, diğer uygulamalar üzerindeki olası etkiler ve yazılım mikserindeki ses zayıflatmasının, donanım amplifikatörü tarafından alındığında sinyalde daha az önemli bit bulunmasına neden olabileceği için her zaman istenmeyebilir.

Hacim grupları

Ses grupları, bir ses bölgesindeki bir cihaz koleksiyonunun seslerini yönetir. Her ses grubu için ses seviyesi bağımsız olarak kontrol edilebilir. Elde edilen kazançlar, aracın amplifikatörü tarafından uygulanmak üzere ilişkili cihazlarda yapılandırılır. Ses ayarları kullanıcı için kalıcı hale getirilir ve kullanıcı oturum açtığında yüklenir.

Birim gruplarını tanımlama

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

<audioZoneConfiguration version="4">
    </deviceConfigurations>
    <activationVolumeConfigs>
        <activationVolumeConfig name="activation_volume_on_boot_config">
            <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
            invocationType="onBoot" />
        </activationVolumeConfig>
        ...
    </activationVolumeConfigs>
    <zones>
        <zone name="primary zone" isPrimary="true">
          <zoneConfigs>
              <zoneConfig name="primary zone config 0" isDefault="true">
                <volumeGroups>
                    <group activationConfig="activation_volume_on_boot_config">
                        <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>
              </zoneConfig>
              ...
            </zoneConfigs>
        </zone>
     </zones>
</audioZoneConfiguration>

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

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

Her ses grubu için minimum, maksimum ve varsayılan kazanç değerlerinin yanı sıra ses grubuyla ilişkili cihazlar için audio_policy_configuration.xml içinde yapılandırılan değerlere göre bir adım boyutu vardır.

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

Başlatma sırasında birim grubu, ilişkili cihazların kazanç değerlerini kontrol eder ve grubu aşağıdaki gibi yapılandırır:

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

Bu değerlerin yapılandırılma şekli göz önüne alındığında, bir ses grubunun kazancını, ses grubuyla ilişkili bir cihaz için desteklenen aralığın dışında ayarlamak mümkündür. Bu durumda, ses grubu değerinin aralığın altında veya üstünde olmasına bağlı olarak, söz konusu cihazın kazancı cihazın minimum ya da maksimum kazanç değerine ayarlanır.

Ses grubu tanımlayıcıları

Ses grupları, XML dosyasında tanımlanan sırayla çalışma zamanında tanımlanır. Kimlikler, bir ses bölgesinde 0 ile N-1 arasında değişir. Burada N, söz konusu bölgedeki ses grubu sayısıdır. Bu nedenle, birim grubu kimlikleri bölgeler arasında benzersiz değildir. Bu tanımlayıcılar, CarAudioManager API'leri için kullanılır. zoneId olmadan groupId alan tüm API'ler varsayılan olarak birincil ses bölgesini kullanır.

Çoklu bölge birimi yönetimi

Her ses bölgesinde bir veya daha fazla ses grubu olması beklenir ve her ses grubu yalnızca tek bir ses bölgesiyle ilişkilendirilir. Bu ilişki, car_audio_configuration.xml kapsamında tanımlanır. Daha fazla bilgi edinmek için Ses grubu tanımlama bölümündeki yukarıdaki örneğe bakın.

Her bölgenin mevcut ses seviyeleri, o bölgeyle ilişkili kullanıcı için kalıcı olarak saklanır. Bu ayarlar bölgeye özeldir. Yani bir kullanıcı birincil bölgeyle ilişkili bir ekranda oturum açtıktan sonra ikincil bir ses bölgesiyle ilişkili bir bölgede oturum açarsa ilk bölge için yüklenen ve kalıcı hale getirilen ses seviyeleri, ikincil bölgedekilerden farklı olur.

Minimum ve maksimum etkinleştirme hacmi

Android 15, araç ses sistemlerinde daha iyi güvenlik ve kullanıcı rahatlığı için ses grubu dizinleri üzerinde kontrol sağlar. Bu, araç ses yapılandırmasında yapılandırılan minimum ve maksimum etkinleştirme hacimlerinin kullanılmasıyla sağlanır (bkz. Hacim gruplarını tanımlama). Bu özelliği, Car Service RRO'larında audioUseMinMaxActivationVolume değerini true olarak ayarlayarak etkinleştirebilirsiniz.

activationVolumeConfig içinde birden fazla activationVolumeConfigs girişi tanımlayabilirsiniz. Bu girişlerin her biri farklı bir minimum ve maksimum etkinleştirme yapılandırmasını temsil eder. Her activationVolumeConfig:

  • Ses grubu (group) içinde daha sonra referans verilebilmesi için araç ses yapılandırma dosyasında benzersiz bir name içermelidir.
  • Yalnızca bir activationVolumeConfigEntry içermelidir.

Her activationVolumeConfig öğesi aşağıdaki özellikleri içerir:

  • minActivationVolumePercentage (tam sayı, 0-100, isteğe bağlı, varsayılan: 0): Minimum etkinleştirme hacmini yüzde olarak belirtir.
  • maxActivationVolumePercentage (tam sayı, 0-100, isteğe bağlı, varsayılan: 100): Maksimum etkinleştirme hacmini yüzde olarak belirtir.
  • invocationType (dize, isteğe bağlı, varsayılan: onPlaybackChanged): Minimum ve maksimum etkinleştirme hacminin uygulandığı koşulları tanımlar:

    • onBoot: Yalnızca başlatma işleminden sonra bir ses grubu üzerinde yeni etkinleştirilen ilk oynatmaya uygulanır.
    • onSourceChanged: Yalnızca bir birim grubunda uygulaması veya UID kaynağı değiştirilmiş yeni etkin oynatmalar için geçerlidir.
    • onPlaybackChanged: Bir ses grubunda yeni etkinleştirilen her oynatmaya uygulanır.

CarAudioService, şu anda etkin olan aşağıdaki ses alt bileşenlerini izleyerek minimum ve maksimum etkinleştirmeyi yönetir:

  • Şu anda etkin olan oynatma parçaları
  • Mevcut arama durumu
  • Ses Kontrolü HAL'sinden gelen mevcut ses odağı isteği. Ses Kontrolü HAL'sinden gelen ses odağı isteği, Android dışında etkin bir ses oynatmanın gerçekleştiğini belirtir.

Aşağıdaki resimde, minimum ve maksimum etkinleştirme hacmi yönetimine dair genel bir bakış gösterilmektedir:

resim

1. şekil. Minimum ve maksimum etkinleştirme hacmi yönetimi etkin ses verisi yolları.

Belirtilen minActivationVolumePercentage, maxActivationVolumePercentage, minimum ve maksimum ses artışı indeksi ile her ses grubu için minimum ve maksimum etkinleştirme ses artışı indeksini hesaplayabilirsiniz. CarAudioService yeni etkinleştirilen her oynatmayı izler ve aşağıdaki koşullarda minimum ve maksimum etkinleştirme hacmini uygular:

  • Çağırma türü eşleşmeleri: Oynatmanın etkinleştirme türü (Audio Manager, Audio Control HAL veya Telephony Manager'dan türetilir) ses grubuyla ilişkili activationVolumeConfigEntry içinde belirtilen invocationType ile eşleşmelidir.
  • Ses dizini aralığın dışında: Ses grubunun mevcut ses kazancı dizini, tanımlanan etkinleştirme ses kazancı dizini aralığının dışında olmalıdır. Özellikle aşağıdakilerden biri geçerlidir:

    • Dizin, hesaplanan minimum etkinleştirme hacmi kazancından düşük.

      VEYA

    • Dizin, hesaplanan maksimum etkinleştirme hacmi kazancı dizininden yüksek.

Etkinleştirme eşleşmesi verildiğinde, ses grubu için ses artışı indeksi aşağıdakilerden birine göre ayarlanır:

  • Minimum etkinleştirme hacmi kazancı dizininden düşükse minimum etkinleştirme hacmi kazancı dizini

    VEYA

  • Maksimum etkinleştirme hacmi, maksimum etkinleştirme hacmi kazanç indeksinden yüksekse maksimum etkinleştirme hacmi kazanç indeksi

Ayrıca, etkinlik türü EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED olan bir araç hacmi grubu etkinliği, kayıtlı tüm hacim grubu etkinliği geri çağırmalarına gönderilir.

Ses seviyesi tuşu etkinliklerini işleme

Android, ses seviyesi kontrolü için aşağıdakiler de dahil olmak üzere çeşitli tuş kodları tanımlar:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Android, ses tuşu etkinliklerini varsayılan olarak uygulamalara yönlendirir. Otomotiv uygulamaları, bu önemli etkinliklerin CarAudioService tarafından işlenmesini zorunlu kılmalıdır. CarAudioService, uygun şekilde setGroupVolume veya setMasterMute'ı çağırır. Bu davranışı zorlamak için config_handleVolumeKeysInWindowManager işaretini true olarak ayarlayın:

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

Şu anda hacim önemli etkinliklerinin hangi bölge için tasarlandığını ayırt etmenin bir yolu yoktur ve tümünün birincil ses bölgesiyle ilişkili olduğu varsayılır. Bir ses seviyesi tuşu etkinliği alındığında CarAudioService, etkin oynatıcıların ses bağlamlarını getirerek hangi ses seviyesi grubunun ayarlanacağını belirler ve ardından en yüksek öncelikli ses bağlamıyla ilişkili çıkış cihazını içeren ses seviyesi grubunu ayarlar. Önceliklendirme, CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY adresinde tanımlanan sabit bir sıralamaya göre belirlenir.

Solma ve denge

AudioControl HAL'nin her iki sürümünde de araçta fade ve denge ayarı için API'ler bulunur. CarAudioManager için karşılık gelen sistem API'leri, AudioControl HAL'ye değerler iletir. Bu API'ler için android.car.permission.CAR_CONTROL_AUDIO_VOLUME gerekir. AudioControl API'leri şunlardır:

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

    • 0.0 ortalanır
    • +1,0 tamamen doğru
    • -1,0 tamamen solda
    • -1 ile 1 aralığının dışındaki bir değer hatadır.
  • setFadeTowardFront(float value), hoparlör sesini aracın ön (+) veya arka (-) tarafına doğru kaydırır.

    • 0.0 ortalanır
    • +1.0 tamamen ileri
    • -1,0 tamamen arkada
    • -1 ile 1 aralığının dışındaki bir değer hatadır.

Bu değerlerin nasıl uygulanacağına ve kullanıcılara nasıl gösterileceğine siz karar verirsiniz. Bu ayarlar yalnızca medyaya veya tüm Android seslerine uygulanabilir. Android 11'de çıkış cihazlarına ses efektleri uygulama desteği de sunuldu. Bu sayede, fade ve dengeyi bu API'ler yerine uygun çıkış cihazlarındaki ses efektleri aracılığıyla yönetmek de mümkündür.

Sesi kısma

Sesi kısma özelliği, araç aynı anda çalınan başka bir akışın daha net duyulabilmesi için bir akışın kazancını azalttığında gerçekleşir. AAOS'te sesi kısma, HAL tarafından uygulanır. Android, işletim sisteminin dışındaki sesleri kontrol edemez. Android 11'de, HAL'ın ses kısma kararları vermesi için kullanabileceği temel bilgi, iki çıkış cihazının da etkin akışlara sahip olup olmadığıdır.

Ne zaman eğilmelisiniz?

HAL tarafından ducking işleminin nasıl yapılacağını belirlemek OEM'in sorumluluğundadır. Ancak aşağıdaki yönergeleri uygulamanızı öneririz.

  • Android'de birden fazla akışın oynatılması genellikle iki uygulama veya hizmet aynı anda ses odağını tuttuğunda gerçekleşir. Android'in eşzamanlı odaklanmaya ne zaman izin verebileceğini öğrenmek için Kısıtlama türleri bölümündeki etkileşim matrisine bakın. Araba ses eklentisinin kullanıma sunulmasıyla birlikte bu durum, AudioFocus yönetiminize de bağlıdır.

  • Android tarafından karıştırılan tüm akışlar, kazançlar uygulanmadan önce yapılır. Bu nedenle, başka bir akışla eşzamanlı olarak oynatıldığında sesi kısılması gereken tüm akışlar ayrı çıkış cihazlarına yönlendirilmelidir. Böylece HAL, akışları karıştırmadan önce sesi kısabilir.

Aşağıda, eşzamanlı etkileşimlerin olası olduğu ve bu nedenle ducking'in önerildiği durumlar verilmiştir.

Etkileşim İşlem
EMERGENCY SAFETY hariç her şeyin sesini kısar veya kapatır.
SAFETY EMERGENCY hariç her şeyin sesini kısar.
NAVIGATION SAFETY ve EMERGENCY hariç her şey
CALL SAFETY, EMERGENCY ve NAVIGATION dışındaki her şeyi kapsar.
VOICE Ördekler CALL_RING
VEHICLE_SOUNDS Etkin sesin önemini ve diğer sesleri bastırıp bastırmayacağını siz belirlersiniz.
MUSIC ve ANNOUNCEMENT Her şeyden kaçındı. SYSTEM_SOUND olarak çalınan dokunma etkileşimi tonları istisnadır.

Eğilirken dikkat edilmesi gereken noktalar

Rota izleme veya asistan gibi bazı uygulamalar ve hizmetler, işlemleri gerçekleştirmek için birden fazla oynatıcı kullanabilir. Veri akışı çıkış cihazlarından akmayı durdurduğunda, gezinme veya asistan uygulamasından bir sonraki oynatma başlamadan önce medyanın sesinin kısılmadan tam ses seviyesine dönmemesi için agresif ses kısma işleminden kaçının.

Yeterli izolasyona sahip birden fazla ses aşaması olan araçlarda, sesi azaltmak yerine arabanın farklı bölgelerine yönlendirebilirsiniz. Örneğin, navigasyon talimatları sürücünün koltuk başlığı hoparlörlerine yönlendirilirken kabin genelinde müzik çalmaya normal ses seviyesinde devam edilebilir.

Güvenlik açısından kritik sesler

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

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

AAOS, ses ayarları kullanıcı arayüzünü ses grubu yapılandırmasından ayırır. Bunlar, Ses grubu kazançlarını yapılandırma bölümünde açıklandığı şekilde yerleştirilebilir. Bu ayrım, birim gruplarının yapılandırması değiştiğinde herhangi bir değişiklik yapılmasına gerek kalmamasını sağlar.

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ü öğeleri (başlık ve simge kaynakları) bulunur. Bu dosya, her bir VolumeGroup içinde yer alan ilk tanınan kullanımla ilişkili kaynakları kullanarak tanımlanan VolumeGroups öğesinin makul bir şekilde oluşturulmasını sağlar.

Örneğin, aşağıdaki örnekte VolumeGroup, voice_communication ve voice_communication_signalling'yi içerecek şekilde tanımlanmaktadır. Araba ayarları kullanıcı arayüzünün varsayılan uygulaması, VolumeGroup öğesini voice_communication ile ilişkili kaynakları kullanarak oluşturur. Bunun nedeni, dosyadaki ilk eşleşmenin bu olmasıdır.

<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ımlanır. Ses düzeyi ayarları kullanıcı arayüzü, aşağıdaki VolumeGroup tabanlı CarAudioManager API'lerini kullanır:

  • Kaç kontrolün çizilmesi gerektiğini öğrenmek için getVolumeGroupCount().
  • Alt ve üst sınırları elde etmek için getGroupMinVolume() ve getGroupMaxVolume() değerlerini kullanın.
  • getGroupVolume() ile geçerli ses düzeyini alın.
  • registerVolumeChangeObserver(), birim değişikliklerinden haberdar edilir.

Araba hacmi grubu etkinliği

Ses güncelleme ve sessize alma düğmesinin otomotiv kullanım alanları, ses ayarları gibi belirli uygulamaların işlemlerini tanımlayabilecek bağlamsal temellere sahiptir. Araba ses yığınından gelen mevcut ses seviyesi ve geri aramayı sessize alma, sınırlı bağlamsal bilgi sağlar. Otomotiv kullanım alanlarına ve gelecekteki ölçeklenebilirliğe daha iyi hizmet vermek için Android 14'e CarVolumeGroupEvent eklendi. Her etkinlik üç kritik bilgi türü içerir:

  • CarVolumeGroupInfo liste
  • EventTypes (bit eşlemli)
  • ExtraInfos liste

CarVolumeGroupInfo

Etkinlik geri çağırmasının alıcısı, etkilenen araba ses grubu bilgilerinin listesine kolayca erişebilir. Bu, uygulamanın en son durumu almak için Car Audio Framework'e ek çağrı yapması gerekmediği anlamına gelir. Kullanıcı arayüzünü veya dahili durumları güncellemek için alınan CarVolumeGroupInfos'yı kullanabilir. Uygulamaların işini kolaylaştırmak için, araba ses grubu içinde değişen yönler de aşağıda açıklandığı gibi EventTypes kapsamında sağlanır.

EventTypes

CarVolumeGroupInfo'nın hangi yönünün değiştiğini tanımlar. Uygulamalar, değişiklikleri belirlemek ve gerekli işlemleri yapmak için bu bilgileri kullanabilir. Örneğin, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED, ilgili CarVolumeGroups maksimum hacim artışı dizininin değiştiğini ve CarVolumeGroupInfo.getMaxVolumeGainIndex() tarafından sorgulanabileceğini gösterir.

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

EventType CarVolumeGroupInfo
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.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

ExtraInfos

CarVolumeGroup simgesinin neden değiştiği hakkında ek bilgiler sağlar. Uygulamalar, kullanıcıyı işlem yapmaya veya bildirim göndermeye yönlendirmek için bu bilgileri kullanarak ek bağlam sağlayabilir. Örneğin, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL, termal aşırı yüklenme nedeniyle etkin bir geçici zayıflamayı gösterir. Uygulama, kullanıcı sesi artırmaya çalıştığında kullanıcıyı bilgilendirebilir.

ExtraInfos için herhangi bir süreç uygulamıyoruz. Süreci ExtraInfos temelinde belirlemek sizin takdirinize bağlıdır. Örneğin, zayıflatma EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED nedeniyle etkinse kullanıcının sesi değiştirmesini önlemek için ses seviyesi çubuğu kullanıcı arayüzünü başlangıçta soluklaştırmayı da tercih edebilirsiniz. Diğerleri, ses kısma özelliğinin etkin olduğunu belirten bir bildirim göstermeyi ve kullanıcının sesi değiştirmesine izin vermeyi tercih edebilir.

Aracın ses çerçevesi, önerilen ExtraInfos'yi sağlamak için AudioControl HAL IAudioGainCallback'ye bağlıdır. Daha fazla bilgi edinmek için Audio Gain Callback (Ses Kazancı Geri Arama) başlıklı makaleyi inceleyin.

CarVolumeGroupEvent, araba ses sistemi çerçevesinin gelecekteki ihtiyaçlarını karşılayacak şekilde ölçeklendirilir. Yeni özellikleri CarVolumeGroupEvent üzerinden desteklemeyi planlıyoruz. Uygulama geliştiricilerin grup ses seviyesi ve sessize alma değişikliklerini yönetmek için CarVolumeGroupEvent kullanmalarını önemle tavsiye ederiz.

Car volume group event callback

Android 14, ayrıcalıklı ve platform uygulamalarının CarVolumeGroupEvents kaydolup bildirim alması için yeni bir geri çağırma işlevi sunar.

  • Geri arama için kaydolmak üzere CarAudioManager#registerCarVolumeGroupEventCallback() simgesini kullanın.

  • Geri arama kaydını silmek için CarAudioManager#unregisterCarVolumeGroupEventCallback() kullanın.

Bir uygulama yeni CarVolumeGroupEventCallback ve eski CarVolumeCallback ile kaydolursa CarVolumeGroupEventCallbacks etkinliğine öncelik verilir. Araba ses yığını artık CarVolumeCallback'ı tetiklemiyor. Bu, aynı etkinlik için aynı uygulamaya yönelik yinelenen tetiklemeleri önler.

Grup sesini yönetmek ve sessize alma değişikliklerini yapmak için CarVolumeGroupEventCallback kullanmanızı önemle tavsiye ederiz.

Ses kazancı geri araması

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

HAL API

AudioControl @2.0 AIDL

AudioControl AIDL HAL'in 2.0 sürümünde aşağıdaki API eklenmiştir:

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

AudioControl HAL geri çağırması, nedenlerin ve ilgili AudioGainConfigInfo listelerini içerir. Bu liste şunlardan oluşur:

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

Nedenler genel olarak şu şekilde sınıflandırılabilir:

  • Kısıtlama nedenleri. Ses seviyesi ve sessize alma davranışında geçici değişiklik.
  • Güncelleme nedenleri Ses 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
  • Blokaj
  • Sınırlama
  • Zayıflama
Etkin kısıtlama Kullanıcı tarafından tetiklenen ses seviyesi değişikliği Kullanıcı tarafından tetiklenen sesi kapatma/açma düğmesi
Sesi kapat ❌ (sesi aç)

✔ (sesi kapat)
Blokaj
Sınırlama ❌ (sınır aşıldı)

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

Kısıtlamalar arasındaki öncelik sırası şöyledir: Sessize alma > Engelleme > Sınırlama > Zayıflatma.

Sessize alma kısıtlamaları

Sessize alma kısıtlamaları şunlardır:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Aracın ses çerçevesi, bu iki sessize alma durumunu dahili olarak korur:

  • Kullanıcıyı yoksayma. Kullanıcının isteğine bağlı olarak CarAudioManager veya önemli etkinlikler aracılığıyla etkinleştirilir.

  • HAL mute. AudioGain geri arama yoluyla alınan sessize alma kısıtlamalarına göre değiştirilir.

Ayarlar uygulaması gibi dinleyiciler için, genel ses grubu sessize alma (CarVolumeGroupInfo.isMuted()) durumu, yukarıdaki sessize alma işlemlerinden herhangi birinin etkin olup olmadığına bağlıdır.

HAL sessize alma özelliği etkinleştirildiğinde, kısıtlama süresi boyunca tüm gelen ses düzeyi değişikliği ve grupta sessizliği kaldırma istekleri yoksayılır.

Etkileşim durumu: HAL sessize alma özelliği etkin ve kullanıcı, sessize alma düğmesinin açılmasını istiyor

HAL mute etkinleştirildiğinde ve User mute devre dışı bırakıldığında:

  • Ses grubu genelinde sessize alma durumu true olarak değiştirildi.
  • Kullanıcının sessize alma isteği işlenir.
    • Gerekçe: Kullanıcı gizliliğini korumak için kullanıcıların sessize alma isteklerine her zaman uyulmalıdır.

HAL sesi kapatma ve kullanıcı sesi kapatma etkinleştirildiğinde:

  • Ses grubu genelinde sessize alma durumu true olarak değiştirildi.

  • Kullanıcının sessize alma özelliğini devre dışı bırakma istekleri NOT işlenir. Önbelleğe alınmış kullanıcı sessize alma durumu etkin kalır.

    • Nedeni: Kullanıcının sesi açma istekleri yalnızca etkin kısıtlama yoksa kabul edilir.

    • Gerekçe: Önbelleğe alınmış kullanıcı sessize alma özelliğinin sessizliğinin kaldırılması, istenmeyen ses patlamasına neden olabilir ve kullanıcının güvenliğini tehlikeye atabilir. Bu durum, özellikle sessize alma durumu ateşleme döngüleri boyunca etkinse geçerlidir. Bu durumda kullanıcıların ses seviyesi algısı azalır.

Etkileşim durumu: Kullanıcı sessize alma özelliği değişmeden HAL sessize alma özelliği etkinleştiriliyor ve devre dışı bırakılıyor

HAL'ı kapatma/açma işlemi, ses grubu genelinde sesi kapatma durumunu değiştirir. Ancak, bu işlem kullanıcının sessize alma durumunu doğrudan güncellemez. Kullanıcı sessize alma özelliği devre dışı bırakıldığında ve etkinleştirmek için HAL sessize alma geri araması alındığında:

  • Ses grubu genelinde sessize alma durumu true olarak değiştirildi.
  • Kullanıcının ses seviyesini değiştirme istekleri, HAL sessize alma özelliği etkin durumdayken NOT işlenir.

    • Nedeni: Kullanıcı, sessize alma özelliği etkin durumdayken sesi algılayamıyor. Ses değişikliğine izin vermek, ses patlamasına neden olabilir ve kullanıcı güvenliğini tehlikeye atabilir.

    • Nedeni: OEM tarafından beklenen davranış buysa birim uygulamaları, geri çağırma için kaydolabilir ve kullanıcı müdahalesi olmadan otomatik olarak sesi açabilir (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)).

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

  • Ses grubu sessize alma durumu false olarak değiştirildi.

    Gerekçe: Sessiz durumunu yapışkan hale getirmek ve kullanıcının sesi açmasını istemek, sessiz durumları sık sık değiştirildiğinde kullanıcının gereksiz yere kesintiye uğramasına neden olabilir.

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

Blokaj

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

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

Engelleme kısıtlamaları etkin olduğunda kullanıcıların:

  • Ses düzeyi değişiklikleri işleme alınmaz.
  • Sesi açma/kapatma işlemleri gerçekleştirilir.

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ıların:

  • Ses düzeyini değiştirme:

    • Sınırlama dahilinde işlenir
    • Yukarıdaki sınırlamalar işlenmez.
  • Sesi açma/kapatma işlemleri gerçekleştirilir.

Zayıflama

Zayıflatma kısıtlamaları şunlardır:

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

Zayıflatma kısıtlamaları etkin olduğunda kullanıcıların:

  • Ses düzeyini değiştirme istekleri işlenir. Yeni mevcut ses düzeyi, önceki ses düzeyi yerine zayıflatılmış ses düzeyine ayarlanır. Gelecekteki ses değişiklikleri bu düzeyden yapılır.

  • Sesi açma/kapatma işlemi gerçekleştirilir.

Dizini güncelleme

Aşağıdaki işlem, zaman uyumsuz birim dizini güncellemesi olarak kabul edilir: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

Bu nedenle, AudioControl HAL, birim grubu geçerli dizinini belirtilen dizine güncelleyebilir. Bu, öncelikle araç ses çerçevesinden gelen ses değişikliği isteği için ses sisteminden alınan geri bildirim olarak kullanılır. Dizin güncelleme işlemi, dizini senkronize etmek için uygulamalara CarVolumeGroupEvent geri çağırma işleviyle de iletilir.

Örnekler

Kullanım alanı: Kullanıcı, ses düzeyi dizinini 30 olarak güncelliyor

  • Kullanıcı, ses dizinini 30 olarak değiştirmek için Ses uygulamasını kullanıyor.

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

  • TedarikçilerinAudio HAL uygulamaları yeni ses kazancını alır ve ses sistemini (ör. harici amfi) günceller.

  • Ses sistemi, ses seviyesinin yalnızca 15. indekse güncellendiğini belirtiyor (Android'in bilmediği nedenlerden dolayı).

  • Tedarikçi firmaların AudioControl HAL tetikleyicilerini uygulama şekilleri:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Araç ses hizmeti, kalıcılık ve ses uygulamasına geri çağırmalar için kullanılan geri çağırmadan yeni dizini tüketir. Kullanıcı tarafından istenen dizin 30'dur. Ancak ses sistemi eşzamansız geri bildirimi, dizini 15 olarak günceller.

Kullanım alanı: Askıya alma modundan çıktıktan sonraki ilk ses çalma

  • Askıya alma işleminden önceki hacim dizini 95 gibi yüksek bir seviyeye ayarlanmış (aralık: [0-99]).

  • Android askıya alınır.

  • Android'i askıya alma (ör. devam ettirme):

    • Tedarikçi Audio HAL/AudioControl HAL, ses sistemine yerel olarak 30 güvenli dizini uygular.

    • Tedarikçi AudioControl HAL, güvenli indeks için geri aramayı da tetikler:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Aracın ses hizmeti, kalıcılık için kullanılan geri çağırmadan yeni dizini ve dizini senkronize eden ses uygulamasına yönelik kendi geri çağırmalarını kullanır. Askıya alınmadan önceki hacim dizini 95'tir. Ancak devam ettirildikten sonra bu dizin, AudioControl HAL uygulayıcısı tarafından güvenli bir ses seviyesi olan 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 bulunduruyoruz:

  1. Araç üretim hattı sonu (EOL) yapılandırması.

    • Otomobil üreticileri, araç ses sistemi kurulumuna göre EOL'de ses yapılandırmalarını güncellemeyi tercih eder. Bu işlem genellikle Android yazılımı görüntüsü güncellenmeden yapılan bir yan yüklemedir.

    • Otomobil üreticilerinin, servis programı sırasında ses 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ına ev sahipliği yapabilir.

  3. İsteğe bağlı yapılandırma Kullanıcıların belirli bir süre boyunca gelişmiş sinyal işlemeye abone olduğu, talep tabanlı ses özelliklerine yönelik artan ihtiyacı karşılamak için sunulur. Yeni ses aralığı yapılandırmaları, abonelik süresi boyunca geçerlidir.

Tasarım

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

  • Keşif Satıcı AudioControl HAL uygulaması, satıcıya ait özel bir IPC mekanizması aracılığıyla yeni ses aralığı güncellemelerini keşfeder.

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

  • Güncelleme Aracın ses yığını, ses grubu durumlarını yeni ses aralıklarıyla günceller.

    Ses aralığı güncellendikten sonra aynı ses düzeyini korumak için çaba gösterilir. Ancak dizin sınırların dışına çıkarsa mevcut hacim dizini güvenli bir değere ayarlanır. Örneğin, geri arama sırasında satıcı tarafından sağlanan varsayılan seviye.

  • Geri arama.

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

    • CarVolumeGroupEvent, güncellenmiş CarVolumeGroupInfo, Event-type (Etkinlik türü) [ne değişti?] ve Extra-info (Ek bilgi) [neden değişti?] değerlerini içerir.

resim

Şekil 2. Dinamik ses düzeyi yapılandırması.

HAL API

AudioControl @ 3.0 AIDL

AudioControl AIDL HAL'nin 3.0 sürümünde aşağıdaki API'ler kullanıma sunulmuştur:

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

Sıra

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

resim

3.Şekil Dinamik birim yapılandırması için adım sırası diyagramı.

Temel yönler

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

  • Geri çağırma işlevinin 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ımlanır.
    • Kazanç modu. JOINT
  • Tedarikçiler, Audio HAL politikasında ses aralığı tanımlarının bir üst kümesini tanımlamalı ve geri çağırma işlevini kullanarak bunu araç varyantları için özelleştirmelidir. Daha fazla bilgi için IModuleChangeCallbac AIDL tanımına bakın.

  • Aynı ses seviyesi grubuna birden fazla ses BUS'ı ait olduğunda her birinin mutlaka aynı ses seviyesi aralığı tanımlarına sahip olması gerekir. Aksi takdirde, araç ses çerçevesi yeni ses aralığı tanımını reddeder.