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
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 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);