Ses düzeyi yönetimi

Ses seviyesi yönetimi, CarAudioService içinde bulunur. Bu API, ses seviyelerinin yazılımda değil, HAL'in altında bir donanım amplifikatörü tarafından uygulanması beklentisiyle sabit ses seviyeleri kullanır. CarAudioService, bir ses seviyesi grubuyla ilişkili tüm cihazlara aynı kazançları uygulamak için çıkış cihazlarını ses seviyesi gruplarına ayırır.

Sabit birimler

AAOS uygulamaları, ses seviyesini kontrol etmek için yazılım karıştırıcı yerine donanım amplifikatörü kullanı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 karıştırıcısında ses seviyesini akış türüne göre değiştirmek için AudioManager.setStreamVolume()'yi çağırabilir. Bu, diğer uygulamalar üzerindeki olası etkiler ve yazılım karıştırıcıdaki ses azaltmanın, donanım amplifikatörü tarafından alındığında sinyaldeki önemli bit sayısının azalmasına neden olabileceği gerçeği nedeniyle her zaman istenmeyebilir.

Ses seviyesi grupları

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

Hacim 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 ses grubu, ilişkili adreslere sahip bir veya daha fazla çıkış cihazı içermelidir. Adresler, audio_policy_configuration.xml dosyasında tanımlanan çıkış cihazlarına karşılık gelmelidir.

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

Her ses grubu, minimum, maksimum ve varsayılan kazanç değerlerinin yanı sıra ses grubuyla ilişkili cihazlar için audio_policy_configuration.xml'te yapılandırılan değerlere dayalı bir adım boyutuna sahiptir.

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

Hacim grubu, başlatma sırasında 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 cihazlar için 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 grubuyla ilişkili bir cihaz için desteklenen aralığın dışında bir ses grubu kazancı ayarlanabilir. Bu durumda, ilgili cihaz için kazanç, ses grubu değerinin aralığın altında veya üstünde olup olmadığına bağlı olarak cihazın minimum veya maksimum kazanç değerine ayarlanır.

Ses grubu tanımlayıcılar

Ses grupları, XML dosyasında tanımlanan sırada çalışma zamanında tanımlanır. Ses bölgesindeki kimlikler 0 ile N-1 arasındadır. Burada N, söz konusu bölgedeki ses seviyesi gruplarının sayısıdır. Bu nedenle, cilt grubu kimlikleri bölgeler arasında benzersiz değildir. Bu tanımlayıcılar, birim gruplarıyla ilişkili 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ölgeli birim yönetimi

Her ses bölgesinin bir veya daha fazla ses seviyesi grubuna sahip olması ve her ses seviyesi grubunun yalnızca tek bir ses bölgesiyle ilişkilendirilmesi gerekir. Bu ilişki, car_audio_configuration.xml kapsamında tanımlanır. Daha fazla bilgi için Ses seviyesi gruplarını tanımlama bölümündeki yukarıdaki örneği inceleyin.

Her bölgenin mevcut ses seviyeleri, ilgili bölgeyle ilişkili kullanıcı için korunur. Bu ayarlar bölgeye özeldir. Yani bir kullanıcı birincil bölgeyle ilişkili bir ekranda oturum açıp daha sonra ikincil ses bölgesiyle ilişkili bir bölgede oturum açarsa ilk bölge için yüklenen ve kalıcı olan ses seviyeleri ikincil bölgeninkilerden farklıdır.

Minimum ve maksimum etkinleştirme hacmi

Android 15, araç ses sistemlerinde daha fazla güvenlik ve kullanıcı konforu için ses grubu dizinleri üzerinde kontrol sunar. Bu, araç ses yapılandırmasında yapılandırılmış minimum ve maksimum etkinleştirme ses seviyelerinin kullanılmasıyla elde edilir (Ses seviyesi gruplarını tanımlama bölümüne bakın). Araç Servisi RRO'larında audioUseMinMaxActivationVolume değerini true olarak ayarlayarak bu özelliği etkinleştirebilirsiniz.

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

  • Daha sonra ses seviyesi grubunda (group) referans verilebilmesi için araç ses sistemi yapılandırma dosyasında benzersiz bir name içermelidir.
  • Yalnızca bir activationVolumeConfigEntry içermelidir.

Her activationVolumeConfig 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 önyükleme işleminden sonra ses grubu grubunda yeni etkinleştirilen ilk oynatma işlemi için geçerlidir.
    • onSourceChanged: Yalnızca bir ses grubu üzerinde değiştirilmiş bir uygulama veya UID kaynağıyla yeni etkinleştirilen oynatma işlemi için geçerlidir.
    • onPlaybackChanged: Ses grubundaki yeni etkin her oynatmaya uygulanır.

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

  • Mevcut etkin oynatma kanalları
  • Mevcut arama durumu
  • Ses Kontrol HAL'inden gelen ses odak isteğinin Android dışında etkin bir ses oynatmanın gerçekleştiğini işaret ettiği mevcut ses odak isteği

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

resim

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

Belirtilen minActivationVolumePercentage, maxActivationVolumePercentage, minimum ve maksimum hacim artışı dizini ile her hacim grubu için minimum ve maksimum etkinleştirme hacmi artışı dizinlerini hesaplayabilirsiniz. CarAudioService yeni etkin oynatmaları izler ve aşağıdaki koşullar altında minimum ve maksimum etkinleştirme hacmini uygular:

  • Çağırma türü eşleşmeleri: Oynatma işleminin etkinleşme türü (Ses Yöneticisi, Ses Kontrolü HAL'i veya Telefon Yöneticisi'nden türetilir), ses grubuyla ilişkili activationVolumeConfigEntry içinde belirtilen invocationType ile eşleşmelidir.
  • Hacim dizini aralık dışında: Hacim grubunun mevcut hacim artışı dizini, tanımlanan etkinleştirme hacmi artışı dizini aralığının dışında olmalıdır. Daha açık belirtmek gerekirse aşağıdakilerden biri doğrudur:

    • Dizin, hesaplanan minimum etkinleştirme hacmi artışı dizinden düşüktür.

      VEYA

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

Etkinleştirme eşleşmesi olduğunda, ses grubunun ses kazancı dizini aşağıdakilerden birine ayarlanır:

  • Minimum etkinleştirme hacmi artışı indeksi, minimum etkinleştirme hacmi artışı indeksinden düşükse

    VEYA

  • Maksimum etkinleştirme hacmi artışı indeksinden yüksekse maksimum etkinleştirme hacmi artışı indeksi

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

Ses tuşu etkinliklerini işleme

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

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

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

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

Ses seviyesi önemli etkinlikleri şu anda hangi bölge için tasarlandıklarını ayırt edemez ve hepsinin 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 ve ardından en yüksek öncelikli ses bağlamıyla ilişkili çıkış cihazını içeren ses seviyesi grubunu ayarlayarak hangi ses seviyesi grubunun ayarlanacağını belirler. Önceliklendirme, CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY adresinde tanımlanan sabit bir sıralamaya göre belirlenir.

Karartma ve denge

AudioControl HAL'ın her iki sürümü de araçta fade ve denge ayarlamak için API'ler içerir. CarAudioManager için ilgili sistem API'leri, değerleri AudioControl HAL'e iletir. Bu API'ler için android.car.permission.CAR_CONTROL_AUDIO_VOLUME gereklidir. AudioControl API'leri şunlardır:

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

    • 0,0 merkezdedir.
    • +1,0 tamamen doğrudur
    • -1,0 tamamen solda
    • -1 ile 1 arasındaki aralığın dışındaki değerler hata olarak değerlendirilir.
  • setFadeTowardFront(float value), hoparlör sesini aracın ön tarafına (+) veya arka tarafına (-) doğru kaydırır.

    • 0,0 merkezdedir.
    • +1.0 tamamen ileri
    • -1,0 tamamen arkaya doğrudur.
    • -1 ile 1 arasındaki aralığın dışındaki değerler hata olarak değerlendirilir.

Bu değerlerin nasıl uygulanması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, çıkış cihazlarına ses efektleri uygulama desteği de sunmuştur. Bu sayede, sesin yavaşça azaltılması ve dengesi, bu API'ler yerine uygun çıkış cihazlarındaki ses efektleriyle yönetilebilir.

Sesi kısma

Ses kısma, araç aynı anda çalan başka bir sesin daha net duyulması için bir yayındaki kazancı azalttığında gerçekleşir. AAOS'te ses kısma özelliği HAL tarafından uygulanır. Android, işletim sisteminin dışındaki sesler üzerinde hiçbir kontrole sahip değildir. Android 11'de HAL'in ses azaltma kararları vermesi için kullanabileceği temel bilgi, iki çıkış cihazının her ikisinde de etkin yayın olup olmadığıdır.

Ne zaman eğilmelidir?

Ses azaltmanın HAL tarafından nasıl ele alınacağını belirlemek OEM'ye bağlıdır ancak aşağıdaki yönergeleri uygulamanızı öneririz.

  • Android'de birden fazla yayının oynatılması genellikle iki uygulama veya hizmetin aynı anda ses odağına sahip olduğunda gerçekleşir. Android'in ne zaman eşzamanlı odaklanma izni verebileceğini öğrenmek için Kısıtlama türleri bölümündeki etkileşim matrisine bakın. Araç 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 ses seviyesi azaltılması gereken tüm akışlar, HAL'in bunları karıştırmadan önce ses seviyesini azaltabilmesi için ayrı çıkış cihazlarına yönlendirilmelidir.

Aşağıda, ses azaltmanın önerildiği olası eşzamanlı etkileşimler verilmiştir.

Etkileşim İşlem
EMERGENCY SAFETY hariç her şeyi engeller veya sessize alır
SAFETY EMERGENCY hariç her şeyi engeller
NAVIGATION SAFETY ve EMERGENCY hariç her şeyi atlar
CALL SAFETY, EMERGENCY ve NAVIGATION dışındaki her şeyi atlar
VOICE Ördekler CALL_RING
VEHICLE_SOUNDS Etkin sesin önemini ve diğer sesleri kapatıp kapatmayacağını siz belirlersiniz.
MUSIC ve ANNOUNCEMENT Her şeyden kaçtı. İstisnalar, SYSTEM_SOUND olarak çalınan dokunma etkileşimi tonlarıdır.

Sessiz modu kullanırken dikkat edilmesi gereken noktalar

Navigasyon veya asistan gibi bazı uygulamalar ve hizmetler, işlem yapmak için birden fazla oynatıcı kullanabilir. Bir veri akışı çıkış cihazlarından akmayı durdurduğunda medya ses seviyesinin tam ses seviyesine dönmesini önlemek için ses seviyesini azaltma işlemini agresif bir şekilde yapmayın. Bu sayede, navigasyondan veya bir yardımcı uygulamadan sonraki oynatma işlemine başlamadan önce ses seviyesi azaltılır.

Yeterince iyi yalıtılmış birden fazla ses aralığına sahip araçlarda, sesin sesini azaltmak yerine sesi aracın farklı bölgelerine yönlendirebilirsiniz. Örneğin, kabinde normal ses seviyesinde müzik çalmaya devam ederken navigasyon talimatları sürücünün kafalık hoparlörlerine yönlendirilebilir.

Güvenlik açısından kritik sesler

Android 11'de HAL ses odak API'leri kullanıma sunulmuştur. HAL, güvenlik açısından kritik seslere diğer seslere göre öncelik verilmesini sağlar. HAL, USAGE_EMERGENCY için ses odağını elinde 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 sessize alınması 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 örtüşebilir. Bu ayrım, birim gruplarının yapılandırması değişirse herhangi bir değişiklik yapılmasını önler.

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ını) içerir. Bu dosya, her VolumeGroup içinde bulunan 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 içerecek şekilde tanımlanmıştır. Araba ayarları kullanıcı arayüzünün varsayılan uygulaması, dosyada ilk eşleşme olduğu için voice_communication ile ilişkili kaynakları kullanarak VolumeGroup öğesini 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ımlanır. Ses ayarları kullanıcı arayüzü, aşağıdaki VolumeGroup tabanlı CarAudioManager API'lerini kullanır:

  • getVolumeGroupCount()'e giderek kaç kontrol çizilmesi gerektiğini öğrenin.
  • getGroupMinVolume() ve getGroupMaxVolume() alt ve üst sınırları elde etmek için.
  • getGroupVolume() komutunu kullanarak mevcut ses seviyesini öğrenebilirsiniz.
  • registerVolumeChangeObserver() adresine gönderin.

Araba sesi grubu etkinliği

Ses güncellemesi 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 grubu tarafından sağlanan mevcut ses seviyesi ve sessize alma geri çağırma işlevi, bağlama dayalı sınırlı 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ünü içerir:

  • CarVolumeGroupInfo öğesinin listesi
  • EventTypes (bit eşlemeli)
  • ExtraInfos öğesinin listesi

CarVolumeGroupInfo

Etkinlik geri çağırmasının alıcısının, etkilenen araç ses grubu bilgilerinin listesine hazır erişimi vardır. Bu, uygulamanın en son durumu almak için Car Audio çerçevesine ek çağrı yapması gerekmediği anlamına gelir. Kullanıcı arayüzünü veya dahili durumları güncellemek için yalnızca alınan CarVolumeGroupInfos değerini kullanabilir. Uygulamaların daha kolay kullanabilmesi için bir araç ses grubuyla ilgili değişen özellikler, aşağıda açıklandığı şekilde EventTypes kapsamında da sağlanır.

EventTypes

CarVolumeGroupInfo öğesinin hangi yönünün değiştiğini tanımlar. Uygulamalar, değişiklikleri tespit etmek ve gerekli işlemleri yapmak için bu özelliği kullanabilir. Örneğin, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED, ilgili CarVolumeGroups maksimum hacim artışı dizininin değiştiğini ve CarVolumeGroupInfo.getMaxVolumeGainIndex() tarafından sorgulanabilir olduğunu 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 değerinin neden değiştiğiyle ilgili ek bilgiler sağlar. Uygulamalar, kullanıcıyı işlem yapmaya veya bilgilendirmeye yönelik ek bağlam sağlamak için bu bilgileri kullanabilir. Örneğin, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL termal aşırı yüklenme nedeniyle etkin geçici bir zayıflama olduğunu gösterir. Uygulama, sesi artırmaya çalışan kullanıcıyı bilgilendirebilir.

ExtraInfos için herhangi bir işlem uygulamıyoruz. ExtraInfos'ye göre süreci belirleme konusunda takdir sizindir. Örneğin, EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED nedeniyle ses azaltma etkinse kullanıcının sesi değiştirmesini önlemek için ses çubuğu kullanıcı arayüzünü başlangıçta karartmayı da seçebilirsiniz. Diğerleri, ses azaltmanın etkin olduğunu belirten bir pop-up göstermeyi ve kullanıcının sesi değiştirmesine izin vermeyi tercih edebilir.

Araç ses çerçevesi, önerilen ExtraInfos'yi sağlamak için AudioControl HAL IAudioGainCallback'e bağlıdır. Daha fazla bilgi edinmek için Ses Kazancı Geri Çağırma başlıklı makaleyi inceleyin.

CarVolumeGroupEvent, araç ses çerçevesinin gelecekteki ihtiyaçlarını karşılayacak şekilde ölçeklendirilir. Yeni özellikleri yalnızca CarVolumeGroupEvent üzerinden desteklemeyi planlıyoruz. Uygulama geliştiricilerin grup ses düzeyini ve sessizleştirme değişikliklerini yönetmek için CarVolumeGroupEvent kullanmasını önemle tavsiye ederiz.

Araç ses grubu etkinliği geri çağırma işlevi

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

  • Geri arama için kaydolmak üzere CarAudioManager#registerCarVolumeGroupEventCallback()

  • Geri aramanın kaydını iptal etmek için CarAudioManager#unregisterCarVolumeGroupEventCallback()

Bir uygulama yeni CarVolumeGroupEventCallback ve eski CarVolumeCallback ile kaydolduğunda CarVolumeGroupEventCallbacks etkinliğine öncelik verilir. Araç ses grubu artık CarVolumeCallback'ü tetiklemiyor. Bu sayede, aynı etkinlik için aynı uygulamaya yinelenen tetikleyiciler gönderilmez.

Grup ses düzeyini yönetmek ve sessizleştirme değişikliklerini kontrol etmek için CarVolumeGroupEventCallback simgesini kullanmanızı önemle tavsiye ederiz.

Ses kazancı geri çağırma işlevi

Android 13'ten beri AudioControl HAL, araç ses sisteminde yapılan değişiklikler nedeniyle ses seviyesi güncellemelerini yönetmek için ayarsız geri çağırma işlevi tetikleyebilir.

HAL API

AudioControl @2.0 AIDL

AudioControl AIDL HAL'ın 2.0 sürümü aşağıdaki API'yi ekler:

API Amaç
IAudioControl#registerGainCallback AudioControl HAL ile bir IAudioGainCallback örneği kaydeder.
IAudioGainCallback#onAudioDeviceGainsChanged Ses kazancı yapılandırmasında yapılan değişiklikleri bildirmek için ayarsız geri çağırma işlevi.

AudioControl HAL geri çağırma işlevi, nedenlerin listelerini ve ilgili AudioGainConfigInfo öğesini içerir. AudioGainConfigInfo şuradan 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 düzeyinde ve sessize alma davranışında geçici değişiklik.
  • Nedeni güncelleyin. 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:

  • 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 sessize alma açma/kapatma düğmesi
Kapat ❌ (sesi aç)

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

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

Kısıtlamalar arasında öncelik sırası şu şekildedir: Sesi kapatma > Engelleme > Sınırlama > Zayıflatma.

Sessize alma kısıtlamaları

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

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Araç ses sistemi çerçevesi, sessiz modu dahili olarak şu iki durumda tutar:

  • Kullanıcıyı susturma CarAudioManager veya önemli etkinlikler aracılığıyla kullanıcının isteğine göre açılıp kapatılır.

  • HAL sessiz. AudioGain geri çağırma işlevi aracılığıyla alınan sessize alma kısıtlamalarına göre açılıp kapatılır.

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

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

Etkileşim örneği: HAL sessize alma etkin ve kullanıcı sessize alma düğmesini açmak istiyor

HAL sessize alma etkinleştirildiğinde ve kullanıcı sessize alma devre dışı bırakıldığında:

  • Ses grubu genel sessize alma durumu true olarak değiştirilir.
  • Kullanıcının sessize alma özelliğini etkinleştirme istekleri işlenir.
    • Neden: Kullanıcı gizliliğini korumak için kullanıcıların sessize alma istekleri her zaman dikkate alınmalıdır.

HAL sessize alma özelliği ve kullanıcı sessize alma özelliği etkinleştirildiğinde:

  • Ses grubu genel sessize alma durumu true olarak değiştirilir.

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

    • Neden: Kullanıcının sesli mesaj gönderme isteklerini yalnızca etkin kısıtlama yoksa kabul ederiz.

    • Neden: Önbelleğe alınmış kullanıcının sesini açmak, istenmeyen ses patlamalarına neden olabilir ve kullanıcı güvenliğini tehlikeye atabilir. Bu durum, özellikle açma/kapatma döngülerinde sessiz mod etkinse geçerlidir. Bu durumda kullanıcıların ses seviyesi algısı azalır.

Etkileşim örneği: Kullanıcı sessize alma özelliğinde değişiklik olmamasına rağmen HAL sessize alma özelliği etkinleştirildi ve devre dışı bırakıldı

HAL sessize alma düğmesini açmak, ses grubu genel sessize alma durumunu değiştirir. Ancak bu işlem, kullanıcının sessize alma durumunu doğrudan güncellemez. Kullanıcının sesi kapalıyken HAL sessiz modunu etkinleştirmek için geri çağırma işlevi alındığında:

  • Ses grubu genel sessize alma durumu true olarak değiştirilir.
  • Kullanıcının ses seviyesini değiştirme istekleri, HAL sessize alma özelliği etkinken NOT işlenir.

    • Neden: Kullanıcı, sessize alma özelliği etkinken sesi algılayamaz. Ses seviyesinin değiştirilmesine izin vermek, sesin aniden yükselmesine neden olarak kullanıcı güvenliğini tehlikeye atabilir.

    • Neden: Ses uygulamaları, geri çağırmalara kaydolabilir ve OEM tarafından beklenen davranış bu ise kullanıcı müdahalesi olmadan sessiz modu kaldırma (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) işlemini otomatik olarak tetikleyebilir.

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ştirilir.

    Neden: Sessiz durumunun yapışkan hale getirilmesi ve kullanıcıdan sesi açmasını istemek, sessiz durumu sık sık değiştiğinde kullanıcının gereksiz yere kesintiye uğramasına neden olabilir.

  • Kullanıcılardan gelen ses seviyesi 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ı etkinken kullanıcıların aşağıdaki işlemleri yapması engellenir:

  • Ses düzeyi değişiklikleri işleme alınmaz.
  • Sesi aç/kapat 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ı etkinken kullanıcılardan gelen aşağıdaki istekler:

  • Ses düzeyini değiştirme:

    • Sınır dahilinde olanlar işlenir
    • Yukarıdaki sınırlamalar işlenmez.
  • Sesi aç/kapat işlemleri işlenir.

Zayıflama

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

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

Zayıflatma kısıtlamaları etkinken kullanıcılardan gelen aşağıdaki istekler:

  • Ses düzeyini değiştirme işlemleri işlenir. Yeni mevcut ses seviyesi, eski ses seviyesi yerine azaltılmış ses seviyesine ayarlanır. Gelecekte ses düzeyinde yapılacak değişiklikler bu düzeyden yapılır.

  • Sesi aç/kapat işlemi işlenir.

Dizine ekleme güncellemesi

Aşağıdakiler, zaman uyumsuz cilt dizini güncellemesi olarak kabul edilir: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

Bu nedenle, AudioControl HAL ses grubu geçerli dizini belirtilen dizinle güncelleyebilir. Bu değer, öncelikle araç ses sistemi ç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 CarVolumeGroupEvent geri çağırma olarak da uygulamalarla paylaşılır.

Örnekler

Kullanım alanı: Kullanıcı, ses düzeyi dizini değerini 30 olarak günceller

  • Kullanıcı, ses indeksini 30'a değiştirmek için Ses uygulamasını kullanır.

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

  • Tedarikçi firmaların Audio HAL uygulamalarında yeni ses kazancı alınır ve ses sistemi (harici amplifikatör gibi) güncellenir.

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

  • AudioControl HAL tetikleyicilerinin tedarikçi firma uygulamaları:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Araba ses hizmeti, kalıcılığa ve ses uygulamasına geri çağırmalar için kullanılan geri çağırmadaki 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 sonra ilk ses çalma

  • Askıya alınmadan önceki ses seviyesi dizini 95 gibi yüksek bir seviyeye (aralık: [0-99]) ayarlanır.

  • Android askıya alınır.

  • Android askıya alındıktan sonra (örneğin, devam ettir):

    • Tedarikçi firma Audio HAL/AudioControl HAL, ses sistemine yerel olarak 30 değerinde güvenli bir dizin uygular.

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

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Araba ses hizmeti, kalıcılığa yönelik olarak kullanılan geri çağırma işlevinden yeni dizini ve dizini senkronize eden ses uygulamasına yönelik kendi geri çağırma işlevlerini tüketir. Askıya alınmadan önceki ses düzeyi dizini 95'tir. Ancak devam etmeden sonra bu dizin, AudioControl HAL uygulayıcısı tarafından 30 değerinde güvenli bir ses seviyesine ayarlanır.

Dinamik ses düzeyi yapılandırması

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

  1. Aracın kullanımdan kaldırma (EOL) yapılandırması.

    • Otomobil üreticileri, ses sistemi kurulumuna göre araç ses sistemi kurulumuna göre ses seviyesi yapılandırmalarını son kullanım tarihinde güncellemeyi tercih eder. Genellikle bu, Android SW imajını güncellemeden 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, önyükleme sırasında sorgulanan ses aralığı yapılandırmalarını barındırabilir.

  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 üzerine ses özelliklerine yönelik artan ihtiyacı desteklemek için sunulur. Yeni ses aralığı yapılandırmaları, abonelik süresi boyunca geçerlidir.

Tasarım

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

  • Discovery Tedarikçi firmanın AudioControl HAL uygulaması, tedarikçi firmaya ait özel bir IPC mekanizması aracılığıyla yeni ses seviyesi aralığı güncellemelerini keşfeder.

    Tespit edildikten sonra AudioControl::IModuleChangeCallback üzerinden geri arama yapılır.

  • Güncelleme. Araç ses grubu, ses grubu durumlarını yeni ses aralıkları ile günceller.

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

  • Geri arama

    • Ses grubu aralığı güncellemelerinden sonra araç ses grubu, CarVolumeGroupEventCallback üzerinden kayıtlı uygulamalara geri çağırma işlemi tetikler.

    • CarVolumeGroupEvent, güncellenen CarVolumeGroupInfo, Etkinlik-türü (ne değişti) ve Ek-bilgi (neden değişti) bilgilerini 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 IModuleChangeCallback örneği oluşturur.
IAudioControl#clearModuleChangeCallback Daha önce AudioControl HAL ile ayarlanan IModuleChangeCallback örneğini temizler.
IModuleChangeCallback#onAudioPortsChanged AudioPorts'ta yapılan değişiklikleri bildirmek için geri çağırma

Sıra

Dinamik hacim yapılandırmasının ardışık düzen şeması aşağıda gösterilmiştir.

resim

Şekil 3. Dinamik ses düzeyi yapılandırması için akış şeması.

Önemli hususlar

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

  • Geri çağırma işlevi kapsamında sağlanan AudioPorts, AutomotiveBUS tanımı ile 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, Audio HAL politikasında ses aralığı tanımlarının bir süper 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 grubuna birden fazla ses otobüsü aitse her birinin ses aralığı tanımı aynı olmalıdır. Aksi takdirde, araç ses çerçevesi yeni ses aralığı tanımını reddeder.