Ses Yönlendirme

Android 10'da car_audio_configuration.xml, Android 10'un yerini alır car_volumes_groups.xml ve IAudioControl.getBusForContext. Yeni yapılandırma dosyasında, alt bölgelerin listesi tanımlanır. Her alt bölgede bir veya daha fazla bölge vardır ses seviyesi gruplarına ayırabilir ve her cihazın o bölge içinde yönlendirilmelidir. Tüm bağlamların emin olmanız gerekir.

Ses yönlendirmeyi yapılandırma

Genellikle tedarikçi firma bölümünde bulunan ses politikası dosyaları, kartın ses donanımı yapılandırmasını gözden geçirin. Şurada referans verilen tüm cihazlar: car_audio_configuration.xml, audio_policy_configuration.xml.

AAOS yönlendirmesini etkinleştirme

AAOS tabanlı yönlendirmeyi kullanmak için true öğesine audioUseDynamicRouting işareti:

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

false itibarıyla yönlendirme ve CarAudioService yapılandırmanın büyük bir kısmı devre dışı bırakılacak ve işletim sistemi varsayılan AudioService davranışına geri döner.

Birincil alt bölge

Varsayılan olarak tüm sesler birincil alt bölgeye yönlendirilir. Yalnızca benzersiz bir birincil alt bölge olmalıdır; bu alt bölge, yapılandırmada isPrimary="true"

Örnek yapılandırma

Örneğin, bir aracın birincil bölge ve arka koltuk olmak üzere iki bölgesi olabilir. eğlence sistemidir. Böylece, olası bir car_audio_configuration.xml şu şekilde tanımlanır:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

Burada birincil alt bölge, bağlamları farklı cihazlara ayırmıştır. Bu durumda, farklı post işleme efektleri uygulamak ve her cihaz çıkışına karıştırmak için HAL cihazın donanımını kontrol edin. Cihazlar dört ses düzeyi grubuna göre düzenlenmiştir: medya, navigasyon, aramalar ve alarmlar. Sistem, useFixedVolume, ardından her grubun ses düzeyleri aktarılacak bu cihazların çıkışlarına uygulamak üzere HAL'ye ekleyin.

İkincil alt bölgede, beklenen çıkış tek bir çıkış cihazı üzerinden yapılır. Bu örnekte, tüm kullanımlar tek bir cihaza ve ses düzeyi grubuna yönlendirilir. basitliklerini gösteriyor.

yolcu bölgesi ses yapılandırması

Android 11'de car_audio_configuration.xml, audioZoneId ve occupantZoneId olmak üzere iki yeni alanı tanıtıyoruz. İlki olan audioZoneId, alt bölge yönetimini daha iyi kontrol etmek için kullanılabilir. Diğer yandan occupantZoneId, User-ID'ye dayalı yapılandırmalar için kullanılabilir. yönlendirme.

Bu yeni alanları kullanmak için car_audio_configuration.xml'nin V2'si gereklidir. Yukarıdaki ses yapılandırması yeniden gözden geçiriliyor, ancak yolcu bölgesi kimliği ve ses bölgesi kimliği eşlemesi, ses düzeyi olmayan yeni yapılandırma Grup tanımları şu şekilde ayarlanabilir:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

Yukarıdaki yapılandırma, birincil bölge 0'daki yolcu bölgesiyle eşlemeyi tanımlar. audioZoneId 1-occupantZoneId 1. Genellikle, tüm eşleme yolcu bölgesi ile ses bölgesi arasındaki eşleme yapılandırılabilir. Ancak eşleme bire bir olmalıdır. Bu iki yeni alanı tanımlayan kurallar şunlardır:

  • Birincil alt bölgenin audioZoneId değeri her zaman sıfırdır
  • audioZoneId ve occupantZoneId numaraları tekrarlanamaz
  • audioZoneId ve occupantZoneId yalnızca bire bir eşlemeye sahip olabilir

Uygulama UID'si üzerinden yönlendirme

Uygulamaların izin verebilmesi için bir dizi gizli API, 10 API'de CarAudioManager kullanıma sunuldu ses bölgelerini ve odağı sorgulamak ve ayarlamak için kullanılır.

int[] getAudioZoneIds();
int getZoneIdForUid(int uid);
boolean setZoneIdForUid(int zoneId, int uid);
boolean clearZoneIdForUid(int uid);

Yukarıdaki API'ler, birinci taraf uygulamasının, ses yönlendirmesine dayalı olarak bir kimliği kullanır. Bu nedenle, hem ses bölgesi kimliği hem de uygulamanın UID'si çok önemlidir. Bu bilgiler sağlandığında, ses yönlendirmesi CarAudioManager#setZoneIdForUid API.

Uygulama için alt bölgeleri değiştirme

Varsayılan olarak, tüm sesler birincil bölgeye yönlendirilir. Bir uygulamayı farklı bir alt bölgeye yönlendirildiyse CarAudioManager#setZoneIdForUid öğesini kullanın:

// Find zone to play
int zoneId = ...

// Find application's uid
Int uid = mContext.getPackageManager()
        .getApplicationInfo(mContext.getPackageName(), 0)
        .uid;

if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) {
    Log.d(TAG, "Zone successfully updated");
} else {
    Log.d(TAG, "Failed to change zone");
}

K Not: Akışlar ve odak, bölgeleri dinamik olarak değiştiremez. Dolayısıyla, oynatmanın durdurulması ve bölgeleri değiştirmek için yeniden odaklanılması gerekir.

User ID ile Yönlendirme

Bir uygulamanın UID tabanlı yönlendirmesi, her uygulamanın her uygulama için ses yönlendirmesinin önceden tanımlanmasını da gerektirir. ses odağı isteyen ve ses çalan uygulamaya bağlanıyor. Bu sorunun etkisini azaltmak için: üçüncü taraf uygulamalarının değişiklik yapmadan ses çalmasını daha da kolaylaştırabilir, CarAudioService, tanımlamak için araç yolcu bölgesini ve ses bölgesi eşlemesini kullanır yönlendirmesi de buna dahildir. Bu sayede, bir kullanıcı yolcu bölümüne giriş yaptığında araba sesi bilgi verilir. Bu sinyalle, ses odağı yönetimi ve yönlendirmesi otomatik olarak yapılandırıldı.

Uygulamaların UID tabanlı yönlendirmesi yine kullanılabilir ancak Kullanıcı kimliği yönlendirmesi. Yani, yolcu bölgesi ile araç ses bölgesi eşlemesi tanımlandığında, UID tabanlı yönlendirme devre dışı bırakılır ve CarAudioManager#setZoneidForUid hata verir.

Ses yönlendirme ve odak yönetimi, yolcu bölgesi ile basitleştirilmiştir yönetiminde bir yolcu bölgesine atanması gerekir. Bu işlem, (CarOccupantZoneManager#assignProfileUserToOccupantZone) kullanarak. Bu API, kullanıcıları yönetmek için izin gerektirir. Şu anki beklenti, OEM'lerin alt bölge atamasına bir tür sistem arayüzü aracılığıyla kullanıcı tarafından izin verilmesi. Bu tamamlandıktan sonra başvuru başlatma, ses yönlendirme ve odak yönetiminin tümü kullanıcı için otomatik olarak yapılandırılır.

set PreferredDevice ile yönlendirme

Yukarıdaki değişikliklerin yanı sıra Android 11'de çıkış cihazlarını sorgulamak için yeni bir API de bulunuyor. her alt bölge ile ilişkili, CarAudioManager#getExitDeviceForUsage(int zoneId, int kullanımı).

API, belirli bir alt bölge ve ses özelliğine yönelik bir çıkış cihazını sorgulamak için kullanılabilir. bazı yolları da görmüştük. Bu şekilde, birinci taraf uygulamaları sesi kullanarak veya Oynatıcının setPreferredDevice API'si kullanılıyor. İlgili içeriği oluşturmak için kullanılan getOutputDeviceForUsage API için gerekenler PERMISSION_CAR_CONTROL_AUDIO_SETTINGS ve bir sistem API'sidir. Aşağıda bir belirli bir bölge için medya cihazını bulma ve bu cihaza yönlendirme örneği (setPreferredDevice API) kullanıyor.

audioZoneId = ... ;
mediaDeviceInfo = mCarAudioManager
            .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA);
…
mPlayer.setPreferredDevice(mediaDeviceInfo);