Ses Yönlendirme

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 ve occupantZoneId numaraları tekrarlanamaz
  • audioZoneId ve occupantZoneId 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);