Ses Yönlendirme

Android 10'da car_audio_configuration.xml , car_volumes_groups.xml ve IAudioControl.getBusForContext yerini alır. Yeni konfigürasyon dosyasında bölgelerin bir listesi tanımlanır. Her bölgenin, ilişkili cihazlarıyla birlikte bir veya daha fazla birim grubu vardır ve her cihazın, o bölge içinde yönlendirilmesi gereken bağlamları vardır. Her bir bölgede tüm bağlamların temsil edilmesi gerekir.

Ses yönlendirmesini yapılandırma

Genellikle satıcı bölümünde bulunan ses politikası dosyaları, anakartın ses donanımı yapılandırmasını temsil eder. car_audio_configuration.xml dosyasında referans verilen tüm cihazlar audio_policy_configuration.xml dosyasında tanımlanmalıdır.

AAOS yönlendirmeyi etkinleştirme

AAOS tabanlı yönlendirmeyi kullanmak için audioUseDynamicRouting bayrağını true olarak ayarlamanız gerekir:

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

false olduğunda, yönlendirme ve CarAudioService büyük bir kısmı devre dışı bırakılacak ve işletim sistemi, AudioService varsayılan davranışına geri dönecektir.

Birincil bölge

Varsayılan olarak tüm ses birincil bölgeye yönlendirilecektir. Yapılandırmada isPrimary="true" özniteliğiyle gösterilen yalnızca bir birincil bölge olabilir.

Örnek konfigürasyon

Örnek olarak, bir aracın iki bölgesi olabilir: birincil bölge ve arka koltuk eğlence sistemi. Bununla olası bir car_audio_configuration.xml şu şekilde tanımlanacaktı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 bölge, bağlamları farklı cihazlara ayırmıştır. Bu, HAL'in aracın donanımını kullanarak her cihaz çıkışına farklı işlem sonrası efektler ve miksaj uygulayabilmesini sağlar. Cihazlar dört ses düzeyi grubuna ayrılmıştır: medya, navigasyon, çağrılar ve alarmlar. Sistem useFixedVolume şekilde yapılandırılmışsa, her grubun ses düzeyi bu aygıtların çıkışına uygulanmak üzere HAL'ye aktarılacaktır.

İkincil bölge için beklenen çıkış, tek bir çıkış cihazı aracılığıyla sağlanır. Bu örnekte, işleri basitleştirmek için tüm kullanımlar tek cihaza ve birim grubuna yönlendirilmiştir.

Yolcu bölgesi ses yapılandırması

Android 11'de car_audio_configuration.xml , audioZoneId ve occupantZoneId olmak üzere iki yeni alanı tanıtacak şekilde daha da genişletildi. Birincisi, audioZoneId bölge yönetimini daha iyi kontrol etmek için kullanılabilir. Öte yandan, occupantZoneId , kullanıcı kimliği tabanlı yönlendirmeyi yapılandırmak için kullanılabilir.

Bu yeni alanları kullanmak için car_audio_configuration.xml dosyasının V2'si gereklidir. Yukarıdaki ses yapılandırmasını yeniden gözden geçirerek ancak kullanıcı bölgesi kimliği ve ses bölgesi kimliği eşlemesi için yeni alanı kullanarak, ses grubu tanımları olmayan yeni yapılandırma ş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 konfigürasyon, birincil bölgeden kullanıcı bölgesi 0'a ve audioZoneId 1'den occupantZoneId 1'e bir eşleme tanımlar. Genel olarak, kullanıcı bölgesi ile ses bölgesi arasındaki herhangi bir eşleme yapılandırılabilir ancak eşlemenin bire bir olması gerekir. İki yeni alanı tanımlayan kurallar şunlardır:

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

Bir uygulama UID'si aracılığıyla yönlendirme

Uygulamaların ses bölgelerini sorgulamasına ve ayarlamasına ve odaklanmasına izin vermek için 10 yılında CarAudioManager bir dizi gizli API tanıtıldı.

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

Yukarıdaki API'ler, birinci taraf bir uygulamanın, bir uygulamanın UID'sine dayalı olarak ses yönlendirmesini yönetmesine izin verdi. Bu nedenle hem ses bölgesi kimliğine hem de uygulamanın UID'sine de ihtiyaç vardır. Eldeki bu bilgilerle, ses yönlendirme CarAudioManager#setZoneIdForUid API kullanılarak ayarlanabilir.

Bir uygulamanın bölgelerini değiştirme

Varsayılan olarak tüm ses birincil bölgeye yönlendirilir. Bir uygulamayı farklı bir bölgeye yönlendirilecek şekilde güncellemek için CarAudioManager#setZoneIdForUid 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");
}

N Not: Akışlar ve odak, bölgeleri dinamik olarak değiştiremez. Bu nedenle, oynatma durdurulmalı ve bölgeleri değiştirmek için yeniden odaklanma istenmelidir.

Kullanıcı Kimliğiyle Yönlendirme

Bir uygulamanın UID tabanlı yönlendirmesi, her uygulamanın ses yönlendirmesinin hassas kontrolüne izin verirken, aynı zamanda her uygulama için ses yönlendirmesinin, uygulamanın gerçekten ses odağı talep etmesinden ve ses çalmasından önce tanımlanmasını gerektirir. Bu sorunu azaltmak ve üçüncü taraf uygulamaların değişiklik yapmadan ses çalmasını daha da kolaylaştırmak için CarAudioService kullanıcı kimliğine dayalı yönlendirmeyi tanımlamak için araç yolcu bölgesini ve ses bölgesi haritalamasını kullanır. Bu şekilde bir kullanıcı yolcu bölgesine giriş yaptığında araç ses hizmetine bilgi verilir. Bu sinyalle, ses odak yönetimi ve yönlendirme tüm ses bölgeleri için otomatik olarak yapılandırılır.

Uygulamalar UID tabanlı yönlendirme hala kullanılabilir ancak kullanıcı kimliği yönlendirmesinden bağımsız olarak yapılmalıdır. Bu, eğer yolcu bölgesi ile araba ses bölgesi eşlemesi tanımlanmışsa, UID tabanlı yönlendirmenin devre dışı bırakılacağı ve CarAudioManager#setZoneidForUid çağrılmaya çalışılmasının bir hata oluşturacağı anlamına gelir.

Kullanıcı bölgesi yönetimi ile ses yönlendirme ve odak yönetimi basitleştirilmiş olsa da kullanıcının yine de bir kullanıcı bölgesine atanması gerekmektedir. Bu, CarOccupantZoneManager#assignProfileUserToOccupantZone kullanılarak yapılabilir. Bu API, kullanıcıları yönetmek için izin gerektirir. Mevcut beklenti, OEM'lerin bir tür sistem kullanıcı arayüzü aracılığıyla kullanıcıdan bina sakinine bölge atamasını yönetmesidir. Bu işlem tamamlandıktan sonra uygulama başlatma, ses yönlendirme, odak yönetimi kullanıcı için otomatik olarak yapılandırılacaktır.

setPreferredDevice ile yönlendirme

Yukarıdaki değişikliklerin yanı sıra, Android 11 ayrıca her bölgeyle ilişkili çıkış cihazlarını sorgulamak için yeni bir API'ye sahiptir: CarAudioManager#getOutputDeviceForUsage(int ZoneId, int use).

API, belirli bir bölge ve ses özelliği kullanımı için bir çıkış cihazını sorgulamak için kullanılabilir. Bu şekilde birinci taraf uygulamalar, oynatıcının setPreferredDevice API'sini kullanarak sesi farklı bölgelere yönlendirebilir. getOutputDeviceForUsage API'si PERMISSION_CAR_CONTROL_AUDIO_SETTINGS gerektirir ve bir sistem API'sidir. Aşağıda belirli bir bölge için medya cihazını bulma ve setPreferredDevice API'sini kullanarak bu cihaza yönlendirme örneği verilmiştir.

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