AAOS memiliki pengelolaan volumenya sendiri di CarAudioService
. Model ini menggunakan konfigurasi
volume dengan ekspektasi bahwa volume harus diterapkan di bawah HAL oleh hardware
{i>amplifier<i} daripada perangkat lunak. Fitur ini juga mengatur perangkat output ke dalam grup volume
menerapkan penguatan yang sama ke semua
perangkat yang terkait dengan grup volume.
Menggunakan volume tetap
Implementasi AAOS harus mengontrol volume menggunakan amplifier hardware, bukan
mixer software. Untuk menghindari efek samping, tetapkan tanda config_useFixedVolume
ke true (overlay jika diperlukan):
<resources> <!-- Car uses hardware amplifier for volume. --> <bool name="config_useFixedVolume">true</bool> </resources>
Jika tanda config_useFixedVolume
tidak ditetapkan (atau ditetapkan ke salah),
aplikasi dapat memanggil AudioManager.setStreamVolume()
dan mengubah
volume berdasarkan jenis aliran di mixer software. Hal ini mungkin tidak
diinginkan karena
efek potensial pada aplikasi lain dan fakta bahwa
pelemahan volume pada
pencampur perangkat lunak menghasilkan lebih sedikit
bit{i> <i}signifikan yang tersedia dalam sinyal ketika
diterima di penguat
perangkat keras.
Grup volume
Grup volume mengelola volume untuk sekumpulan perangkat dalam zona audio. Untuk setiap grup volume, volume dapat dikontrol secara independen, dan hasil dikonfigurasi pada perangkat terkait untuk diterapkan oleh amplifier kendaraan. Setelan volume disimpan untuk pengguna, dan dimuat saat pengguna login.
Menentukan kelompok volume
CarAudioService menggunakan grup volume yang ditentukan di car_audio_configuration.xml
:
<audioZoneConfiguration version="2.0"> <zones> <zone name="primary zone" isPrimary="true"> <volumeGroups> <group> <device address="bus0_media_out"> <context context="music"/> </device> </group> <group> <device address="bus1_navigation_out"> <context context="navigation"/> </device> <device address="bus2_voice_command_out"> <context context="voice_command"/> </device> </group> ... </volumeGroups> </zone> </zones> </audioZoneConfiguration>
Contoh implementasi car_audio_configuration.xml
.
Setiap grup volume harus berisi satu atau beberapa perangkat output dengan alamat terkait.
Alamat ini harus sesuai dengan
perangkat {i>output<i} yang ditentukan dalam
audio_policy_configuration.xml
.
Mengonfigurasi penambahan grup volume
Setiap grup volume memiliki nilai perolehan minimum, maksimum, dan default, serta
ukuran langkah. Hal ini ditentukan berdasarkan
nilai yang dikonfigurasi di
audio_policy_configuration.xml
untuk perangkat terkait
dengan kelompok volume.
<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> <gains> <gain name="" mode="AUDIO_GAIN_MODE_JOINT" minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/> </gains> </devicePort>
Selama inisialisasi, grup volume akan memeriksa nilai keuntungan dari perangkat dan konfigurasi grup sebagai berikut:
- Ukuran langkah. Harus sama untuk semua perangkat yang dikontrol oleh grup volume
- Penguatan minimum. Keuntungan minimum terkecil di antara perangkat dalam grup
- Perolehan maksimum. Perolehan maksimum tertinggi di antara perangkat dalam grup
- Perolehan default. Perolehan default tertinggi di antara perangkat dalam grup
Karena cara nilai-nilai ini dikonfigurasi, ada kemungkinan untuk mengatur penguatan grup volume di luar rentang yang didukung untuk perangkat yang terkait dengan grup volume. Dalam hal ini, untuk perangkat tersebut, keuntungan akan ditetapkan ke nilai minimum atau maksimum perangkat dapatkan nilai berdasarkan apakah nilai grup volume berada di bawah atau di atas rentang tersebut.
ID grup volume
Grup volume diidentifikasi saat runtime berdasarkan urutan definisinya dalam file XML.
ID berkisar antara 0 hingga N-1 dalam zona audio, dengan N adalah jumlah grup volume dalam
zona tersebut. Dengan cara ini, ID grup volume tidak unik di seluruh zona. Pengidentifikasi ini
digunakan untuk CarAudioManager
API yang terkait dengan grup volume. API apa pun
yang mengambil groupId
tanpa zoneId
akan ditetapkan secara default ke
zona audio utama.
Pengelolaan volume multi-zona
Setiap zona audio diharapkan memiliki satu atau beberapa grup volume, dan setiap grup volume
hanya dikaitkan dengan satu zona audio. Hubungan ini didefinisikan
sebagai bagian dari
car_audio_configuration.xml
. Lihat contoh yang tersedia di
Menentukan grup volume di atas.
Tingkat volume saat ini untuk setiap zona dipertahankan untuk pengguna yang terkait dengan zona tersebut. Setelan ini bersifat khusus zona, artinya jika pengguna login di layar yang terkait dengan zona utama, dan selanjutnya masuk ke zona yang terkait dengan di zona audio sekunder, level volume yang dimuat dan dipertahankan di zona pertama akan berbeda dari zona sekunder.
Menangani peristiwa tombol volume
Android menentukan beberapa kode tombol untuk kontrol volume, termasuk
KEYCODE_VOLUME_UP
, KEYCODE_VOLUME_DOWN
, dan
KEYCODE_VOLUME_MUTE
. Secara default, Android merutekan tombol volume
peristiwa pada aplikasi. Implementasi otomotif harus memaksa peristiwa utama ini untuk
CarAudioService
, yang kemudian dapat memanggil setGroupVolume
atau
setMasterMute
sebagaimana mestinya.
Untuk memaksa perilaku ini, setel config_handleVolumeKeysInWindowManager
tandai ke true
:
<resources> <bool name="config_handleVolumeKeysInWindowManager">true</bool> </resources>
Peristiwa tombol volume saat ini tidak memiliki cara untuk membedakan zona mana yang dimaksud
ditujukan untuk, dan dengan demikian dianggap semua terkait dengan zona audio utama.
Saat peristiwa tombol volume diterima, CarAudioService
akan menentukan volume
grup untuk menyesuaikan dengan mengambil konteks audio untuk pemutar aktif, lalu menyesuaikannya
grup volume yang berisi perangkat output yang terkait dengan prioritas tertinggi
konteks audio. Prioritas ditentukan berdasarkan urutan tetap yang ditentukan dalam
CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
.
Pudar dan seimbang
Kedua versi AudioControl HAL menyertakan API untuk menyetel pudar dan keseimbangan dalam
yang digunakan untuk kendaraan. Ada API sistem yang sesuai untuk CarAudioManager yang meneruskan nilai
sampai ke HAL AudioControl. API ini memerlukan
android.car.permission.CAR_CONTROL_AUDIO_VOLUME
.
AudioControl API adalah:
setBalanceTowardRight(float value)
. Menggeser volume speaker ke arah sisi kanan (+) atau kiri (-) mobil. 0.0 berada di tengah, +1.0 sepenuhnya benar, -1,0 sepenuhnya tersisa, dan nilai di luar rentang -1 hingga 1 adalah kesalahan.setFadeTowardFront(float value)
- Menggeser volume speaker bagian depan (+) atau belakang (-) mobil. 0.0 berada di tengah, +1.0 sepenuhnya ke depan, -1.0 sepenuhnya ke belakang, dan nilai di luar rentang -1 hingga 1 adalah error.
OEM sendiri yang memutuskan bagaimana nilai ini harus diterapkan dan bagaimana nilainya akan ditampilkan kepada pengguna. Iklan ini dapat diterapkan hanya pada media atau di seluruh mengakses semua suara Android.
Android 11 juga memperkenalkan dukungan untuk menerapkan efek audio ke perangkat output. Dengan ini, kita bisa mengatur pudar dan keseimbangan melalui efek audio pada perangkat output yang sesuai, bukan melalui API ini.
Pengecilan volume audio
Pengurangan volume audio terjadi saat kendaraan mengurangi penguatan untuk satu streaming agar streaming lain yang diputar pada saat yang sama dapat didengar dengan lebih jelas. Pada AAOS, pengecilan volume audio diserahkan kepada HAL untuk diterapkan karena kemungkinan ada banyak suara di luar Android yang tidak dapat dikontrol oleh OS. Di Android 11, informasi utama tersedia di HAL untuk membuat keputusan pengecilan volume adalah apakah dua perangkat {i>output<i} memiliki feed yang aktif.
Kapan harus mengecil
Meskipun setiap OEM memiliki keputusan untuk menentukan bagaimana penanganan pengecilan volume oleh HAL mereka, ada beberapa panduan umum yang kami rekomendasikan. Beberapa streaming yang diputar di Android akan paling sering terjadi ketika dua aplikasi/layanan menahan fokus audio secara serentak. Mengingat hal itu, lihat Matriks interaksi untuk mempelajari kapan Android dapat memberikan fokus serentak dan, oleh karena itu, saat memungkinkan dua berbagai streaming untuk dimainkan secara serentak.
Perlu diingat bahwa streaming apa pun yang digabungkan oleh Android akan dilakukan sebelum keuntungan apa pun yang diterapkan. Dengan demikian, setiap streaming yang harus dikecilkan ketika diputar bersamaan dengan yang lain harus dirutekan untuk perangkat {i>output<i} terpisah sehingga HAL dapat menerapkan pengecilan volume sebelum mencampurnya bersama-sama.
Perilaku pengecilan volume yang direkomendasikan
Berikut ini adalah potensi interaksi serentak yang kami sarankan untuk mengecilkan yang akan diterapkan:
EMERGENCY
. Pengecilan volume atau bisukan semua audio kecualiSAFETY
hingga pastikan pengemudi mendengar suaraSAFETY
. Hapus semua kecualiEMERGENCY
untuk memastikan pengemudi mendengar suaraNAVIGATION
. Bebek semuanya kecualiSAFETY
danEMERGENCY
CALL
. Bebek semuanya kecualiSAFETY
,EMERGENCY
, danNAVIGATION
VOICE
. BebekCALL_RING
- OEM dapat menentukan tingkat kepentingan
VEHICLE_SOUNDS
yang aktif dan apakah mereka harus mengecilkan suara lain untuk memastikan pengemudi dapat mendengarnya. MUSIC
danANNOUNCEMENT
harus diperkecil oleh semuanya. Pengecualian utama untuk hal ini adalah nada interaksi sentuh yang saat ini dimainkan sebagaiSYSTEM_SOUND
Pertimbangan lain saat mengecilkan
Beberapa aplikasi/layanan seperti navigasi atau asisten mungkin menggunakan banyak pemain untuk menyelesaikan tindakan mereka. OEM harus menghindari pengurangan beban terlalu agresif berdasarkan kapan data streaming berhenti yang masuk melalui perangkat {i>output<i} ini untuk memastikan pengguna tidak segera mendapatkan ke volume penuh sebelum diperkecil kembali sebagai pemutaran berikutnya dari navigasi atau aplikasi Google Assistant dimulai.
Untuk kendaraan dengan beberapa peredam suara dengan isolasi yang cukup baik, tersedia juga opsi untuk mengarahkan audio ke area yang berbeda dari mobil, bukan mengecilkan volume. Misalnya, navigasi petunjuk dapat diarahkan ke speaker {i>headrest<i} saat musik terus diputar di seluruh kabin dengan volume normal.
Suara keselamatan yang penting
Sementara Android 11 memperkenalkan
API fokus audio HAL,
sampai pada HAL untuk memastikan bahwa
suara yang penting keselamatan lebih diprioritaskan daripada
lainnya. Meskipun HAL menyimpan fokus audio untuk USAGE_EMERGENCY
, HAL tersebut tidak
menjamin aplikasi dan layanan dalam Android tidak akan memutar suara. Terserah HAL untuk
menentukan streaming mana dari Android yang harus dicampur atau dibisukan karena suara yang penting untuk keamanan
yang dimainkan.
Mengonfigurasi UI setelan volume
AAOS memisahkan UI setelan volume dari konfigurasi grup volume (yang dapat ditempatkan seperti yang dijelaskan dalam Mengonfigurasi grup volume). Pemisahan ini memastikan bahwa tidak perubahan diperlukan jika konfigurasi grup volume berubah pada masa mendatang.
Di UI Setelan Mobil, packages/apps/Car/Settings/res/xml/car_volume_items.xml
berisi elemen UI (sumber daya judul dan ikon) yang terkait dengan masing-masing elemen
AudioAttributes.USAGE
. File ini memberikan perenderan yang wajar
VolumeGroups
yang telah ditentukan dengan menggunakan resource yang terkait dengan
mengenali penggunaan yang ada di setiap VolumeGroup.
Misalnya, contoh berikut mendefinisikan VolumeGroup sebagai menyertakan
voice_communication
dan voice_communication_signalling
. Default
implementasi UI setelan mobil merender VolumeGroup menggunakan resource terkait
dengan voice_communication
karena itu adalah yang pertama dalam file.
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto"> <item car:usage="voice_communication" car:title="@*android:string/volume_call" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="voice_communication_signalling" car:title="@*android:string/volume_call" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="media" car:title="@*android:string/volume_music" car:icon="@*android:drawable/ic_audio_media"/> <item car:usage="game" car:title="@*android:string/volume_music" car:icon="@*android:drawable/ic_audio_media"/> <item car:usage="alarm" car:title="@*android:string/volume_alarm" car:icon="@*android:drawable/ic_audio_alarm"/> <item car:usage="assistance_navigation_guidance" car:title="@string/navi_volume_title" car:icon="@drawable/ic_audio_navi"/> <item car:usage="notification_ringtone" car:title="@*android:string/volume_ringtone" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistant" car:title="@*android:string/volume_unknown" car:icon="@*android:drawable/ic_audio_vol"/> <item car:usage="notification" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_communication_request" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_communication_instant" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_communication_delayed" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_event" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistance_accessibility" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistance_sonification" car:title="@*android:string/volume_unknown" car:icon="@*android:drawable/ic_audio_vol"/> <item car:usage="unknown" car:title="@*android:string/volume_unknown" car:icon="@*android:drawable/ic_audio_vol"/> </carVolumeItems>
Atribut dan nilai yang digunakan dalam konfigurasi di atas dideklarasikan di
packages/apps/Car/Settings/res/values/attrs.xml
. Setelan volume
UI menggunakan CarAudioManager API berbasis VolumeGroup berikut:
getVolumeGroupCount()
untuk mengetahui jumlah kontrol yang harus digambar.getGroupMinVolume()
dangetGroupMaxVolume()
untuk mendapatkan batas bawah dan atas.getGroupVolume()
untuk mendapatkan volume saat ini.registerVolumeChangeObserver()
untuk mendapatkan notifikasi tentang perubahan volume.