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
danoccupantZoneId
tidak boleh berulang audioZoneId
danoccupantZoneId
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);