Android 10'da car_audio_configuration.xml
, car_volumes_groups.xml
ve IAudioControl.getBusForContext
yerine geçer.
Yeni yapılandırma dosyasında bölgelerin listesi tanımlanır. Her bölgede, ilişkili cihazlarıyla birlikte bir veya daha fazla ses grubu bulunur ve her cihazda, ilgili bölgede yönlendirilmesi gereken bağlamlar bulunur. Tüm bağlamların her alt bölgede temsil edilmesi gerekir.
Ses yönlendirmeyi yapılandırma
Genellikle tedarikçi bölümünde bulunan ses politikası dosyaları, kartın ses donanım yapılandırmasını temsil eder. car_audio_configuration.xml
içinde referans verilen tüm cihazlar audio_policy_configuration.xml
içinde tanımlanmalıdır.
AAOS yönlendirmesini etkinleştirme
AAOS tabanlı yönlendirmeyi kullanmak için audioUseDynamicRouting
işaretini true
olarak ayarlamanız gerekir:
<resources> <bool name="audioUseDynamicRouting">true</bool> </resources>
false
olduğunda yönlendirme ve CarAudioService
'un büyük bir kısmı devre dışı bırakılır ve işletim sistemi AudioService
'nin varsayılan davranışına geri döner.
Birincil alt bölge
Varsayılan olarak tüm sesler birincil bölgeye yönlendirilir. Yalnızca bir birincil bölge olabilir. Bu bölge, yapılandırmada isPrimary="true"
özelliğiyle belirtilir.
Örnek yapılandırma
Örneğin, bir araçta birincil bölge ve arka koltuk eğlence sistemi olmak üzere iki bölge olabilir. Bu durumda, 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ırdı. Bu sayede HAL, aracın donanımını kullanarak her cihaz çıkışına farklı son işlem efektleri ve miks uygulayabilir. Cihazlar dört ses grubuna ayrılmıştır: medya, navigasyon, aramalar ve alarmlar. Sistem useFixedVolume
olarak yapılandırılmışsa her grubun ses seviyeleri, bu cihazların çıkışına uygulanması için HAL'e iletilir.
İkincil bölge için beklenen çıkış, tek bir çıkış cihazı üzerindendir. Bu örnekte, basitlik sağlamak için tüm kullanımlar tek bir cihaza ve ses grubuna yönlendirilmiştir.
Kullanıcı bölgesi ses yapılandırması
Android 11'de car_audio_configuration.xml
, audioZoneId
ve occupantZoneId
adlı iki yeni alan tanıtmak için daha da genişletildi.
Bunlardan ilki olan audioZoneId
, bölge yönetimini daha iyi kontrol etmek için kullanılabilir.
Öte yandan occupantZoneId
, kullanıcı kimliğine dayalı yönlendirmeyi yapılandırmak için kullanılabilir.
Bu yeni alanları kullanmak için car_audio_configuration.xml
'ün 2. sürümü gereklidir. Yukarıdaki ses yapılandırmasını tekrar ziyaret ederek, kullanıcı bölgesi kimliği ve ses bölgesi kimliği eşleme için yeni alanı kullanırsak 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 ile kullanıcı bölgesi 0 ve audioZoneId
1 ile occupantZoneId
1 için bir eşleme tanımlar. Genel olarak, kullanıcı bölgesi ile ses bölgesi arasında 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ı tekrarlanamazaudioZoneId
veoccupantZoneId
arasında yalnızca bire bir eşleme olabilir
Uygulama UID'si üzerinden yönlendirme
Uygulamaların ses bölgelerini ve odağını sorgulamasına ve ayarlamasına olanak tanımak için 10'da CarAudioManager
'e bir dizi gizli API eklendi.
int[] getAudioZoneIds(); int getZoneIdForUid(int uid); boolean setZoneIdForUid(int zoneId, int uid); boolean clearZoneIdForUid(int uid);
Yukarıdaki API'ler, birinci taraf uygulamaların ses yönlendirmesini uygulamanın UID'sine göre yönetmesine olanak tanır. Bu nedenle, hem ses bölgesi kimliği hem de uygulamanın UID'si de gereklidir. Bu bilgilerle, CarAudioManager#setZoneIdForUid
API'si kullanılarak ses yönlendirme ayarlanabilir.
Uygulamanın bölgelerini değiştirme
Varsayılan olarak tüm sesler birincil bölgeye yönlendirilir. Bir uygulamayı farklı bir bölgeye yönlendirilecek şekilde güncellemek için 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"); }
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 odaklanma yeniden istenmelidir.
User-ID ile yönlendirme
Bir uygulamanın UID tabanlı yönlendirmesi, her uygulamanın ses yönlendirmesini hassas bir şekilde kontrol etmenize olanak tanır. Ancak bu, her uygulamanın ses yönlendirmesinin, ses odağını isteyen ve ses çalan uygulamadan önce tanımlanmasını da gerektirir. Bu sorunu hafifletmek ve üçüncü taraf uygulamalarının sesleri değişiklik yapmadan çalmasını kolaylaştırmak için CarAudioService
, kullanıcı kimliğine dayalı yönlendirmeyi tanımlamak amacıyla araçtaki kullanıcı bölgesi ve ses bölgesi eşlemesini kullanır. Bu sayede, kullanıcı yolcu bölgesine giriş yaptığında araç ses hizmeti bilgilendirilir. Bu sinyal sayesinde ses odak yönetimi ve yönlendirme, tüm ses bölgeleri için otomatik olarak yapılandırılır.
Uygulamalar için UID tabanlı yönlendirme kullanılmaya devam edebilir ancak kullanıcı kimliği yönlendirmesinden bağımsız olarak yapılmalıdır. Bu, kullanıcı bölgesi ile araç ses bölgesi eşlemesi tanımlanmışsa UID tabanlı yönlendirmenin devre dışı bırakıldığı ve CarAudioManager#setZoneidForUid
çağrısı yapılmaya çalışıldığında hata oluştuğu anlamına gelir.
Ses yönlendirme ve odak yönetimi, yolcu bölgesi yönetimiyle basitleştirilmiş olsa da kullanıcının bir yolcu bölgesine atanması gerekir. Bu işlem CarOccupantZoneManager#assignProfileUserToOccupantZone
kullanılarak yapılabilir. Bu API, kullanıcıları yönetme izni gerektirir. Şu anda OEM'lerin kullanıcıyı yolcu bölgesine atamayı bir tür sistem kullanıcı arayüzü üzerinden yönetmesi beklenmektedir. Bu işlem tamamlandıktan sonra uygulama başlatma, ses yönlendirme ve odak yönetimi, kullanıcı için otomatik olarak yapılandırılır.
setPreferredDevice ile yönlendirme
Android 11, yukarıdaki değişikliklerin yanı sıra her bölgeyle ilişkili çıkış cihazlarını sorgulamak için CarAudioManager#getOutputDeviceForUsage(int zoneId, int usage) adlı yeni bir API'ye de sahiptir.
API, belirli bir bölge ve ses özelliği kullanımı için bir çıkış cihazını sorgulamak amacıyla kullanılabilir. Bu sayede 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ölgenin medya cihazını bulma ve setPreferredDevice
API'yi kullanarak bu cihaza yönlendirme örneği verilmiştir.
audioZoneId = ... ; mediaDeviceInfo = mCarAudioManager .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA); … mPlayer.setPreferredDevice(mediaDeviceInfo);