Ses Yönlendirme

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

Ses yönlendirmeyi yapılandırma

Genellikle satıcı bölümünde yaşayan ses ilkesi dosyaları, kartın ses donanımı yapılandırmasını temsil eder. audio_policy_configuration.xml içinde başvurulan tüm cihazlar car_audio_configuration.xml içinde tanımlanmalıdır.

AAOS yönlendirmesini 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 devre dışı bırakılır ve işletim sistemi AudioService varsayılan davranışına geri döner.

Birincil bölge

Varsayılan olarak, tüm ses birincil bölgeye yönlendirilecektir. Yapılandırmada isPrimary="true" özniteliği tarafından belirtilen yalnızca bir birincil bölge olabilir.

Örnek yapılandırma

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

İkincil bölge için beklenen çıktı, tek bir çıktı aygıtı aracılığıyladır. Bu örnekte, işleri basit tutmak için tüm kullanımlar tek bir cihaza ve birim grubuna yönlendirilir.

Yolcu bölgesi ses yapılandırması

Android 11'de car_audio_configuraton.xml , audioZoneId ve occupantZoneId olmak üzere iki yeni alan sunmak için 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 gereklidir. Yukarıdaki ses yapılandırmasını yeniden ziyaret ederek, ancak yolcu bölgesi kimliği ve ses bölgesi kimliği eşlemesi için yeni alandan yararlanarak, 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 yapılandırma, birincil bölge için yolcu bölgesi 0'a ve audioZoneId 1 ile occupantZoneId 1 için bir eşleme tanımlar. Genel olarak, yolcu bölgesi ve ses bölgesi arasındaki herhangi bir eşleme yapılandırılabilir, ancak eşleme bire bir olmalıdır. İki yeni alanı tanımlayan kurallar şunlardır:

  • Birincil bölge için 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 CarAudioManager bir dizi gizli API sunuldu.

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ği hem de uygulamanın UID'si gereklidir. Eldeki bu bilgilerle, ses yönlendirmesi CarAudioManager#setZoneIdForUid API kullanılarak ayarlanabilir.

Bir uygulama için bölgeleri 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 odak talep edilmelidir.

Kullanıcı Kimliği ile Yönlendirme

Bir uygulamanın UID tabanlı yönlendirmesi, her uygulamanın ses yönlendirmesinin ince kontrolüne izin verirken, aynı zamanda, her uygulama için ses yönlendirmesinin, uygulama gerçekten ses odaklama ve ses çalma talep etmeden önce tanımlanmasını gerektirir. Bu sorunu azaltmak ve üçüncü taraf uygulamalarının değişiklik yapmadan ses çalmasını daha da kolaylaştırmak için CarAudioService , kullanıcı kimliği tabanlı yönlendirmeyi tanımlamak için araçta oturan bölge ve ses bölgesi eşlemesini kullanır. Bu şekilde, bir kullanıcı yolcu bölgesine giriş yaptığında araç ses servisine 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, yolcu bölgesinden araç ses bölgesine eşleme tanımlıysa, UID tabanlı yönlendirmenin devre dışı bırakılacağı ve CarAudioManager#setZoneidForUid aramaya çalışmanın bir hata vereceği anlamına gelir.

Ses yönlendirme ve odak yönetimi, yolcu bölgesi yönetimi ile basitleştirilmiş olsa da, kullanıcının yine de bir yolcu bölgesine atanması gerekir. Bu, CarOccupantZoneManager#assignProfileUserToOccupantZone kullanılarak yapılabilir. Bu API, kullanıcıları yönetmek için izin gerektirir. Şu anki beklenti, OEM'lerin bir tür sistem kullanıcı arabirimi aracılığıyla kullanıcıdan kullanıcıya 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 çıktı cihazlarını sorgulamak için yeni bir API'ye sahiptir, CarAudioManager#getOutputDeviceForUsage(int zoneId, int use).

API, belirli bir bölge ve bir ses özniteliğ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, 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);