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 değerine ayarlandığında) uygulamalar, yazılım karıştırıcıda ses seviyesini akış türüne göre değiştirmek için AudioManager.setStreamVolume() işlevini ç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="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>

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 ses grubunun kazancını desteklenen aralığın dışında ayarlamak mümkündür. 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, kitap 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.

Ses seviyesi 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ığı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ğru
    • -1,0 tamamen solda
    • -1 ile 1 arasındaki aralığın dışındaki değerler hata olarak değerlendirilir.
  • setFadeTowardFront(float value), hoparlör ses seviyesini 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 akıştaki kazancı azalttığında gerçekleşir. AAOS'te ses kısma özelliği HAL tarafından uygulanır. Android, işletim sistemi 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ğilmelisiniz?

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 sesin kısılmasını bekleyin. Bu sayede, navigasyondan veya bir yardımcı uygulamadan sonraki oynatma işlemine başlamadan önce ses kısı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 üste bindirilebilir. 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 için makul bir oluşturma 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 seviyesi güncelleme ve sessize alma düğmesinin otomotiv kullanım alanları, ses seviyesi 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, 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ünü içerir:

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

CarVolumeGroupInfo

Etkinlik geri çağırmasının alıcısı, etkilenen araç ses grubu bilgilerinin listesine kolayca erişebilir. 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 işini kolaylaştırmak 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 bunu 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ği hakkında ek bilgi 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 soluklaştırmayı 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ğırması 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, aynı etkinlik için aynı uygulamaya yinelenen tetikleyicilerin gönderilmesini önler.

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 düzeyi 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 durumu: 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 sesini açma istekleri yalnızca etkin kısıtlama yoksa kabul edilir.

    • 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 kapatma özelliği devre dışıyken HAL sessize alma özelliğini 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ırmayı (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) 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 kalıcı 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 olarak 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):

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

    • Tedarikçi firma AudioControl HAL, güvenli dizin için geri çağırma işlevini de 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 ettikten sonra bu dizin, AudioControl HAL uygulayıcısı tarafından 30 değerinde güvenli bir ses düzeyine 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 planı 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 temelli 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 çağrısı gönderir.

    • CarVolumeGroupEvent, güncellenmiş CarVolumeGroupInfo, Etkinlik-türü (ne değişti) ve Ek-bilgi (neden değişti) bilgilerini içerir.

resim

Şekil 1. 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 ayarlar.
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 birim yapılandırmasının ardışık düzen şeması aşağıda gösterilmiştir.

resim

Şekil 2. 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 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, ses HAL politikasında bir ses seviyesi aralığı tanımı süper kümesi 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.