Hacim yönetimi

AAOS'un CarAudioService içinde kendi ses düzeyi yönetimi vardır. Hacimlerin HAL'nin altına yazılım yerine bir donanım amplifikatörü tarafından uygulanması beklentisiyle sabit hacimler kullanır. Ayrıca, aynı kazanımları birim grubuyla ilişkili tüm aygıtlara uygulamak için çıkış aygıtlarını birim grupları halinde düzenler.

Sabit hacimleri kullanma

AAOS uygulamaları, ses seviyesini bir yazılım karıştırıcısı yerine bir donanım amplifikatörü kullanarak kontrol etmelidir. Yan etkilerden kaçınmak için config_useFixedVolume bayrağını true olarak ayarlayın (gerektiğinde kaplama):

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

config_useFixedVolume bayrağı ayarlanmadığında (veya false değerine ayarlandığında), uygulamalar AudioManager.setStreamVolume() çağırabilir ve ses düzeyini yazılım karıştırıcısında akış türüne göre değiştirebilir. Bu, diğer uygulamalar üzerindeki potansiyel etki nedeniyle ve yazılım karıştırıcısındaki ses seviyesi zayıflamasının, donanım yükselticisinden alındığında sinyalde daha az sayıda önemli bit bulunmasına yol açması nedeniyle istenmeyen bir durum olabilir.

Cilt grupları

Ses seviyesi grupları, bir ses bölgesi içindeki bir dizi cihaz için ses birimlerini yönetir. Her ses grubu için ses düzeyi bağımsız olarak kontrol edilebilir ve elde edilen kazanımlar, aracın amplifikatörü tarafından uygulanacak ilgili cihazlar üzerinde yapılandırılır. Ses düzeyi ayarları kullanıcı için kalıcı olur ve kullanıcı oturum açtığında yüklenir.

Birim gruplarını tanımlama

CarAudioService, car_audio_configuration.xml dosyasında tanımlanan birim 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 birim grubu, ilişkili adreslere sahip bir veya daha fazla çıkış aygıtı içermelidir. Bu adresler audio_policy_configuration.xml dosyasında tanımlanan çıkış aygıtlarına karşılık gelmelidir.

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

Her hacim grubunun minimum, maksimum ve varsayılan kazanç değerlerinin yanı sıra bir adım boyutu da vardır. Bunlar, ses grubuyla ilişkili cihazlar için audio_policy_configuration.xml dosyasında yapılandırılan 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>

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

  • Adım boyutu. Birim grubu tarafından kontrol edilen tüm cihazlar için aynı olmalıdır
  • Asgari 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 seviyesi grubunun kazancını, ses grubuyla ilişkili bir cihaz için desteklenen aralığın dışında ayarlamak mümkündür. Bu durumda, o cihaz için kazanç, ses grubu değerinin aralığın altında veya üstünde olmasına bağlı olarak cihazın minimum veya maksimum kazanç değerine ayarlanacaktır.

Birim grubu tanımlayıcıları

Birim grupları çalışma zamanında XML dosyasındaki tanım sıralarına göre tanımlanır. Kimlikler bir ses bölgesi içinde 0 ile N-1 arasında değişir; burada N, o bölgedeki ses seviyesi gruplarının sayısıdır. Bu şekilde, birim 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 olmayan bir groupId alan herhangi bir API, varsayılan olarak birincil ses bölgesini kullanır.

Çok bölgeli ses düzeyi yönetimi

Her ses bölgesinin bir veya daha fazla ses seviyesi grubuna sahip olması beklenir ve her ses seviyesi grubu yalnızca tek bir ses bölgesiyle ilişkilendirilir. Bu ilişki car_audio_configuration.xml dosyasının bir parçası olarak tanımlanır. Yukarıdaki Hacim gruplarını tanımlama bölümünde verilen örneğe bakın.

Her bölgenin geçerli ses seviyesi seviyeleri, o bölgeyle ilişkili kullanıcı için kalıcı olur. Bu ayarlar bölgeye özeldir, yani bir kullanıcı birincil bölgeyle ilişkili bir ekranda oturum açarsa ve daha sonra ikincil ses bölgesiyle ilişkili bir bölgede oturum açarsa, ilk bölge için yüklenen ve sürdürülen ses seviyeleri, ikincil bölge için olanlar.

Ses seviyesi tuşu olaylarını yönetme

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

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

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

Ses seviyesi tuşu etkinliklerinin şu anda hangi bölgeye yönelik olduklarını ayırt etmenin bir yolu yoktur ve bu nedenle hepsinin birincil ses bölgesiyle ilişkili olduğu varsayılmaktadır. Bir ses seviyesi tuşu olayı alındığında CarAudioService aktif oynatıcılar için 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 tanımlanan sabit sıralamaya göre belirlenir.

Solma ve denge

AudioControl HAL'in her iki sürümü de araçta solma ve dengeyi ayarlamak için API'ler içerir. CarAudioManager için değerleri AudioControl HAL'a ileten ilgili sistem API'leri vardır. Bu API'ler android.car.permission.CAR_CONTROL_AUDIO_VOLUME gerektirir.

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 ortalanmış, +1,0 tamamen sağ, -1,0 tamamen sol ve -1 ila 1 aralığının dışındaki bir değer hatadır.
  • setFadeTowardFront(float value) - Hoparlör sesini arabanın önüne (+) veya arkasına (-) doğru kaydırır. 0,0 ortalanmış, +1,0 tamamen ileri, -1,0 tamamen geri ve -1 ila 1 aralığının dışındaki bir değer bir hatadır.

Bu değerlerin nasıl uygulanması gerektiğine ve kullanıcılara nasıl gösterileceklerine karar vermek OEM'lere kalmıştır. Kesinlikle medyaya veya genel olarak tüm Android seslerine uygulanabilirler.

Android 11 ayrıca çıkış cihazlarına ses efektleri uygulama desteğini de tanıttı. Bununla alternatif olarak solma ve dengeyi bu API'ler yerine uygun çıkış cihazlarındaki ses efektleri aracılığıyla yönetmek mümkündür.

Sesin kısılması

Araç, aynı anda çalan başka bir akışın daha net duyulabilmesi için bir akışın kazancını azalttığında ses kısılması meydana gelir. AAOS'ta, Android dışında işletim sisteminin üzerinde hiçbir kontrolü olmayan birçok ses potansiyel olarak mevcut olduğundan, ses kısma işlemi HAL'e bırakılmıştır. Android 11'de, HAL'in kullanabileceği ana bilgi, iki çıkış cihazının her ikisinin de aktif akışlara sahip olup olmadığıdır.

Ne zaman eğilmeli

Eğilmenin HAL tarafından nasıl ele alınacağına karar vermek bireysel OEM'e kalmış olsa da önerdiğimiz bazı genel kurallar vardır. Android'de oynatılan birden fazla akış, çoğunlukla iki uygulama/hizmet ses odağını aynı anda tuttuğunda meydana gelir. Bunu akılda tutarak, Android'in ne zaman eşzamanlı odaklama sağlayabileceğini ve dolayısıyla iki farklı akışın eş zamanlı olarak oynatılmasının ne zaman mümkün olabileceğini öğrenmek için Etkileşim matrisine bakın.

Android tarafından karıştırılan tüm akışların, herhangi bir kazanç uygulanmadan önce yapılacağını unutmayın. Bu nedenle, bir başkasıyla eş zamanlı oynatıldığında eğilmesi gereken herhangi bir akış, HAL'in bunları birbirine karıştırmadan önce kıstırma uygulayabilmesi için ayrı çıkış cihazlarına yönlendirilmelidir.

Önerilen eğilme davranışı

Aşağıda, eğilmenin uygulanmasını önerdiğimiz olası eşzamanlı etkileşimler yer almaktadır:

  • EMERGENCY . Sürücünün sesi duyduğundan emin olmak için SAFETY dışındaki her şeyi kısın veya sessize alın
  • SAFETY . Sürücünün sesi duyduğundan emin olmak için EMERGENCY dışındaki her şeyi eğilin
  • NAVIGATION . SAFETY ve EMERGENCY dışındaki her şeyi göz ardı edin
  • CALL . SAFETY , EMERGENCY ve NAVIGATION dışındaki her şeyi göz ardı edin
  • VOICE . Ördek CALL_RING
  • Aktif VEHICLE_SOUNDS önemini ve sürücünün bunları duymasını sağlamak için diğer sesleri susturup kaçırmamalarını belirlemek OEM'lere kalmıştır.
  • MUSIC ve ANNOUNCEMENT her şeyden kaçınılmalıdır. Bunun ana istisnası şu anda SYSTEM_SOUND olarak çalınan dokunma etkileşimi tonlarıdır.

Eğilirken dikkat edilmesi gereken diğer hususlar

Navigasyon veya asistan gibi bazı uygulamalar/hizmetler, işlemlerini tamamlamak için birden fazla oynatıcı kullanabilir. OEM'ler, kullanıcının navigasyondan veya asistan uygulamasından bir sonraki oynatma başladığında medyanın bir an için tam ses düzeyine geri dönmemesini sağlamak için akış verilerinin bu çıkış cihazlarından gelmesinin ne zaman durduğuna bağlı olarak çok agresif bir şekilde ses kısmaktan kaçınmalıdır.

Yeterince iyi izolasyona sahip birden fazla ses aşamasına sahip araçlar için, sesi eğilmek yerine arabanın farklı bölgelerine yönlendirme seçeneği de mevcut. Örneğin, müzik kabinde normal ses seviyesinde çalmaya devam ederken, navigasyon talimatları sürücünün koltuk başlığı hoparlörlerine yönlendirilebilir.

Güvenlik açısından kritik sesler

Android 11, HAL ses odaklama API'lerini kullanıma sunmuş olsa da, güvenlik açısından kritik seslerin diğerlerine göre önceliklendirilmesi hala HAL'e kalmıştır. HAL, USAGE_EMERGENCY için ses odağını tutsa bile bu, Android içindeki uygulama ve hizmetlerin ses çalmayacağını garanti etmez. Güvenlik açısından kritik sesler çalınırken Android'den hangi akışların karıştırılması veya sessize alınması gerektiğini belirlemek HAL'a kalmıştır.

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

AAOS, birim ayarları kullanıcı arayüzünü birim grubu yapılandırmasından ayırır (bu, birim gruplarını yapılandırma bölümünde açıklandığı gibi üst üste yerleştirilebilir). Bu ayırma, gelecekte birim grubu yapılandırmasının değişmesi durumunda herhangi bir değişikliğe gerek kalmamasını sağlar.

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 yer alan ilk tanınan kullanımla ilişkili kaynakları kullanarak tanımlanan VolumeGroups makul bir şekilde oluşturulmasını sağlar.

Örneğin, aşağıdaki örnek bir VolumeGroup'u hem voice_communication hem de voice_communication_signalling içerecek şekilde tanımlar. Araç ayarları kullanıcı arayüzünün varsayılan uygulaması, dosyadaki ilk kaynak 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 nitelikler ve değerler packages/apps/Car/Settings/res/values/attrs.xml dosyasında beyan edilmiştir. Ses seviyesi ayarları kullanıcı arayüzü aşağıdaki VolumeGroup tabanlı CarAudioManager API'lerini kullanır:

  • Kaç kontrolün çizilmesi gerektiğini bilmek için getVolumeGroupCount() .
  • Alt ve üst sınırları almak için getGroupMinVolume() ve getGroupMaxVolume() .
  • Geçerli birimi almak için getGroupVolume() .
  • Ses seviyesi değişikliklerinde bildirim almak için registerVolumeChangeObserver() .