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
kelompok volume dengan perangkat yang terkait, dan setiap perangkat memiliki konteks yang
harus dirutekan dalam zona tersebut. Semua konteks harus diwakili
dalam setiap zona.
Mengonfigurasi pemilihan rute audio
File kebijakan audio, yang biasanya
berada di partisi vendor, mewakili
konfigurasi perangkat keras
audio pada board. Semua perangkat yang dirujuk di
car_audio_configuration.xml
harus ditentukan dalam
audio_policy_configuration.xml
.
Mengaktifkan pemilihan rute AAOS
Untuk menggunakan perutean berbasis AAOS, Anda harus menyetel
audioUseDynamicRouting
flag untuk true
:
<resources> <bool name="audioUseDynamicRouting">true</bool> </resources>
Ketika 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 ada
menjadi satu zona utama, yang ditunjukkan dalam konfigurasi oleh atribut
isPrimary="true"
.
Contoh konfigurasi
Sebagai contoh, kendaraan dapat memiliki dua zona — zona utama dan kursi belakang
hiburan. Dengan demikian, kemungkinan car_audio_configuration.xml
akan didefinisikan 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 untuk menerapkan efek pascapemrosesan dan pencampuran yang berbeda pada tiap {i>output<i} perangkat
menggunakan hardware kendaraan. Perangkat ini telah diatur ke dalam empat kelompok volume:
media, navigasi, panggilan, dan alarm. Jika sistem dikonfigurasi untuk
useFixedVolume
, maka level volume untuk setiap grup akan diteruskan
ke HAL untuk diterapkan
pada {i>output<i} perangkat ini.
Untuk zona sekunder, output yang diharapkan adalah melalui satu perangkat output. Dalam contoh ini, semua penggunaan dialihkan ke satu perangkat dan grup volume untuk membuat semuanya sederhana.
Konfigurasi audio zona penumpang
Di Android 11, car_audio_configuration.xml
diperluas lebih lanjut menjadi
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 berbasis ID pengguna
{i>routing<i}.
Untuk menggunakan kolom baru ini, V2 dari car_audio_configuration.xml
adalah
tidak diperlukan. Meninjau kembali konfigurasi audio di atas tetapi memanfaatkan
bidang baru untuk
pemetaan ID zona penumpang dan ID zona audio, konfigurasi baru tanpa volume
definisi grup dapat diatur 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 utama ke zona penghuni 0, dan
audioZoneId
1 dengan occupantZoneId
1. Secara umum, pemetaan
antara zona penumpang dan zona audio dapat
dikonfigurasi, tetapi pemetaannya harus satu per satu.
Berikut adalah aturan yang menentukan kedua kolom baru tersebut:
audioZoneId
untuk zona utama selalu nol- Nomor
audioZoneId
danoccupantZoneId
tidak dapat diulang audioZoneId
danoccupantZoneId
hanya dapat memiliki pemetaan one-to-one
Memilih rute melalui UID aplikasi
Serangkaian API tersembunyi diperkenalkan ke CarAudioManager
dalam 10 untuk memungkinkan aplikasi
untuk mengkueri dan mengatur zona audio dan fokus.
int[] getAudioZoneIds(); int getZoneIdForUid(int uid); boolean setZoneIdForUid(int zoneId, int uid); boolean clearZoneIdForUid(int uid);
API di atas memungkinkan aplikasi pihak pertama mengelola perutean audio
berdasarkan UID aplikasi. Dengan demikian, ID zona audio dan UID aplikasi
juga dibutuhkan. Dengan informasi tersebut, {i>routing<i} audio dapat diatur dengan menggunakan
API CarAudioManager#setZoneIdForUid
.
Mengubah zona untuk aplikasi
Secara default, semua rute audio ke zona utama. Untuk memperbarui aplikasi menjadi
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"); }
T Catatan: Streaming dan fokus tidak dapat beralih zona secara dinamis. Oleh karena itu, pemutaran harus dihentikan dan fokus diminta ulang untuk mengubah zona.
Memilih Rute dengan ID Pengguna
Meskipun perutean berbasis UID aplikasi memungkinkan kontrol yang baik atas setiap
perutean audio, hal itu juga mengharuskan {i>routing<i} audio untuk setiap aplikasi ditentukan sebelumnya
ke aplikasi yang benar-benar meminta fokus audio dan memutar audio. Untuk memitigasi hal ini
dan lebih memfasilitasi aplikasi pihak ketiga
untuk memutar audio tanpa modifikasi,
CarAudioService
menggunakan zona penumpang mobil dan pemetaan zona audio untuk menentukan
{i>routing<i} berbasis ID pengguna. Dengan cara ini, saat pengguna
masuk ke zona penumpang,
layanan akan diberi tahu. Dengan sinyal ini, pengelolaan fokus audio dan perutean secara otomatis
dikonfigurasi untuk semua zona audio.
Perutean berbasis UID aplikasi tetap dapat digunakan tetapi harus dilakukan secara independen dari
pemilihan rute ID pengguna. Artinya, jika pemetaan zona penumpang
ke zona audio mobil
ditetapkan, maka perutean berbasis UID akan
dinonaktifkan dan mencoba memanggil
CarAudioManager#setZoneidForUid
akan menampilkan error.
Meskipun perutean audio dan pengelolaan fokus telah disederhanakan dengan zona penumpang
khusus, pengguna tetap harus ditetapkan ke zona penghuni. Hal ini dapat dilakukan dengan
menggunakan CarOccupantZoneManager#assignProfileUserToOccupantZone
. Ini
API memerlukan izin untuk mengelola pengguna. Saat ini, yang diharapkan adalah OEM mengelola
pengguna ke penetapan zona penduduk
melalui beberapa jenis UI sistem. Setelah selesai
peluncuran, perutean audio, pengelolaan fokus, semuanya akan dikonfigurasi secara otomatis untuk pengguna.
Merutekan dengan setPreferredDevice
Seiring dengan perubahan di atas, Android 11 juga memiliki API baru untuk mengkueri perangkat output yang dikaitkan dengan setiap zona, CarAudioManager#getOutputDeviceForUsage(int zoneId, int usage).
API ini dapat digunakan untuk membuat kueri perangkat output untuk zona dan atribut audio tertentu
tingkat penggunaan. Dengan cara ini, aplikasi pihak pertama dapat merutekan audio ke zona berbeda dengan
menggunakan setPreferredDevice
API pemain. Tujuan
getOutputDeviceForUsage
API memerlukan
PERMISSION_CAR_CONTROL_AUDIO_SETTINGS
dan merupakan API sistem. Berikut adalah
contoh pencarian perangkat media untuk zona tertentu dan pemilihan rute ke perangkat tersebut
menggunakan setPreferredDevice
API.
audioZoneId = ... ; mediaDeviceInfo = mCarAudioManager .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA); … mPlayer.setPreferredDevice(mediaDeviceInfo);