Pengelolaan volume terdapat dalam CarAudioService
, yang menggunakan volume tetap
dengan harapan bahwa volume diterapkan di bawah HAL oleh penguat
hardware, bukan di software. CarAudioService
mengatur perangkat output
ke dalam grup volume untuk menerapkan penguatan 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, tetapkan flag config_useFixedVolume
ke
true
(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 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. Gain 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>
Setiap grup volume harus berisi satu atau beberapa perangkat output dengan alamat
terkait. Alamat harus sesuai dengan perangkat output yang ditentukan di
audio_policy_configuration.xml
.
Mengonfigurasi peningkatan grup volume
Setiap grup volume memiliki nilai gain 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.
- 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.
Dengan 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 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 dalam urutan yang ditentukan 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
. Untuk mempelajari lebih lanjut, lihat contoh di atas
dalam Menentukan grup volume.
Tingkat volume saat ini untuk setiap zona dipertahankan untuk pengguna yang terkait dengan zona tersebut. Setelan ini bersifat 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 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 utama ini diproses oleh
CarAudioService
, yang kemudian memanggil setGroupVolume
atau setMasterMute
, sesuai
kebutuhan. 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 dituju dan diasumsikan semuanya dikaitkan dengan zona
audio utama. Saat peristiwa tombol volume diterima, CarAudioService
menentukan
grup volume mana yang akan disesuaikan dengan mengambil konteks audio untuk pemain
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. 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)
menggeser 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 depan (+) atau belakang (-) mobil.- 0,0 berada di tengah
- +1.0 adalah sepenuhnya maju
- -1.0 sepenuhnya ke belakang
- Nilai di luar rentang -1 hingga 1 adalah error
Anda memutuskan cara menerapkan nilai ini dan cara menampilkan nilai kepada pengguna. Aturan 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 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 terdengar lebih jelas. Di AAOS, penurunan audio diimplementasikan oleh HAL. Android tidak memiliki kontrol atas suara di luar OS. Di Android 11, informasi utama yang tersedia untuk HAL guna membuat keputusan peredam adalah apakah dua perangkat output memiliki streaming aktif atau tidak.
Kapan harus menunduk
Meskipun setiap OEM dapat menentukan cara penanganan peredam suara oleh HAL, sebaiknya gunakan panduan berikut.
Beberapa streaming yang diputar di Android biasanya terjadi saat dua aplikasi atau layanan secara bersamaan memegang fokus audio. Untuk mempelajari kapan Android dapat memberikan fokus serentak, lihat matriks interaksi di Jenis batasan. Dengan diperkenalkannya plugin audio mobil, hal ini juga bergantung pada pengelolaan AudioFocus Anda.
Semua streaming yang digabungkan oleh Android dilakukan sebelum penguatan 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 mencampurnya.
Perilaku penyembunyian yang direkomendasikan
Berikut adalah potensi interaksi serentak yang direkomendasikan untuk di-duck.
Interaksi | Tindakan |
---|---|
EMERGENCY
| Meredam atau membisukan semua kecuali SAFETY
|
SAFETY |
Menyembunyikan semua kecuali EMERGENCY |
NAVIGATION |
Menyembunyikan semua kecuali SAFETY dan EMERGENCY |
CALL |
Menyembunyikan semua kecuali SAFETY , EMERGENCY ,
dan NAVIGATION |
VOICE |
Bebek CALL_RING |
VEHICLE_SOUNDS |
Anda menentukan tingkat kepentingan suara aktif dan apakah suara tersebut meredam suara lain atau tidak. |
MUSIC dan ANNOUNCEMENT |
Menghindari semua hal. Pengecualian adalah nada interaksi sentuh yang diputar sebagai
SYSTEM_SOUND .
|
Pertimbangan saat menunduk
Beberapa aplikasi dan layanan, seperti navigasi atau asisten, mungkin menggunakan beberapa pemain untuk melakukan tindakan. Hindari penghentian yang agresif saat aliran data berhenti mengalir melalui perangkat output untuk memastikan media tidak kembali ke volume penuh sebelum dibisukan sebelum pemutaran berikutnya dari navigasi atau aplikasi asisten dimulai.
Untuk kendaraan dengan beberapa panggung suara dengan isolasi yang cukup baik, Anda dapat me-rutekan audio ke berbagai area mobil, bukan dengan meredam. Misalnya, petunjuk navigasi dapat diarahkan ke speaker headrest 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 yang penting untuk keselamatan diprioritaskan daripada suara lainnya. Jika HAL mempertahankan fokus
audio untuk USAGE_EMERGENCY
, tidak ada jaminan bahwa aplikasi dan layanan dari
Android tidak akan memutar suara. HAL menentukan streaming mana dari Android yang harus
dicampur atau dibisukan untuk memutar suara yang sangat penting bagi keselamatan.
Mengonfigurasi UI setelan volume
AAOS memisahkan UI setelan volume dari konfigurasi grup volume. Hal ini dapat di-overlay seperti yang dijelaskan dalam Mengonfigurasi peningkatan 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 (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 dalam 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 matc 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 jumlah kontrol yang harus digambar.getGroupMinVolume()
dangetGroupMaxVolume()
untuk mendapatkan batas bawah dan atas.getGroupVolume()
untuk mendapatkan volume saat ini.registerVolumeChangeObserver()
untuk menerima notifikasi tentang perubahan volume.
Peristiwa grup volume mobil
Kasus penggunaan otomotif untuk pembaruan volume dan tombol bisu memiliki dasar kontekstual yang dapat menentukan tindakan aplikasi tertentu, seperti setelan volume. Callback volume dan bisukan saat ini dari stack audio mobil memberikan informasi kontekstual terbatas. Untuk melayani kasus penggunaan otomotif dan skalabilitas mendatang dengan lebih baik, CarVolumeGroupEvent ditambahkan ke Android 14. Setiap peristiwa memiliki tiga jenis informasi penting:
- Daftar
CarVolumeGroupInfo
EventTypes
(bit-mapped)- Daftar
ExtraInfos
CarVolumeGroupInfo
Penerima callback peristiwa memiliki akses siap pakai 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 disediakan sebagai bagian dari EventTypes
, seperti yang dijelaskan di bawah.
EventTypes
Menentukan aspek CarVolumeGroupInfo
yang telah berubah. Aplikasi dapat menggunakannya untuk
mengidentifikasi perubahan dan mengambil tindakan yang diperlukan. Misalnya,
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
menunjukkan bahwa
indeks penguatan 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 CarVolumeGroup
berubah. Aplikasi
dapat menggunakan informasi ini untuk memberikan konteks tambahan guna memberi tahu pengguna
untuk bertindak atau memberi tahu. Misalnya, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
menunjukkan atenuasi transien aktif karena beban berlebih termal. Aplikasi
dapat memberi tahu pengguna jika mereka mencoba meningkatkan volume.
Kami tidak menerapkan proses apa pun untuk ExtraInfos
. Anda dapat menentukan prosesnya berdasarkan ExtraInfos
. Misalnya, jika atenuasi
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 peredam suara aktif dan memungkinkan pengguna
mengubah volume.
Framework audio mobil bergantung pada IAudioGainCallback
HAL AudioControl untuk
memberikan ExtraInfos
yang disarankan. Untuk mempelajari lebih lanjut, lihat
Callback Gain Audio.
CarVolumeGroupEvent
diskalakan untuk memenuhi kebutuhan framework audio mobil di masa mendatang. Kami
bermaksud mendukung fitur baru hanya melalui CarVolumeGroupEvent
. Sebaiknya
developer aplikasi menggunakan CarVolumeGroupEvent
untuk menangani
perubahan volume grup dan bisukan.
Callback peristiwa grup volume mobil
Android 14, menyediakan callback baru untuk aplikasi dengan hak istimewa dan
platform untuk mendaftar dan diberi tahu tentang CarVolumeGroupEvents
.
Untuk mendaftarkan callback, gunakan
CarAudioManager#registerCarVolumeGroupEventCallback()
Untuk membatalkan pendaftaran callback, gunakan
CarAudioManager#unregisterCarVolumeGroupEventCallback()
Jika aplikasi mendaftar dengan CarVolumeGroupEventCallback
baru dan CarVolumeCallback
lama, CarVolumeGroupEventCallbacks
peristiwa akan diprioritaskan.
Stack audio mobil tidak lagi memicu CarVolumeCallback
. Hal ini mencegah pemicu duplikat ke aplikasi yang sama untuk peristiwa yang sama.
Sebaiknya gunakan CarVolumeGroupEventCallback
untuk mengelola
perubahan volume grup dan bisukan.
Callback gain audio
Mulai Android 13, AudioControl HAL dapat memicu callback asinkron untuk mengelola pembaruan level 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 menyertakan daftar alasan dan
AudioGainConfigInfo
masing-masing, yang terdiri dari:
- ID Zona
- Alamat port perangkat
- Volume index > index dapat berupa indeks terbatas atau indeks pembaruan.
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 pembatasan
yang didukung:
- Bisukan
- Pemblokiran
- Batasan
- Atenuasi
Batasan aktif | Perubahan volume yang dipicu pengguna | Tombol bisukan yang dipicu pengguna |
---|---|---|
Bisukan | ❌ | ❌ (nonaktifkan bisukan) ✔ (aktifkan bisukan) |
Pemblokiran | ❌ | ✔ |
Batasan | ❌ (melebihi batas) ✔ (di bawah batas) |
✔ |
Atenuasi | ✔ | ✔ |
Prioritas antara batasan adalah Bisukan > Pemblokiran > Batasan > Reduksi.
Pembatasan bisukan
Batasan bisukan adalah:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Framework audio mobil secara internal mempertahankan dua status bisu ini:
Pengguna dibisukan. Diaktifkan berdasarkan permintaan dari pengguna, baik melalui
CarAudioManager
atau peristiwa utama.Bisukan HAL. Diaktifkan berdasarkan batasan bisukan yang diterima melalui callback
AudioGain
.
Untuk pemroses seperti aplikasi Setelan, status bisukan
keseluruhan grup volume (CarVolumeGroupInfo.isMuted()
) akan didasarkan pada apakah salah satu
bisukan di atas diaktifkan.
Saat bisukan HAL diaktifkan, semua permintaan perubahan volume masuk dan bisukan grup akan diabaikan selama durasi pembatasan.
Kasus interaksi: Bisukan HAL aktif dan Pengguna meminta tombol Bisukan
Jika bisukan HAL diaktifkan dan Bisukan pengguna dinonaktifkan:
- Status bisukan keseluruhan grup volume diubah menjadi
true
. - Permintaan dari Pengguna untuk mengaktifkan bisukan akan diproses.
- Alasan: Permintaan bisukan pengguna harus selalu dihormati untuk menjaga privasi pengguna.
Jika bisukan HAL diaktifkan dan Bisukan pengguna diaktifkan:
Status bisukan keseluruhan grup volume diubah menjadi
true
.Permintaan dari Pengguna untuk menonaktifkan bisukan akan
NOT
diproses. Status bisukan Pengguna dalam cache tetap diaktifkan.Alasan: Permintaan pengguna untuk mengaktifkan suara hanya akan disetujui jika tidak ada batasan aktif.
Alasan: Membatalkan bisukan Pengguna yang di-cache dapat menyebabkan ledakan suara yang tidak disengaja dan membahayakan keselamatan pengguna. Hal ini terutama berlaku jika status bisu diaktifkan di seluruh siklus pengapian yang menurunkan kesadaran pengguna terhadap persepsi tingkat suara.
Kasus interaksi: Bisukan HAL diaktifkan dan dinonaktifkan saat Bisukan pengguna tidak mengalami perubahan
Mengalihkan bisukan HAL akan mengubah status bisukan keseluruhan grup volume. Namun, tindakan ini tidak langsung memperbarui status bisukan pengguna. Saat Bisukan pengguna dinonaktifkan dan callback bisukan HAL untuk mengaktifkan diterima:
- Status bisukan keseluruhan grup volume diubah menjadi
true
. Permintaan dari Pengguna untuk mengubah volume akan
NOT
diproses saat bisu HAL diaktifkan.Alasan: Pengguna tidak dapat mendengar suara saat mode bisu diaktifkan. Mengizinkan perubahan volume dapat menyebabkan ledakan suara dan membahayakan keamanan pengguna.
Alasan: Aplikasi volume dapat mendaftar untuk callback dan memicu bisukan (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) secara otomatis tanpa intervensi pengguna, jika ini adalah perilaku yang diharapkan oleh OEM.
Jika bisukan HAL dinonaktifkan saat bisukan Pengguna dinonaktifkan:
Status bisukan grup volume diubah menjadi
false
.Alasan: Membuat status bisukan melekat dan meminta Pengguna untuk membunyikan dapat mengganggu Pengguna secara tidak perlu saat status bisukan sering beralih.
Permintaan dari pengguna untuk mengubah volume akan diproses seperti biasa.
Pemblokiran
Pembatasan pemblokiran adalah:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
Jika Batasan pemblokiran aktif, permintaan dari pengguna untuk:
- Perubahan volume tidak akan diproses.
- Tombol bisukan diproses.
Batasan
Batasan batasan adalah:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Jika pembatasan Batasan aktif, permintaan dari pengguna untuk:
Mengubah volume:
- Dalam Batasan diproses
- Batasan di atas tidak diproses
Tombol bisukan diproses.
Atenuasi
Batasan atenuasi adalah:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Saat batasan Attenuation aktif, permintaan dari pengguna untuk:
Perubahan volume diproses. Level volume saat ini yang baru disetel ke volume yang dilemahkan (bukan ke volume sebelumnya). Perubahan volume mendatang dilakukan dari level ini.
Tombol bisukan diproses.
Memperbarui ke indeks
Berikut ini dianggap sebagai pembaruan indeks volume asinkron:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Dengan alasan ini, AudioControl HAL dapat memperbarui indeks saat ini grup volume
ke indeks yang ditentukan. 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 gain volume dan dikirim ke Audio HAL.
Implementasi vendor
Audio HAL
menerima penguatan volume baru dan memperbarui sistem audio (seperti amp eksternal).Sistem audio merespons bahwa level volume hanya diperbarui ke indeks 15 (karena alasan yang tidak diketahui Android).
Implementasi vendor pemicu
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, masukan asinkron sistem audio memperbarui indeks menjadi 15.
Kasus penggunaan: Pemutaran audio pertama setelah keluar dari penangguhan
Indeks volume sebelum ditangguhkan ditetapkan ke tingkat tinggi 95 (rentang: [0-99]).
Android memasuki mode ditangguhkan.
Setelah Android ada, tunda (misalnya, lanjutkan):
Vendor
Audio HAL/AudioControl HAL
menerapkan indeks aman 30 ke sistem audio secara lokal.Vendor
AudioControl HAL
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 penangguhan adalah 95. Namun, setelah dilanjutkan, indeks ini ditetapkan ke level volume aman 30 oleh implementor
AudioControl HAL
.
Konfigurasi volume dinamis
Untuk fitur ini, kami mempertimbangkan kasus penggunaan utama berikut:
Konfigurasi akhir siklus proses (EOL) kendaraan.
Produsen mobil lebih memilih untuk mengupdate konfigurasi volume pada 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 semakin meningkat untuk fitur audio berbasis permintaan, tempat pengguna berlangganan pemrosesan sinyal yang ditingkatkan selama jangka waktu tertentu. Konfigurasi rentang volume baru valid selama durasi langganan.
Desain
Konfigurasi volume dinamis dicapai dalam tiga tahap:
Penemuan. Implementasi HAL AudioControl vendor menemukan update rentang volume baru melalui mekanisme IPC kustom yang dimiliki oleh vendor.
Setelah ditemukan, callback akan dibuat melalui
AudioControl::IModuleChangeCallback
.Update. 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, level default yang disediakan oleh vendor selama callback.
Callback.
Setelah pembaruan rentang grup volume, stack audio mobil akan memicu callback ke aplikasi yang terdaftar melalui
CarVolumeGroupEventCallback
.CarVolumeGroupEvent
membawaCarVolumeGroupInfo
yang diperbarui, Jenis peristiwa (apa yang berubah) dan Info tambahan (alasan perubahannya).
Gambar 1. 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 AudioPorts |
Urutan
Diagram urutan konfigurasi volume dinamis ditampilkan di bawah.
Gambar 2. Diagram urutan untuk konfigurasi volume dinamis.
Aspek utama
Untuk mengoptimalkan fitur ini, pertimbangkan hal berikut.
AudioPorts yang disediakan sebagai bagian dari callback harus cocok dengan definisi BUS Otomotif:
- Port perangkat.
IN_DEVICE
,OUT_DEVICE
- Koneksi.
BUS
- Address. Ditentukan dalam definisi HAL Audio
- Mode gain.
JOINT
- Port perangkat.
Vendor harus menentukan superset definisi rentang volume dalam kebijakan HAL Audio dan menggunakan callback untuk menyesuaikannya dengan varian kendaraan. Lihat definisi AIDL
IModuleChangeCallbac
untuk mengetahui informasi selengkapnya.Jika ada lebih dari satu BUS audio yang 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.