Perutean Audio

Di Android 10, car_audio_configuration.xml menggantikan car_volumes_groups.xml dan IAudioControl.getBusForContext. Dalam file konfigurasi baru, daftar zona ditentukan. Setiap zona memiliki satu atau beberapa grup volume dengan perangkat terkait, dan setiap perangkat memiliki konteks yang harus dirutekan dalam zona tersebut. Semua konteks harus direpresentasikan dalam setiap zona.

Mengonfigurasi pemilihan rute audio

File kebijakan audio, yang biasanya berada di partisi vendor, mewakili konfigurasi hardware audio dari board. Semua perangkat yang direferensikan dalam car_audio_configuration.xml harus ditentukan dalam audio_policy_configuration.xml.

Mengaktifkan pemilihan rute AAOS

Untuk menggunakan pemilihan rute berbasis AAOS, Anda harus menetapkan flag audioUseDynamicRouting ke true:

<resources>
    <bool name="audioUseDynamicRouting">true</bool>
</resources>

Jika false, pemilihan rute dan sebagian besar CarAudioService akan dinonaktifkan dan OS akan kembali ke perilaku default AudioService.

Zona utama

Secara default, semua audio akan dirutekan ke zona utama. Hanya boleh ada satu zona utama, yang ditunjukkan dalam konfigurasi oleh atribut isPrimary="true".

Contoh konfigurasi

Misalnya, kendaraan dapat memiliki dua zona — zona utama dan sistem hiburan kursi belakang. Dengan demikian, kemungkinan car_audio_configuration.xml akan ditentukan sebagai berikut:

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

Di sini, zona utama telah memisahkan konteks ke perangkat yang berbeda. Hal ini memungkinkan HAL menerapkan efek pascapemrosesan dan pencampuran yang berbeda pada setiap output perangkat menggunakan hardware kendaraan. Perangkat telah diatur ke dalam empat grup volume: media, navigasi, panggilan, dan alarm. Jika sistem dikonfigurasi ke useFixedVolume, level volume untuk setiap grup akan diteruskan ke HAL untuk diterapkan ke output perangkat ini.

Untuk zona sekunder, output yang diharapkan adalah melalui satu perangkat output. Dalam contoh ini, semua penggunaan dirutekan ke satu perangkat dan grup volume untuk menjaga semuanya tetap sederhana.

Konfigurasi audio zona penumpang

Di Android 11, car_audio_configuration.xml diperluas lebih lanjut untuk memperkenalkan dua kolom baru, audioZoneId dan occupantZoneId. Yang pertama, audioZoneId dapat digunakan untuk mengontrol pengelolaan zona dengan lebih baik. Di sisi lain, occupantZoneId dapat digunakan untuk mengonfigurasi perutean berbasis ID pengguna.

Untuk menggunakan kolom baru ini, V2 car_audio_configuration.xml diperlukan. Dengan meninjau kembali konfigurasi audio di atas, tetapi menggunakan kolom baru untuk pemetaan ID zona penghuni dan ID zona audio, konfigurasi baru tanpa definisi grup volume dapat disiapkan sebagai:

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

Konfigurasi di atas menentukan pemetaan untuk zona primer ke zona penghuni 0, dan audioZoneId 1 ke occupantZoneId 1. Secara umum, pemetaan antara zona penumpang dan zona audio dapat dikonfigurasi, tetapi pemetaan harus satu-ke-satu. Berikut adalah aturan yang menentukan dua kolom baru:

  • audioZoneId untuk zona utama selalu nol
  • Nomor audioZoneId dan occupantZoneId tidak boleh berulang
  • audioZoneId dan occupantZoneId hanya dapat memiliki pemetaan satu ke satu

Pemilihan rute melalui UID aplikasi

Serangkaian API tersembunyi diperkenalkan ke CarAudioManager di versi 10 untuk memungkinkan aplikasi mengkueri serta menetapkan zona dan fokus audio.

int[] getAudioZoneIds();
int getZoneIdForUid(int uid);
boolean setZoneIdForUid(int zoneId, int uid);
boolean clearZoneIdForUid(int uid);

API di atas memungkinkan aplikasi pihak pertama mengelola pemilihan rute audio berdasarkan UID aplikasi. Dengan demikian, ID zona audio dan UID aplikasi juga diperlukan. Dengan informasi tersebut, pemilihan rute audio dapat ditetapkan menggunakan CarAudioManager#setZoneIdForUid API.

Mengubah zona untuk aplikasi

Secara default, semua audio dirutekan ke zona utama. Untuk memperbarui aplikasi agar dirutekan ke zona lain, gunakan CarAudioManager#setZoneIdForUid:

// 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 Catatan: Streaming dan fokus tidak dapat beralih zona secara dinamis. Oleh karena itu, pemutaran harus dihentikan dan fokus diminta ulang untuk mengubah zona.

Pemilihan rute dengan User-ID

Meskipun perutean berbasis UID aplikasi memungkinkan kontrol yang tepat terhadap setiap perutean audio aplikasi, perutean audio untuk setiap aplikasi juga harus ditentukan sebelum aplikasi benar-benar meminta fokus audio dan memutar audio. Untuk mengurangi masalah ini dan lebih memfasilitasi aplikasi pihak ketiga untuk memutar audio tanpa modifikasi, CarAudioService menggunakan pemetaan zona penumpang mobil dan zona audio untuk menentukan rute berbasis ID pengguna. Dengan cara ini, saat pengguna login ke zona penumpang, layanan audio mobil akan diberi tahu. Dengan sinyal ini, pengelolaan fokus audio dan pemilihan rute akan otomatis dikonfigurasi untuk semua zona audio.

Pemilihan rute berbasis UID aplikasi masih dapat digunakan, tetapi harus dilakukan secara terpisah dari pemilihan rute ID pengguna. Artinya, jika pemetaan zona penumpang ke zona audio mobil ditentukan, pemilihan rute berbasis UID akan dinonaktifkan dan upaya untuk memanggil CarAudioManager#setZoneidForUid akan menampilkan error.

Meskipun pemilihan rute audio dan pengelolaan fokus telah disederhanakan dengan pengelolaan zona penumpang, pengguna masih harus ditetapkan ke zona penumpang. Hal ini dapat dilakukan dengan menggunakan CarOccupantZoneManager#assignProfileUserToOccupantZone. API ini memerlukan izin untuk mengelola pengguna. Harapan saat ini adalah OEM mengelola penetapan zona pengguna ke penumpang melalui semacam UI sistem. Setelah itu, peluncuran aplikasi, pemilihan rute audio, dan pengelolaan fokus akan otomatis dikonfigurasi untuk pengguna.

Pemilihan rute dengan setPreferredDevice

Bersama dengan perubahan di atas, Android 11 juga memiliki API baru untuk mengkueri perangkat output yang terkait dengan setiap zona, CarAudioManager#getOutputDeviceForUsage(int zoneId, int usage).

API ini dapat digunakan untuk membuat kueri perangkat output untuk zona tertentu dan penggunaan atribut audio. Dengan cara ini, aplikasi pihak pertama dapat merutekan audio ke zona yang berbeda dengan menggunakan setPreferredDevice API pemutar. getOutputDeviceForUsage API memerlukan PERMISSION_CAR_CONTROL_AUDIO_SETTINGS dan merupakan API sistem. Berikut adalah contoh menemukan perangkat media untuk zona tertentu dan merutekan ke perangkat tersebut menggunakan setPreferredDevice API.

audioZoneId = ... ;
mediaDeviceInfo = mCarAudioManager
            .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA);
…
mPlayer.setPreferredDevice(mediaDeviceInfo);