AAOS memiliki pengelolaan volumenya sendiri dalam CarAudioService
. Hal ini menggunakan volume
tetap dengan harapan bahwa volume harus diterapkan di bawah HAL oleh penguat
hardware, bukan di software. Fitur ini juga mengatur perangkat output ke dalam grup volume
untuk 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 benar (overlay sesuai kebutuhan):
<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 menurut jenis streaming di mixer software. Hal ini mungkin tidak diinginkan karena
potensi efek pada aplikasi lain dan fakta bahwa atenuasi volume di
mixer software menghasilkan lebih sedikit bit signifikan yang tersedia dalam sinyal saat
diterima di amplifier hardware.
Grup volume
Grup volume mengelola volume untuk kumpulan perangkat dalam zona audio. Untuk setiap grup volume, volume dapat dikontrol secara independen, dan penguatan yang dihasilkan dikonfigurasi pada perangkat terkait untuk diterapkan oleh amplifier kendaraan. Setelan volume dipertahankan untuk pengguna, dan dimuat saat pengguna login.
Menentukan grup 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 penerapan car_audio_configuration.xml
.
Setiap grup volume harus berisi satu atau beberapa perangkat output dengan alamat terkait.
Alamat ini harus sesuai dengan perangkat output yang ditentukan dalam
audio_policy_configuration.xml
.
Mengonfigurasi peningkatan grup volume
Setiap grup volume memiliki nilai gain minimum, maksimum, dan default serta
ukuran langkah. Nilai ini ditentukan berdasarkan nilai yang dikonfigurasi di
audio_policy_configuration.xml
untuk perangkat yang terkait
dengan grup 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 gain perangkat terkait dan mengonfigurasi grup sebagai berikut:
- Ukuran langkah. Harus sama untuk semua perangkat yang dikontrol oleh grup volume
- Penguatan minimum. Penguatan minimum terkecil di antara perangkat dalam grup
- Penghasilan maksimum. Penguatan maksimum tertinggi di antara perangkat dalam grup
- Penguatan default. Gain default tertinggi di antara perangkat dalam grup
Karena cara konfigurasi nilai ini, Anda dapat menetapkan gain grup volume di luar rentang yang didukung untuk perangkat yang terkait dengan grup volume. Dalam hal ini, untuk perangkat tersebut, penguatan akan ditetapkan ke nilai penguatan minimum atau maksimum perangkat berdasarkan apakah nilai grup volume berada di bawah atau di atas rentang.
ID grup volume
Grup volume diidentifikasi saat runtime berdasarkan urutan definisinya dalam file XML.
ID berkisar dari 0 hingga N-1 dalam zona audio, dengan N adalah jumlah grup volume di zona tersebut. Dengan cara ini, ID grup volume tidak unik di seluruh zona. ID ini
digunakan untuk API CarAudioManager
yang terkait dengan grup volume. Setiap API
yang menggunakan 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 ditentukan sebagai bagian dari
car_audio_configuration.xml
. Lihat contoh yang diberikan di
Menentukan grup volume di atas.
Tingkat volume saat ini untuk setiap zona dipertahankan untuk pengguna yang terkait dengan zona tersebut. Setelan ini khusus zona, yang berarti jika pengguna login di layar yang terkait dengan zona utama, lalu kemudian login ke zona yang terkait dengan zona audio sekunder, level volume yang dimuat dan dipertahankan untuk zona pertama akan berbeda dengan zona sekunder.
Menangani peristiwa tombol volume
Android menentukan beberapa kode kunci untuk kontrol volume, termasuk
KEYCODE_VOLUME_UP
, KEYCODE_VOLUME_DOWN
, dan
KEYCODE_VOLUME_MUTE
. Secara default, Android merutekan peristiwa tombol volume
ke aplikasi. Implementasi otomotif harus memaksa peristiwa utama ini ke
CarAudioService
, yang kemudian dapat memanggil setGroupVolume
atau
setMasterMute
sebagaimana mestinya.
Untuk memaksa perilaku ini, tetapkan flag config_handleVolumeKeysInWindowManager
ke true
:
<resources> <bool name="config_handleVolumeKeysInWindowManager">true</bool> </resources>
Peristiwa tombol volume saat ini tidak memiliki cara untuk membedakan zona yang
dimaksud, sehingga diasumsikan bahwa semuanya terkait dengan zona audio utama.
Saat peristiwa tombol volume diterima, CarAudioService
menentukan grup volume
yang akan disesuaikan dengan mengambil konteks audio untuk pemutar yang aktif, lalu menyesuaikan
grup volume yang berisi perangkat output yang terkait dengan konteks audio
prioritas tertinggi. Prioritas ditentukan berdasarkan pengurutan tetap yang ditentukan di
CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
.
Pudar dan seimbang
Kedua versi AudioControl HAL menyertakan API untuk menyetel fade dan balance di
kendaraan. Ada API sistem yang sesuai untuk CarAudioManager yang meneruskan nilai
ke HAL AudioControl. API ini memerlukan
android.car.permission.CAR_CONTROL_AUDIO_VOLUME
.
AudioControl API adalah:
setBalanceTowardRight(float value)
. Menggeser volume speaker ke sisi kanan (+) atau kiri (-) mobil. 0,0 berada di tengah, +1,0 sepenuhnya di kanan, -1,0 sepenuhnya di kiri, dan nilai di luar rentang -1 hingga 1 adalah error.setFadeTowardFront(float value)
- Mengalihkan volume speaker ke 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 dapat memutuskan cara menerapkan nilai ini dan cara nilai tersebut akan ditampilkan kepada pengguna. Pembatasan ini dapat diterapkan secara ketat ke media atau di seluruh sistem untuk semua suara Android.
Android 11 juga memperkenalkan dukungan untuk menerapkan efek audio ke perangkat output. Dengan ini, Anda dapat mengelola fade dan keseimbangan secara alternatif melalui efek audio di perangkat output yang sesuai, bukan melalui API ini.
Pengecilan volume audio
Pengecilan volume audio terjadi saat kendaraan mengurangi gain untuk satu streaming sehingga streaming lain yang diputar secara bersamaan dapat didengar dengan lebih jelas. Di AAOS, audio ducking diserahkan kepada HAL untuk diterapkan karena berpotensi ada banyak suara di luar Android yang tidak dapat dikontrol oleh OS. Di Android 11, informasi utama yang tersedia untuk HAL guna membuat keputusan peredam adalah apakah dua perangkat output memiliki streaming aktif.
Kapan harus menunduk
Meskipun setiap OEM dapat menentukan cara penanganan peredam suara oleh HAL-nya, ada beberapa panduan umum yang kami rekomendasikan. Beberapa streaming yang diputar dalam Android paling sering terjadi saat dua aplikasi/layanan memegang fokus audio secara bersamaan. Dengan mempertimbangkan hal tersebut, lihat Matriks interaksi untuk mempelajari kapan Android dapat memberikan fokus serentak dan, oleh karena itu, kapan dua streaming yang berbeda dapat diputar secara serentak.
Perhatikan bahwa setiap streaming yang digabungkan oleh Android akan dilakukan sebelum keuntungan diterapkan. Dengan demikian, setiap streaming yang harus di-duck saat diputar secara serentak dengan streaming lain harus dirutekan ke perangkat output terpisah sehingga HAL dapat menerapkan duck sebelum menggabungkannya.
Perilaku penyembunyian yang direkomendasikan
Berikut adalah potensi interaksi serentak yang sebaiknya menerapkan ducking:
EMERGENCY
. Bisukan atau perkecil semua suara kecualiSAFETY
untuk memastikan pengemudi mendengar suaraSAFETY
. Bisukan semua kecualiEMERGENCY
untuk memastikan pengemudi mendengar suaraNAVIGATION
. Menyembunyikan semua kecualiSAFETY
danEMERGENCY
CALL
. Menyembunyikan semua kecualiSAFETY
,EMERGENCY
, danNAVIGATION
VOICE
. DuckCALL_RING
- OEM dapat menentukan tingkat kepentingan
VEHICLE_SOUNDS
aktif dan apakah mereka harus meredam suara lain untuk memastikan pengemudi mendengarnya atau tidak. MUSIC
danANNOUNCEMENT
harus dihindari oleh semua hal. Pengecualian utamanya adalah nada interaksi sentuh yang saat ini diputar sebagaiSYSTEM_SOUND
Pertimbangan lainnya saat menunduk
Beberapa aplikasi/layanan seperti navigasi atau asisten mungkin menggunakan beberapa pemain untuk menyelesaikan tindakannya. OEM harus menghindari penghentian yang terlalu agresif berdasarkan kapan data streaming berhenti datang melalui perangkat output ini untuk memastikan pengguna tidak sejenak mengembalikan media ke volume penuh sebelum dihentikan kembali saat pemutaran berikutnya dari aplikasi navigasi atau asisten dimulai.
Untuk kendaraan dengan beberapa panggung suara dengan isolasi yang cukup baik, ada juga opsi untuk merutekan audio ke area mobil yang berbeda, bukan menundukkan. Misalnya, petunjuk navigasi dapat diarahkan ke speaker headrest pengemudi saat musik terus diputar di seluruh kabin dengan volume normal.
Suara penting untuk keselamatan
Meskipun Android 11 memperkenalkan
HAL audio focus API,
HAL tetap dapat memastikan suara yang penting untuk keselamatan diprioritaskan daripada
yang lain. Meskipun HAL memiliki fokus audio untuk USAGE_EMERGENCY
, hal itu tidak
menjamin aplikasi dan layanan dalam Android tidak akan memutar suara. HAL dapat
menentukan streaming mana dari Android yang harus dicampur atau dibisukan saat suara penting keamanan
diputar.
Mengonfigurasi UI setelan volume
AAOS memisahkan UI setelan volume dari konfigurasi grup volume (yang dapat ditumpangkan seperti yang dijelaskan dalam Mengonfigurasi grup volume). Pemisahan ini memastikan bahwa tidak ada perubahan yang diperlukan jika konfigurasi grup volume berubah di masa mendatang.
Di UI Setelan Mobil, file packages/apps/Car/Settings/res/xml/car_volume_items.xml
berisi elemen UI (resource judul dan ikon) yang terkait dengan setiap
AudioAttributes.USAGE
yang ditentukan. File ini menyediakan rendering yang wajar dari
VolumeGroups
yang ditentukan dengan menggunakan resource yang terkait dengan penggunaan
pertama yang dikenali yang terdapat di setiap VolumeGroup.
Misalnya, contoh berikut menentukan VolumeGroup sebagai menyertakan
voice_communication
dan voice_communication_signalling
. Implementasi
default UI setelan mobil merender VolumeGroup menggunakan resource yang terkait
dengan voice_communication
karena merupakan 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
. UI setelan volume
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.