Hacim yönetimi

AAOS'un CarAudioService içinde kendi ses düzeyi yönetimi vardır. Ses düzeylerinin HAL'ın altında bir donanım amplifikatörü tarafından yazılım yerine uygulanması gerektiği beklentisiyle sabit ses düzeyleri kullanır. Ayrıca, çıkış cihazlarını ses grubuyla ilişkili tüm cihazlara aynı kazançları uygulamak için ses gruplarına ayırır.

Sabit birimleri kullanma

AAOS uygulamaları, ses seviyesini yazılım karıştırıcı yerine donanım amplifikatörü kullanarak kontrol etmelidir. 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 yanlış olarak ayarlandığında) uygulamalar AudioManager.setStreamVolume()'i çağırabilir ve yazılım karıştırıcısında sesi yayın türüne göre değiştirebilir. Bu, diğer uygulamalar üzerindeki potansiyel etki ve yazılım karıştırıcıda ses azaltmanın, donanım amplifikatöründe alındığında sinyaldeki önemli bit sayısını azaltması nedeniyle istenmeyebilir.

Ses seviyesi grupları

Ses grupları, bir ses bölgesindeki cihaz koleksiyonunun ses düzeylerini yönetir. Her ses grubu için ses bağımsız olarak kontrol edilebilir ve 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 saklanır 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="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>

Örnek car_audio_configuration.xml uygulaması.

Her ses grubu, ilişkili adreslere sahip bir veya daha fazla çıkış cihazı içermelidir. Bu 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, minimum, maksimum ve varsayılan kazanç değerlerinin yanı sıra bir adım boyutuna sahiptir. Bunlar, birim grubuyla ilişkili cihazlar için audio_policy_configuration.xml'te yapılandırılmış değerlere göre belirlenir.

<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 nedeniyle, bir ses grubuyla ilişkili 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ındaki tanımlama sırasına göre çalışma zamanında tanımlanır. Kimlikler, bir ses bölgesinde 0 ile N-1 arasındadır. Burada N, söz konusu bölgedeki ses grubu 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. Yukarıdaki Hacim gruplarını tanımlama bölümünde verilen örneği inceleyin.

Her bölgenin mevcut ses seviyeleri, ilgili bölgeyle ilişkili kullanıcı için devam eder. 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ı olur.

Ses tuşu etkinliklerini işleme

Android, ses seviyesi kontrolü için KEYCODE_VOLUME_UP, KEYCODE_VOLUME_DOWN ve KEYCODE_VOLUME_MUTE dahil olmak üzere çeşitli tuş kodları tanımlar. Android, ses düğmesi etkinliklerini varsayılan olarak uygulamalara yönlendirir. Otomotiv uygulamaları bu önemli etkinlikleri CarAudioService'e zorlamalıdır. CarAudioService daha sonra uygun şekilde setGroupVolume veya setMasterMute'yi çağırabilir.

Bu davranışı zorlamak için config_handleVolumeKeysInWindowManager işaretini true olarak ayarlayın:

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

Ses anahtar etkinlikleri şu anda hangi bölge için tasarlandıklarını ayırt edemez. Bu nedenle, tüm etkinliklerin 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'sinin her iki sürümü de araçta fade ve denge ayarlamak için API'ler içerir. CarAudioManager için AudioControl HAL'e değer aktaran ilgili sistem API'leri vardır. 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 değeri ortada, +1,0 değeri tamamen sağda, -1,0 değeri tamamen soldadır. -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 merkezde, +1,0 tamamen ileri, -1,0 tamamen geridir ve -1 ile 1 arasındaki aralığın dışındaki değerler hata olarak kabul edilir.

Bu değerlerin nasıl uygulanmasına ve kullanıcılara nasıl gösterileceğine OEM'ler karar verir. Bu ayarlar yalnızca medyaya veya tüm Android seslerine uygulanabilir.

Android 11, çıkış cihazlarına ses efektleri uygulama desteği de sunar. Bu sayede, sesin yavaşça azaltılması ve dengesi, bu API'ler yerine uygun çıkış cihazlarındaki ses efektleri aracılığıyla yönetilebilir.

Sesi kısma

Sesi kısma, araç aynı anda çalan başka bir yayının daha net duyulması için bir yayının kazancını azalttığında gerçekleşir. AAOS'te, Android dışında işletim sisteminin kontrol edemediği birçok ses olabileceğinden ses azaltma özelliğinin uygulanması HAL'e bırakılır. Android 11'de, ses azaltma kararları almak için HAL'in kullanabileceği temel bilgi, iki çıkış cihazının her ikisinde de etkin yayın olup olmadığıdır.

Ne zaman eğilmelisiniz?

Ses azaltmanın HAL tarafından nasıl ele alınacağını belirlemek OEM'lere bağlıdır. Bununla birlikte, önerdiğimiz bazı genel yönergeler vardır. Android'de birden fazla yayının oynatılması genellikle iki uygulama/hizmetin ses odağını aynı anda tutması durumunda gerçekleşir. Bu nedenle, Android'in ne zaman eşzamanlı odaklanma sağlayabileceğini ve dolayısıyla iki farklı yayının eşzamanlı olarak oynatılmasının ne zaman mümkün olabileceğini öğrenmek için Etkileşim matrisi bölümüne bakın.

Android tarafından karıştırılan tüm akışların, kazançlar uygulanmadan önce yapıldığını unutmayın. 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ı birlikte karıştırmadan önce ses seviyesi azaltma işlemini uygulayabilmesi için ayrı çıkış cihazlarına yönlendirilmelidir.

Önerilen eğme davranışı

Aşağıda, videonun saklanması önerilen olası eşzamanlı etkileşimler verilmiştir:

  • EMERGENCY. Sürücünün sesi duymasını sağlamak için SAFETY dışındaki tüm sesleri kapatın veya seslerini kısın
  • SAFETY. Sürücünün sesi duymasını sağlamak için EMERGENCY dışındaki tüm sesleri kapatın
  • NAVIGATION. SAFETY ve EMERGENCY dışındaki her şeyi atlama
  • CALL. SAFETY, EMERGENCY ve NAVIGATION dışındaki tüm işlemleri atlama
  • VOICE. Duck CALL_RING
  • Etkin VEHICLE_SOUNDS sesin önemini ve sürücünün bunları duymasını sağlamak için diğer seslerin azaltılıp azaltılmayacağını OEM'ler belirler.
  • MUSIC ve ANNOUNCEMENT her şey tarafından atlanabilir. Bununla ilgili temel istisna, şu anda SYSTEM_SOUND olarak çalınan dokunma etkileşimi tonlarıdır.

Sessiz modu kullanırken dikkat edilmesi gereken diğer noktalar

Navigasyon veya asistan gibi bazı uygulamalar/hizmetler, işlemlerini tamamlamak için birden fazla oyuncu kullanabilir. OEM'ler, kullanıcının navigasyon veya asistan uygulamasından bir sonraki oynatma işlemi başladığında sesin tekrar kısılması için medya ses düzeyinin bu çıkış cihazlarından ne zaman gelmeyi durdurduğuna bağlı olarak çok agresif bir şekilde ses azaltma işlemi yapmamalıdır.

Yeterince iyi yalıtılmış birden fazla ses aralığına sahip araçlarda, sesin sessizleştirilmesi yerine aracın farklı bölgelerine yönlendirilmesi de mümkündür. Örneğin, navigasyon talimatları sürücünün kafalık hoparlörlerine yönlendirilebilirken müzik kabinde normal ses seviyesinde çalmaya devam edebilir.

Güvenlik açısından kritik sesler

Android 11'de HAL ses odak API'leri kullanıma sunulsa da güvenlik açısından kritik seslere diğer seslere göre öncelik verilmesi HAL'e bağlıdır. HAL, USAGE_EMERGENCY için ses odağını elinde tutsa bile Android'deki uygulamaların ve hizmetlerin ses çalmayacaklarını garanti etmez. Güvenlik açısından kritik sesler çalarken Android'deki hangi akışların karıştırılması veya sessize alınması gerektiğini HAL 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 (ses gruplarını yapılandırma bölümünde açıklandığı gibi örtüşebilir). Bu ayırma, gelecekte birim grupları yapılandırması değişirse herhangi bir değişiklik yapılmasını önler.

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

Örneğin, aşağıdaki örnekte bir VolumeGroup hem voice_communication hem de voice_communication_signalling içerecek şekilde tanımlanmıştır. Araba ayarları kullanıcı arayüzünün varsayılan uygulaması, dosyada ilk olduğu için voice_communication ile ilişkili kaynakları kullanarak VolumeGroup'u 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ü, VolumeGroup tabanlı CarAudioManager API'lerini kullanır:

  • getVolumeGroupCount() değerini kullanarak kaç kontrol çizileceğini öğrenin.
  • getGroupMinVolume() ve getGroupMaxVolume() alt ve üst sınırları elde etmek için.
  • getGroupVolume() komutunu kullanarak mevcut ses seviyesini öğrenebilirsiniz.
  • registerVolumeChangeObserver()'yi etkinleştirerek ses seviyesi değişiklikleri hakkında bildirim alabilirsiniz.