Ses düzeyi yönetimi

AAOS, CarAudioService içinde kendi ses düzeyi yönetimine sahiptir. Düzeltilmiş bir donanım tarafından HAL'nin altında uygulanması beklenen birim sayısı bir amplifikatör olabilir. Ayrıca çıkış cihazlarını ses grupları halinde düzenler aynı kazanımları ses düzeyi grubuyla ilişkili tüm cihazlara da uygulayın.

Sabit birimleri kullanma

AAOS uygulamaları, ses düzeyini farklı olabilir. Yan etkilerden kaçınmak için config_useFixedVolume işaretini ayarlayın "true" (doğru) olarak değiştirin (gerektiğinde yer paylaşımlı olarak):

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

config_useFixedVolume işareti ayarlanmadığında (veya yanlış değerine ayarlandığında) uygulamalar AudioManager.setStreamVolume() işlevini çağırabilir ve akış türüne göre ayrılmış ses seviyesidir. Bu işlem, diğer uygulamalar üzerindeki potansiyel etkilerini ve hacmin azalmasının Bu nedenle, yazılım karıştırıcının sinyalde daha az belirgin bit alınan ses seviyesidir.

Birim grupları

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

Ses gruplarını tanımlama

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

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

Örnek car_audio_configuration.xml uygulaması.

Her ses grubu grubunda, ilişkili adreslere sahip bir veya daha fazla çıkış cihazı bulunmalıdır. Bu adresler, şurada tanımlanan çıkış cihazlarına karşılık gelmelidir: audio_policy_configuration.xml

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

Her hacim grubunun minimum, maksimum ve varsayılan kazanç değerlerinin yanı sıra boyutudur. Bunlar, İlişkilendirilmiş cihazlar için audio_policy_configuration.xml ses seviyesi grubuyla.

<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 ses grubu grubu, ilgili cihazları bulun ve grubu aşağıdaki gibi yapılandırın:

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

Bu değerlerin yapılandırılma şekli nedeniyle, ses grubu, ses düzeyi grubuyla ilişkilendirilmiş bir cihaz için desteklenen aralığın dışındadır. Bu durumda, o cihaz için kazanç, cihazın minimum veya maksimum değerine ayarlanır. hacim grubu değerinin aralığın altında mı yoksa üstünde mi olduğuna bağlı olarak değer kazanç elde eder.

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ölgesinde 0 ile N-1 arasında değişir. N, o bölgede çalışır. Bu şekilde, birim grubu kimlikleri alt bölgeler arasında benzersiz olmaz. Bu tanımlayıcılar birim gruplarıyla ilişkilendirilmiş CarAudioManager API için kullanılır. Tüm API'ler zoneId olmadan bir groupId alan öğeler için varsayılan olarak birincil ses bölgesi.

Çoklu alt bölge hacim yönetimi

Her ses bölgesinin bir veya daha fazla ses düzeyi grubuna ve her ses düzeyi grubuna sahip olması beklenir yalnızca tek bir ses bölgesiyle ilişkilendirilir. Bu ilişkinin tanımı, car_audio_configuration.xml Şurada sağlanan örneği inceleyin: Yukarıda birim grupları tanımlama başlıklı makaleyi inceleyin.

İlişkilendirilen her bir alt bölge için mevcut ses düzeyleri korunur. o bölgede çalışır. Bu ayarlar bölgeye özgüdür. Yani, kullanıcı bir ekranda oturum açtığında önce alt bölgeyle ilişkilendirilen alt bölgeyle ilişkilendirilen bir alt bölgede ikincil ses bölgesi varsa birinci alt bölgede yüklenen ve devam eden ses düzeyleri ikincil alt bölgeye göre farklı olmalıdır.

Hacimsel önemli etkinlikleri işleme

Android ses seviyesi kontrolü için çeşitli tuş kodları tanımlar. Örneğin: KEYCODE_VOLUME_UP, KEYCODE_VOLUME_DOWN ve KEYCODE_VOLUME_MUTE. Varsayılan olarak Android ses seviyesi tuşunu yönlendirir nasıl aktarabileceğinizi açıklayacağım. Otomotiv uygulamaları, bu önemli etkinlikleri CarAudioService, daha sonra şu numarayı arayabilir: setGroupVolume veya setMasterMute.

Bu davranışı zorunlu kılmak için config_handleVolumeKeysInWindowManager ayarını yapın true olarak işaretle:

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

Hacim önemli etkinlikleri için şu anda bunların hangi alt bölge olduğunu ayırt etmek mümkün değildir birincil ses bölgesiyle ilişkili olduğu varsayılır. Ses düzeyi önemli etkinliği alındığında CarAudioService hangi hacmi belirler? grubu düzenleyerek etkin oynatıcılar için ses bağlamlarını getirip en yüksek önceliğe sahip çıkış cihazını içeren ses düzeyi grubu ses bağlamı. Önceliklendirme, şurada tanımlanan sabit bir sıralamaya göre belirlenir: CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY

Kararma ve dengeleme

AudioControl HAL'nin her iki sürümünde de renk solması ve denge ayarı için API'ler bulunur. araç. CarAudioManager'da, değerleri ileten ilgili sistem API'leri bulunur AudioControl HAL'sine indirilir. Bu API'ler için android.car.permission.CAR_CONTROL_AUDIO_VOLUME

AudioControl API'leri şunlardır:

  • setBalanceTowardRight(float value) Hoparlörün ses seviyesini şuraya kaydırır: arabanın sağ (+) veya sol (-) tarafına basın. 0,0 ortalanmış, +1.0 tamamen sağlanmış, -1, 0 tamamen soldur ve -1 - 1 aralığının dışında kalan bir değer hatadır.
  • setFadeTowardFront(float value) - Hoparlörün ses seviyesini doğru kaydırır ön (+) veya arka (-) simgesine dokunun. 0, 0 ortalanmış, +1.0 tamamen ileri doğrudur. -1, 0 tamamen geridedir ve -1 - 1 aralığının dışındaki bir değer hatadır.

Bu değerlerin nasıl uygulanacağına ve ürün kalitesinin nasıl gösterilir. Yalnızca medyaya veya genel tüm Android seslerini duyabilirsiniz.

Android 11'de, çıkış cihazlarına ses efektleri uygulama desteği de sunuldu. Bu özellikte, ses efektleriyle solma ve dengelemeyi yönetmeniz de mümkün. .

Sesi kısma

Sesi kısma, araç bir akışın kazancını azalttığında gerçekleşir Böylece aynı anda oynatılan başka bir yayın daha net duyulabilir. AAOS'de, potansiyel olarak çok sayıda ses olduğundan, sesi kısma özelliği HAL'ye bırakılır Android dışındaki cihazlar da dahildir. Android 11'de temel bilgiler karar vermek için HAL'ye ulaşabilen, iki çıkış cihazının da etkin akış.

Ne zaman kapatılmalı?

Sıralamanın HAL tarafından nasıl ele alınacağını belirlemek bireysel OEM'nin sorumluluğu olsa da önerdiğimiz bazı genel yönergelerdir. Android'de oynatılan birden fazla akış: Genellikle iki uygulama/hizmet aynı anda ses odağına sahip olduğunda ortaya çıkar. Demek ki, Etkileşim matrisi adlı makaleyi inceleyin Android'in ne zaman aynı anda odaklanma sağlayabileceğini ve böylece, aynı anda iki ayrı farklı canlı yayınları aynı anda oynatabilirsiniz.

Android ile karıştırılan tüm akışların bunu herhangi bir kazançtan önce yapacağını unutmayın hakkında daha fazla bilgi edineceksiniz. Bu nedenle, Diğeri, HAL'nin daha önce azaltma uygulayabilmesi için ayrı çıkış cihazlarına yönlendirilmelidir. bir araya getirmektir.

Önerilen kısma davranışı

Sesi kısmanızı önerdiğimiz olası eş zamanlı etkileşimler aşağıda verilmiştir uygulanacak:

  • EMERGENCY SAFETY dışındaki her şeyi kısmak veya sesini kapatmak için sürücünün sesi duyduğundan emin olun
  • SAFETY EMERGENCY dışındaki her şeyi kısmak için sürücü sesi duyar
  • NAVIGATION SAFETY ve dışındaki her şeyi dahil et EMERGENCY
  • CALL SAFETY hariç her şeyi kapat, EMERGENCY ve NAVIGATION
  • VOICE Ördek CALL_RING
  • Etkin VEHICLE_SOUNDS ürünün önemini belirlemek OEM'lerin görevidir ve sürücünün bunları duyması için diğer sesleri kısmak isteyip istemediklerine karar verin.
  • MUSIC ve ANNOUNCEMENT her şeyin altında durmalıdır. Bunun ana istisnası, şu anda SYSTEM_SOUND.

Beğenmeyi tercih ederken dikkat edilmesi gereken diğer noktalar

Navigasyon veya asistan gibi bazı uygulamalar/hizmetler, görevleri tamamlamak için birden fazla oynatıcı kullanabilir en iyi uygulamaları görelim. OEM'ler, akış verilerinin ne zaman durduğuna bağlı olarak içeriğin çok agresif bir şekilde ayrılmasından kaçınmalıdır kullanıcının kısa bir süre içinde medyanın geri gitmediğinden emin olmak için bu çıkış cihazları üzerinden navigasyon sırasındaki bir sonraki oynatma sırasında küçülmeden önce en yüksek ses seviyesine ayarlanır veya Asistan uygulaması başlar.

Birden fazla ses kademesi bulunan ve yeterince iyi izolasyona sahip araçlar için sesi kısmak yerine arabanın farklı alanlarına yönlendirmesini sağlar. Örneğin, gezinme müzik devam ederken talimatlar sürücünün baş desteği hoparlörlerine yönlendirilebilir kabinde normal ses seviyesinde oynatıyoruz.

Güvenlikle ilgili önemli sesler

Android 11 kullanıma sunulduktan sonra HAL ses odağı API'leri kritik önem taşıyan güvenlik seslerine öncelik verilmesini sağlamak için hâlâ HAL’ye bağlıdır. diğerleri. HAL, USAGE_EMERGENCY için ses odağını korusa bile Android'deki uygulama ve hizmetlerin ses çalmayacağını garanti ederiz. Bu, HAL’ye bağlıdır Güvenlik açısından kritik sesler nedeniyle Android'den gelen akışların karıştırılması veya sesinin kapatılması oynandı.

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

AAOS, ses düzeyi ayarları kullanıcı arayüzünü ses düzeyi grubu yapılandırmasından ayırır (ayrıca: (Birim gruplarını yapılandırma bölümünde açıklandığı gibi) yer paylaşımlı olarak ekleyin. Bu ayırma, bir engelin Gelecekte birim gruplarının yapılandırması değişirse değişiklik yapılması gerekir.

Araba Ayarları kullanıcı arayüzünde packages/apps/Car/Settings/res/xml/car_volume_items.xml dosyası, tanımlı her bir öğeyle ilişkili kullanıcı arayüzü öğeleri (başlık ve simge kaynakları) içerir AudioAttributes.USAGE. Bu dosya, dosyanın makul bir şekilde oluşturulmasını ilkiyle ilişkilendirilen kaynakları kullanarak tanımlanan VolumeGroups her VolumeGroup'ta yer alan tanınan kullanımları kabul eder.

Örneğin, aşağıdaki örnekte bir VolumeGroup hem voice_communication ve voice_communication_signalling. Varsayılan araba ayarları kullanıcı arayüzünün uygulanması, ilişkili kaynakları kullanarak VolumeGroup'u oluşturur Dosyadaki ilk öğe olduğu için voice_communication.

<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 şurada açıklanmıştır: packages/apps/Car/Settings/res/values/attrs.xml Ses düzeyi ayarları Kullanıcı arayüzü, aşağıdaki VolumeGroup tabanlı CarAudioManager API'lerini kullanır:

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