Pengelolaan volume terdapat di CarAudioService
, yang menggunakan volume tetap dengan harapan bahwa volume diterapkan di bawah HAL oleh amplifier hardware, bukan di software. CarAudioService
mengatur perangkat output
ke dalam grup volume untuk menerapkan keuntungan yang sama ke semua perangkat yang terkait dengan
grup volume.
Volume tetap
Implementasi AAOS menggunakan amplifier hardware untuk mengontrol volume, bukan mixer software. Untuk menghindari efek samping, setel tanda config_useFixedVolume
ke
true
(tumpang-tindih sesuai kebutuhan):
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
Jika tanda config_useFixedVolume
tidak disetel (atau disetel ke false
),
aplikasi dapat memanggil AudioManager.setStreamVolume()
untuk mengubah volume menurut jenis
streaming di mixer software. Hal ini mungkin tidak selalu diinginkan karena potensi
efek pada aplikasi lain dan fakta bahwa atenuasi volume di mixer software
dapat menghasilkan lebih sedikit bit signifikan yang tersedia dalam sinyal saat diterima oleh
amplifier hardware.
Grup volume
Grup volume mengelola volume untuk kumpulan perangkat dalam zona audio. Untuk setiap grup volume, volume dapat dikontrol secara terpisah. Peningkatan yang dihasilkan dikonfigurasi di 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 dalam car_audio_configuration.xml
:
<audioZoneConfiguration version="4">
</deviceConfigurations>
<activationVolumeConfigs>
<activationVolumeConfig name="activation_volume_on_boot_config">
<activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
invocationType="onBoot" />
</activationVolumeConfig>
...
</activationVolumeConfigs>
<zones>
<zone name="primary zone" isPrimary="true">
<zoneConfigs>
<zoneConfig name="primary zone config 0" isDefault="true">
<volumeGroups>
<group activationConfig="activation_volume_on_boot_config">
<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>
</zoneConfig>
...
</zoneConfigs>
</zone>
</zones>
</audioZoneConfiguration>
Setiap grup volume harus berisi satu atau beberapa perangkat output dengan alamat terkait. Alamat harus sesuai dengan perangkat output yang ditentukan dalam
audio_policy_configuration.xml
.
Mengonfigurasi perolehan grup volume
Setiap grup volume memiliki nilai perolehan minimum, maksimum, dan default serta ukuran langkah 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 memeriksa nilai gain perangkat terkait dan mengonfigurasi grup sebagai berikut:
- Ukuran langkah. Harus sama untuk semua perangkat yang dikontrol oleh grup volume.
- Keuntungan minimum. Peningkatan minimum terkecil di antara perangkat dalam grup.
- Keuntungan maksimum. Keuntungan maksimum tertinggi di antara perangkat dalam grup.
- Penguatan default. Peningkatan default tertinggi di antara perangkat dalam grup.
Mengingat cara nilai ini dikonfigurasi, Anda dapat menyetel gain grup volume di luar rentang yang didukung untuk perangkat yang terkait dengan grup volume. Dalam hal ini, untuk perangkat tersebut, gain ditetapkan ke nilai gain minimum atau maksimum perangkat berdasarkan apakah nilai grup volume berada di bawah atau di atas rentang.
ID grup volume
Grup volume diidentifikasi saat runtime dalam urutan yang ditentukan dalam file XML.
ID berkisar dari 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. ID ini digunakan untuk API CarAudioManager
yang terkait dengan grup volume. Setiap API yang menerima groupId
tanpa zoneId
secara default akan menggunakan 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
. Untuk mempelajari lebih lanjut, lihat contoh di atas
di Menentukan grup volume.
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 primer, lalu login ke zona yang terkait dengan zona audio sekunder, level volume yang dimuat dan dipertahankan untuk zona pertama berbeda dengan level volume untuk zona sekunder.
Volume aktivasi minimum dan maksimum
Android 15 memperkenalkan kontrol atas indeks grup volume untuk meningkatkan keamanan dan kenyamanan pengguna dalam sistem audio mobil. Hal ini dicapai melalui penggunaan volume aktivasi minimum dan maksimum, yang dikonfigurasi dalam konfigurasi audio mobil (lihat Menentukan grup volume). Anda dapat mengaktifkan fitur ini dengan
menetapkan audioUseMinMaxActivationVolume
ke true
di RRO Layanan Mobil.
Anda dapat menentukan beberapa entri activationVolumeConfig
di
activationVolumeConfigs
, yang masing-masing mewakili konfigurasi aktivasi minimum dan
maksimum yang berbeda. Setiap activationVolumeConfig
:
- Harus berisi
name
unik di seluruh file konfigurasi audio mobil, sehingga dapat dirujuk dalam grup volume (group
) nanti. - Hanya boleh berisi satu
activationVolumeConfigEntry
.
Setiap activationVolumeConfig
berisi atribut berikut:
minActivationVolumePercentage
(integer, 0-100, opsional, default: 0): Menentukan volume aktivasi minimum sebagai persentase.maxActivationVolumePercentage
(bilangan bulat, 0-100, opsional, default: 100): Menentukan volume aktivasi maksimum sebagai persentase.invocationType
(string, opsional, default:onPlaybackChanged
): Menentukan kondisi saat volume aktivasi minimum dan maksimum diterapkan:onBoot
: Hanya diterapkan pada pemutaran yang baru diaktifkan pertama pada grup volume setelah booting.onSourceChanged
: Hanya diterapkan pada pemutaran yang baru aktif dengan sumber aplikasi atau UID yang berubah pada grup volume.onPlaybackChanged
: Diterapkan ke setiap pemutaran yang baru aktif pada grup volume.
CarAudioService
mengelola aktivasi minimum dan maksimum dengan memantau
subkomponen audio aktif berikut saat ini:
- Track pemutaran aktif saat ini
- Status panggilan saat ini
- Permintaan fokus audio saat ini dari HAL Kontrol Audio tempat permintaan fokus audio dari HAL Kontrol Audio menandakan bahwa pemutaran audio aktif sedang terjadi di luar Android
Gambar berikut menunjukkan ringkasan tingkat tinggi pengelolaan volume aktivasi minimum dan maksimum:
Gambar 1. Pengelolaan volume aktivasi minimum dan maksimum jalur data audio aktif.
Dengan minActivationVolumePercentage
, maxActivationVolumePercentage
,
indeks perolehan volume minimum dan maksimum yang ditentukan, Anda dapat menghitung indeks perolehan volume aktivasi minimum dan maksimum untuk setiap grup volume. CarAudioService
memantau setiap pemutaran yang baru aktif dan menerapkan volume aktivasi
minimum dan maksimum dalam kondisi berikut:
- Jenis pemanggilan cocok: Jenis aktivasi pemutaran (berasal dari
Audio Manager, Audio Control HAL, atau Telephony Manager) harus cocok dengan
invocationType
yang ditentukan dalamactivationVolumeConfigEntry
yang terkait dengan grup volume. Indeks volume di luar rentang: Indeks perolehan volume saat ini dari grup volume harus berada di luar rentang indeks perolehan volume aktivasi yang ditentukan, khususnya, salah satu hal berikut benar:
Indeks lebih rendah daripada perolehan volume aktivasi minimum yang dihitung indeks.
ATAU
Indeks lebih tinggi daripada indeks peningkatan volume aktivasi maksimum yang dihitung.
Jika ada kecocokan aktivasi, indeks perolehan volume grup volume akan disesuaikan ke salah satu nilai berikut:
Indeks peningkatan volume aktivasi minimum jika lebih rendah dari indeks peningkatan volume aktivasi minimum
ATAU
Indeks peningkatan volume aktivasi maksimum jika lebih tinggi daripada indeks peningkatan volume aktivasi maksimum
Selain itu, peristiwa grup volume mobil dengan jenis peristiwa EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED
dikirim ke semua callback peristiwa grup volume yang terdaftar.
Menangani peristiwa tombol volume
Android menentukan beberapa kode tombol untuk kontrol volume, termasuk:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
Secara default, Android merutekan peristiwa tombol volume ke aplikasi. Implementasi Otomotif harus memaksa peristiwa tombol ini diproses oleh CarAudioService
, yang kemudian memanggil setGroupVolume
atau setMasterMute
, sebagaimana mestinya. Untuk memaksakan perilaku ini, tetapkan flag
config_handleVolumeKeysInWindowManager
ke true
:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
Peristiwa utama volume saat ini tidak memiliki cara untuk membedakan zona yang dituju dan diasumsikan semuanya terkait dengan zona audio utama. Saat peristiwa tombol volume diterima, CarAudioService
akan menentukan grup volume mana yang akan disesuaikan dengan mengambil konteks audio untuk pemutar aktif, lalu menyesuaikan grup volume yang berisi perangkat output yang terkait dengan konteks audio prioritas tertinggi. Prioritas ditentukan berdasarkan urutan tetap yang ditentukan dalam CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
.
Pudar dan seimbangkan
Kedua versi AudioControl HAL menyertakan API untuk menyetel fade dan keseimbangan
di kendaraan. API sistem yang sesuai untuk CarAudioManager meneruskan nilai
ke HAL AudioControl. API ini memerlukan
android.car.permission.CAR_CONTROL_AUDIO_VOLUME
. AudioControl API adalah:
setBalanceTowardRight(float value)
mengalihkan volume speaker ke sisi kanan (+) atau kiri (-) mobil.- 0,0 berada di tengah
- +1,0 sepenuhnya benar
- -1,0 sepenuhnya ke kiri
- Nilai di luar rentang -1 hingga 1 adalah error
setFadeTowardFront(float value)
menggeser volume speaker ke arah depan (+) atau belakang (-) mobil.- 0,0 berada di tengah
- +1.0 sepenuhnya maju
- -1.0 adalah sepenuhnya ke belakang
- Nilai di luar rentang -1 hingga 1 adalah error
Anda memutuskan cara menerapkan nilai ini dan cara menampilkan nilai kepada pengguna. Efek ini dapat diterapkan secara ketat ke media atau secara menyeluruh ke semua suara Android. Android 11 juga memperkenalkan dukungan untuk menerapkan efek audio ke perangkat output. Dengan demikian, Anda dapat mengelola fade dan keseimbangan melalui efek audio pada 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 terdengar lebih jelas. Di AAOS, perendaman audio diimplementasikan oleh HAL. Android tidak memiliki kontrol atas suara di luar OS. Di Android 11, informasi utama yang tersedia untuk HAL dalam membuat keputusan peredaman adalah apakah dua perangkat output memiliki streaming aktif atau tidak.
Kapan harus menunduk
Meskipun masing-masing OEM yang menentukan cara peredaman ditangani oleh HAL, sebaiknya ikuti panduan berikut.
Beberapa streaming yang diputar di Android biasanya terjadi saat dua aplikasi atau layanan memegang fokus audio secara bersamaan. Untuk mempelajari kapan Android dapat memberikan fokus serentak, lihat matriks interaksi di Jenis pembatasan. Dengan diperkenalkannya plugin audio mobil, hal ini juga bergantung pada pengelolaan AudioFocus Anda.
Semua aliran yang digabungkan oleh Android dilakukan sebelum peningkatan diterapkan. Oleh karena itu, setiap aliran yang harus dikecilkan volumenya saat diputar secara bersamaan dengan aliran lain harus dirutekan ke perangkat output terpisah sehingga HAL dapat menerapkan pengecilan volume sebelum mencampurnya.
Perilaku peredaman yang direkomendasikan
Berikut adalah potensi interaksi serentak yang sebaiknya dihindari.
Interaksi | Tindakan |
---|---|
EMERGENCY
| Meredam atau membisukan semua kecuali SAFETY
|
SAFETY |
Meredam semua audio kecuali EMERGENCY |
NAVIGATION |
Mengecualikan semuanya kecuali SAFETY dan EMERGENCY |
CALL |
Menghindari semua kecuali SAFETY , EMERGENCY ,
dan NAVIGATION |
VOICE |
Bebek CALL_RING |
VEHICLE_SOUNDS |
Anda menentukan pentingnya suara aktif dan apakah suara tersebut meredam suara lain atau tidak. |
MUSIC dan ANNOUNCEMENT |
Dihindari oleh semuanya. Pengecualian adalah nada interaksi sentuh yang diputar sebagai
SYSTEM_SOUND .
|
Pertimbangan saat merendahkan volume
Beberapa aplikasi dan layanan, seperti navigasi atau asisten, mungkin menggunakan beberapa pemutar untuk melakukan tindakan. Hindari penurunan volume yang agresif saat aliran data berhenti mengalir melalui perangkat output untuk memastikan media tidak kembali ke volume penuh sebelum diturunkan volumenya sebelum pemutaran berikutnya dari navigasi atau aplikasi asisten dimulai.
Untuk kendaraan dengan beberapa panggung suara dengan isolasi yang cukup baik, Anda dapat merutekan audio ke berbagai area mobil, bukan meredamnya. Misalnya, petunjuk navigasi dapat diarahkan ke speaker sandaran kepala pengemudi sambil terus memutar musik di seluruh kabin dengan volume normal.
Suara penting untuk keselamatan
Android 11 memperkenalkan
API fokus audio HAL. HAL memastikan
suara penting untuk keselamatan diprioritaskan daripada suara lainnya. Jika HAL mempertahankan fokus audio
selama USAGE_EMERGENCY
, tidak dijamin bahwa aplikasi dan layanan dari
Android tidak akan memutar suara. HAL menentukan stream mana dari Android yang harus dicampur atau diredam untuk memutar suara penting demi keselamatan.
Mengonfigurasi UI setelan volume
AAOS memisahkan UI setelan volume dari konfigurasi grup volume. Setelan ini dapat ditimpa seperti yang dijelaskan dalam Mengonfigurasi gain grup volume. Pemisahan ini memastikan bahwa tidak ada perubahan yang diperlukan jika konfigurasi grup volume berubah.
Di UI setelan mobil, packages/apps/Car/Settings/res/xml/car_volume_items.xml
berisi elemen UI (judul dan resource ikon) yang terkait dengan setiap
AudioAttributes.USAGE
yang ditentukan. File ini menyediakan rendering VolumeGroups
yang wajar dengan menggunakan resource yang terkait dengan penggunaan pertama yang dikenali yang terdapat dalam setiap VolumeGroup
.
Misalnya, contoh berikut menentukan VolumeGroup
sebagai yang mencakup
voice_communication
dan voice_communication_signalling
. Implementasi
default UI setelan mobil merender VolumeGroup
menggunakan
resource yang terkait dengan voice_communication
karena itu adalah kecocokan 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 mempelajari berapa banyak kontrol yang harus digambar.getGroupMinVolume()
dangetGroupMaxVolume()
untuk mendapatkan batas bawah dan atas.getGroupVolume()
untuk mendapatkan volume saat ini.registerVolumeChangeObserver()
untuk mendapatkan notifikasi perubahan volume.
Peristiwa grup volume mobil
Kasus penggunaan otomotif untuk update volume dan tombol bisu memiliki dasar kontekstual yang dapat menentukan tindakan aplikasi tertentu, seperti setelan volume. Callback volume dan bisu saat ini dari stack audio mobil memberikan informasi kontekstual terbatas. Untuk melayani kasus penggunaan otomotif dan skalabilitas di masa mendatang dengan lebih baik, CarVolumeGroupEvent ditambahkan ke Android 14. Setiap peristiwa membawa tiga jenis informasi penting:
- Daftar
CarVolumeGroupInfo
EventTypes
(bit-mapped)- Daftar
ExtraInfos
CarVolumeGroupInfo
Penerima callback peristiwa memiliki akses langsung ke daftar informasi grup volume mobil yang terpengaruh. Artinya, aplikasi tidak perlu melakukan panggilan tambahan ke framework audio Mobil untuk mendapatkan status terbaru. Fungsi ini dapat
menggunakan CarVolumeGroupInfos
yang diterima untuk mengupdate UI atau status
internal. Untuk mempermudah aplikasi, aspek yang berubah dalam grup volume mobil juga diberikan sebagai bagian dari EventTypes
, seperti yang dijelaskan di bawah.
EventTypes
Menentukan aspek CarVolumeGroupInfo
mana yang telah berubah. Aplikasi dapat menggunakan ini untuk
mengidentifikasi perubahan dan mengambil tindakan yang diperlukan. Misalnya,
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
menunjukkan bahwa indeks perolehan volume maksimum
CarVolumeGroups
masing-masing telah berubah dan dapat dikueri oleh
CarVolumeGroupInfo.getMaxVolumeGainIndex()
.
Tabel berikut menunjukkan hubungan antara EventType
dan
CarVolumeGroupInfo
.
EventType | CarVolumeGroupInfo |
---|---|
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED |
CarVolumeGroupInfo.getVolumeGainIndex() |
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED |
CarVolumeGroupInfo.getMinVolumeGainIndex() |
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED |
CarVolumeGroupInfo.getMaxVolumeGainIndex() |
EVENT_TYPE_MUTE_CHANGED |
CarVolumeGroupInfo.isMuted() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED |
CarVolumeGroupInfo.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED |
CarVolumeGroupInfo.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED |
CarVolumeGroupInfo.getAudioAttributes() |
ExtraInfos
Memberikan informasi tambahan tentang alasan perubahan CarVolumeGroup
. Aplikasi dapat menggunakan informasi ini untuk memberikan konteks tambahan guna meminta pengguna bertindak atau memberikan notifikasi. Misalnya, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
menunjukkan peredaman sementara aktif karena kelebihan beban termal. Aplikasi
dapat memberi tahu pengguna jika mereka mencoba menaikkan volume.
Kami tidak menerapkan proses apa pun untuk ExtraInfos
. Anda dapat menentukan proses berdasarkan ExtraInfos
. Misalnya, jika peredaman aktif karena EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
, Anda juga dapat memilih untuk memudarkan UI panel volume pada awalnya untuk mencegah pengguna mengubah volume.
Aplikasi lain dapat memilih untuk menampilkan toast bahwa peredaman sedang aktif dan memungkinkan pengguna
mengubah volume.
Framework audio mobil bergantung pada HAL AudioControl IAudioGainCallback
untuk
memberikan ExtraInfos
yang disarankan. Untuk mempelajari lebih lanjut, lihat
Panggilan Balik Peningkatan Audio.
CarVolumeGroupEvent
diskalakan untuk memenuhi kebutuhan framework audio mobil di masa mendatang. Kami
berencana mendukung fitur baru melalui CarVolumeGroupEvent
saja. Sebaiknya developer aplikasi menggunakan CarVolumeGroupEvent
untuk menangani perubahan volume dan membisukan grup.
Callback peristiwa grup volume mobil
Android 14 menyediakan callback baru untuk aplikasi platform dan aplikasi istimewa agar dapat mendaftar dan menerima notifikasi CarVolumeGroupEvents
.
Untuk mendaftar callback, gunakan
CarAudioManager#registerCarVolumeGroupEventCallback()
Untuk membatalkan pendaftaran callback, gunakan
CarAudioManager#unregisterCarVolumeGroupEventCallback()
Jika aplikasi mendaftar dengan CarVolumeGroupEventCallback
baru dan CarVolumeCallback
lama, peristiwa CarVolumeGroupEventCallbacks
akan diprioritaskan.
Stack audio mobil tidak lagi memicu CarVolumeCallback
. Tindakan ini mencegah pemicu duplikat ke aplikasi yang sama untuk peristiwa yang sama.
Sebaiknya Anda menggunakan CarVolumeGroupEventCallback
untuk mengelola
perubahan volume dan membisukan grup.
Panggilan balik perolehan audio
Sejak Android 13, AudioControl HAL dapat memicu callback asinkron untuk mengelola pembaruan tingkat volume karena perubahan pada sistem audio mobil.
HAL API
AudioControl @2.0 AIDL
AudioControl AIDL HAL versi 2.0 menambahkan API berikut:
API | Tujuan |
---|---|
IAudioControl#registerGainCallback |
Mendaftarkan instance IAudioGainCallback dengan HAL AudioControl. |
IAudioGainCallback#onAudioDeviceGainsChanged |
Callback asinkron untuk memberi tahu perubahan pada konfigurasi gain audio. |
Callback HAL AudioControl mencakup daftar alasan dan AudioGainConfigInfo
masing-masing, yang terdiri dari:
- ID Zona
- Alamat port perangkat
- Indeks volume > indeks dapat berupa indeks yang dibatasi atau indeks update.
Alasannya dapat dikategorikan secara luas sebagai:
- Alasan pembatasan. Perubahan sementara pada perilaku volume dan bisu.
- Alasan pembaruan. Perubahan permanen pada perilaku volume.
Jenis pembatasan
Mulai AudioControl
HAL AIDL
V3
, berikut adalah jenis batasan yang didukung:
- Bisukan
- Pemblokiran
- Batasan
- Atenuasi
Pembatasan aktif | Perubahan volume yang dipicu pengguna | Tombol bisukan audio yang dipicu pengguna |
---|---|---|
Bisukan | ❌ | ❌ (bunyikan) ✔ (bisukan) |
Pemblokiran | ❌ | ✔ |
Batasan | ❌ (melebihi batas) ✔ (di bawah batas) |
✔ |
Atenuasi | ✔ | ✔ |
Prioritas antara pembatasan adalah Senyapkan > Pemblokiran > Pembatasan > Atenuasi.
Batasan membisukan audio
Batasan membisukan adalah:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Framework audio mobil secara internal mempertahankan dua status senyap ini:
Menonaktifkan pengguna. Diaktifkan berdasarkan permintaan dari pengguna, baik melalui
CarAudioManager
atau peristiwa utama.Nonaktifkan audio HAL. Diaktifkan/dinonaktifkan berdasarkan batasan membisukan yang diterima melalui callback
AudioGain
.
Untuk pemroses seperti aplikasi Setelan, status keseluruhan senyap grup volume (CarVolumeGroupInfo.isMuted()
) akan didasarkan pada apakah salah satu dari senyap di atas diaktifkan.
Saat pembisuan HAL diaktifkan, semua permintaan perubahan volume yang masuk dan pembatalan pembisuan grup diabaikan selama durasi pembatasan.
Kasus interaksi: Mute HAL aktif dan Pengguna meminta tombol Mute
Jika bisu HAL diaktifkan dan bisu Pengguna dinonaktifkan:
- Status senyap keseluruhan grup volume diubah menjadi
true
. - Permintaan dari Pengguna untuk mengaktifkan bisu akan diproses.
- Alasan: Permintaan bisu pengguna harus dipatuhi setiap saat untuk menjaga privasi pengguna.
Jika bisu HAL diaktifkan dan bisu Pengguna diaktifkan:
Status senyap keseluruhan grup volume diubah menjadi
true
.Permintaan dari Pengguna untuk menonaktifkan bisu akan diproses
NOT
. Status bisu Pengguna yang di-cache tetap diaktifkan.Alasan: Permintaan untuk mengaktifkan suara pengguna hanya akan dipenuhi jika tidak ada batasan aktif.
Alasan: Membatalkan bisu Pengguna yang di-cache dapat menyebabkan ledakan suara yang tidak diinginkan dan membahayakan keselamatan pengguna. Hal ini terutama berlaku jika status senyap diaktifkan di seluruh siklus pengapian yang menurunkan kesadaran pengguna terhadap persepsi tingkat suara.
Kasus interaksi: Bisukan HAL diaktifkan dan dinonaktifkan saat Bisukan pengguna tidak berubah
Mengalihkan pembisuan HAL akan mengubah status pembisuan keseluruhan grup volume. Namun, aplikasi ini tidak memperbarui status bisu pengguna secara langsung. Saat bisu Pengguna dinonaktifkan dan callback bisu HAL untuk diaktifkan diterima:
- Status senyap keseluruhan grup volume diubah menjadi
true
. Permintaan dari Pengguna untuk mengubah volume akan
NOT
diproses saat mute HAL diaktifkan.Alasan: Pengguna tidak dapat mendengar suara saat mode senyap diaktifkan. Mengizinkan perubahan volume dapat menyebabkan ledakan suara dan membahayakan keselamatan pengguna.
Alasan: Aplikasi volume dapat mendaftar untuk callback dan memicu pembatalan bisu (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) secara otomatis tanpa intervensi pengguna, jika ini adalah perilaku yang diharapkan oleh OEM.
Jika bisu HAL dinonaktifkan saat bisu Pengguna dinonaktifkan:
Status bisu grup volume diubah menjadi
false
.Alasan: Membuat status bisu tetap ada dan meminta Pengguna untuk membunyikan suara dapat mengganggu Pengguna secara tidak perlu saat status bisu sering berubah.
Permintaan dari pengguna untuk mengubah volume akan diproses secara normal.
Pemblokiran
Pembatasan pemblokiran adalah:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
Jika pembatasan Pemblokiran aktif, permintaan dari pengguna untuk:
- Perubahan volume tidak akan diproses.
- Mengaktifkan/menonaktifkan bisukan audio diproses.
Batasan
Batasan pembatasan adalah:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Jika pembatasan Batas aktif, permintaan dari pengguna untuk:
Mengubah volume:
- Dalam Batasan diproses
- Di atas Batas tidak diproses not
Mengaktifkan/menonaktifkan bisukan audio diproses.
Atenuasi
Batasan atenuasi adalah:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Jika pembatasan Atenuasi aktif, permintaan dari pengguna untuk:
Perubahan volume diproses. Tingkat volume saat ini yang baru disetel ke volume yang diredam (bukan ke volume sebelumnya). Perubahan volume di masa mendatang dilakukan dari level ini.
Mengaktifkan/menonaktifkan bisukan audio diproses.
Memperbarui indeks
Berikut dianggap sebagai update indeks volume asinkron:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Dengan alasan ini, AudioControl HAL dapat memperbarui indeks saat ini grup volume
ke indeks yang ditentukan. Hal ini terutama digunakan sebagai masukan dari sistem audio
untuk permintaan perubahan volume dari framework audio Mobil. Pembaruan indeks juga dikomunikasikan dengan Aplikasi sebagai callback CarVolumeGroupEvent
untuk menyinkronkan indeks.
Contoh
Kasus Penggunaan: Pengguna memperbarui indeks volume menjadi 30
Pengguna menggunakan aplikasi Volume untuk mengubah indeks volume menjadi 30.
Indeks ini dikonversi menjadi perolehan volume dan dikirim ke Audio HAL.
Implementasi vendor
Audio HAL
menerima peningkatan volume baru dan memperbarui sistem audio (seperti amplifier eksternal).Sistem audio merespons bahwa tingkat volume hanya diperbarui ke indeks 15 (karena alasan yang tidak diketahui oleh Android).
Pemicu penerapan vendor
AudioControl HAL
:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
Layanan audio mobil menggunakan indeks baru dari callback yang digunakan untuk persistensi dan callback ke aplikasi volume. Indeks yang diminta pengguna adalah 30. Namun, feedback asinkron sistem audio memperbarui indeks menjadi 15.
Kasus penggunaan: Pemutaran audio pertama setelah keluar dari mode ditangguhkan
Indeks volume sebelum ditangguhkan ditetapkan ke tingkat tinggi 95 (rentang: [0-99]).
Android memasuki mode ditangguhkan.
Setelah Android ada, lakukan penangguhan (misalnya, lanjutkan):
Vendor
Audio HAL/AudioControl HAL
menerapkan indeks aman 30 ke sistem audio secara lokal.AudioControl HAL
vendor juga memicu callback untuk indeks aman:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
Layanan audio mobil menggunakan indeks baru dari callback yang digunakan untuk persistensi dan callback-nya sendiri ke aplikasi volume yang menyinkronkan indeks. Indeks volume sebelum ditangguhkan adalah 95. Namun, setelah dilanjutkan, indeks ini disetel ke tingkat volume aman 30 oleh penerap
AudioControl HAL
.
Konfigurasi volume dinamis
Untuk fitur ini, kami mempertimbangkan kasus penggunaan utama berikut:
Konfigurasi akhir lini (EOL) kendaraan.
Produsen mobil lebih memilih untuk mengupdate konfigurasi volume di EOL berdasarkan penyiapan sistem audio kendaraan. Biasanya, ini adalah sideload tanpa mengupdate image SW Android.
Produsen mobil mungkin perlu memperbarui konfigurasi volume selama jadwal servis.
Konfigurasi runtime. Sistem audio otomotif mendukung konfigurasi amplifier eksternal dan ECU ini dapat menghosting konfigurasi rentang volume yang dikueri selama waktu booting.
Konfigurasi on demand. Ditawarkan untuk mendukung kebutuhan yang meningkat akan fitur audio berbasis permintaan yang memungkinkan pengguna berlangganan pemrosesan sinyal yang ditingkatkan selama jangka waktu tertentu. Konfigurasi rentang volume baru berlaku selama durasi langganan.
Desain
Konfigurasi volume dinamis dilakukan dalam tiga tahap:
Penemuan. Implementasi AudioControl HAL vendor menemukan pembaruan rentang volume baru melalui mekanisme IPC kustom milik vendor.
Setelah ditemukan, callback dibuat melalui
AudioControl::IModuleChangeCallback
.Perbarui. Stack audio mobil memperbarui status grup volume dengan rentang volume baru.
Upaya dilakukan untuk mempertahankan tingkat volume yang sama setelah pembaruan rentang volume. Namun, jika indeks berada di luar batas, indeks volume saat ini akan ditetapkan ke nilai yang aman. Misalnya, tingkat default yang disediakan oleh vendor selama callback.
Callback.
Setelah pembaruan rentang grup volume, stack audio mobil memicu callback ke aplikasi yang terdaftar melalui
CarVolumeGroupEventCallback
.CarVolumeGroupEvent
membawaCarVolumeGroupInfo
yang diperbarui, Jenis peristiwa (apa yang berubah) dan Info tambahan (mengapa berubah).
Gambar 2. Konfigurasi volume dinamis.
HAL API
AudioControl @ 3.0 AIDL
AudioControl AIDL HAL versi 3.0 memperkenalkan API berikut:
API | |
---|---|
IAudioControl#setModuleChangeCallback | Menetapkan instance IModuleChangeCallback dengan AudioControl HAL. |
IAudioControl#clearModuleChangeCallback | Menghapus instance IModuleChangeCallback yang sebelumnya ditetapkan dengan HAL AudioControl. |
IModuleChangeCallback#onAudioPortsChanged | Callback untuk memberi tahu perubahan pada AudioPort |
Urutan
Diagram urutan konfigurasi volume dinamis ditampilkan di bawah.
Gambar 3. Diagram urutan untuk konfigurasi volume dinamis.
Aspek utama
Untuk mengoptimalkan fitur ini, pertimbangkan hal berikut.
AudioPort yang disediakan sebagai bagian dari callback harus cocok dengan definisi BUS Automotive:
- Port perangkat.
IN_DEVICE
,OUT_DEVICE
- Koneksi.
BUS
- Alamat. Ditentukan dalam definisi HAL Audio
- Mode perolehan.
JOINT
- Port perangkat.
Vendor harus menentukan superset definisi rentang volume dalam kebijakan Audio HAL dan menggunakan callback untuk menyesuaikannya bagi varian kendaraan. Lihat definisi AIDL
IModuleChangeCallbac
untuk mengetahui informasi selengkapnya.Jika lebih dari satu BUS audio termasuk dalam grup volume yang sama, setiap BUS harus memiliki definisi rentang volume yang identik. Jika tidak dilakukan, framework audio mobil akan menolak definisi rentang volume baru.