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
veoccupantZoneId
numaraları tekrarlanamaz -
audioZoneId
veoccupantZoneId
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);