Pengelolaan volume terdapat di CarAudioService
, yang menggunakan volume tetap
dengan ekspektasi bahwa volume diterapkan di bawah HAL oleh hardware
{i>amplifier<i} dan bukan pada perangkat lunak. CarAudioService
mengatur perangkat output
ke dalam kelompok volume untuk menerapkan keuntungan yang
sama ke semua perangkat yang terkait dengan
kelompok volume.
Volume tetap
Implementasi AAOS menggunakan amplifier hardware untuk mengontrol volume
mixer software. Untuk menghindari efek samping, tetapkan tanda 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 dengan aliran data
ketik di mixer
perangkat lunak. Hal ini mungkin tidak selalu
diinginkan karena potensi
efek pada aplikasi lain dan fakta bahwa redaman volume dalam mixer software
dapat menghasilkan bit signifikan yang lebih
sedikit tersedia dalam sinyal ketika diterima oleh
penguat (amplifier) perangkat keras.
Grup volume
Grup volume mengelola volume untuk koleksi perangkat dalam audio zona waktu. Untuk setiap grup volume, volume dapat dikontrol secara terpisah. Tujuan keuntungan 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
untuk alamat internal dan eksternal. Alamat harus sesuai dengan perangkat {i>
output<i} yang ditentukan dalam
audio_policy_configuration.xml
.
Mengonfigurasi peningkatan 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
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 keuntungan dari perangkat, lalu mengonfigurasi 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.
Dengan mempertimbangkan cara nilai-nilai ini dikonfigurasi, kita bisa mengatur penguatan grup volume di luar rentang yang didukung untuk perangkat yang terkait dengan volume ras. Dalam hal ini, untuk perangkat tersebut, penguatan ditetapkan ke nilai minimum atau nilai perolehan maksimum berdasarkan apakah nilai grup volume di bawah atau di atas rentang tersebut.
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
kelompok volume
di zona tersebut. Dengan cara ini, ID grup volume tidak unik
lintas zona. ID ini digunakan untuk CarAudioManager
API yang terkait
dengan kelompok volume. Semua API yang menggunakan groupId
tanpa zoneId
secara default disetel ke zona audio utama.
Pengelolaan volume multi-zona
Setiap zona audio diharapkan memiliki satu atau beberapa grup volume, dan setiap volume
hanya terkait dengan satu zona audio. Hubungan ini didefinisikan
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 berlaku khusus zona, artinya jika pengguna login di tampilan yang terkait dengan zona utama, lalu login ke zona yang terkait dengan zona audio sekunder, tingkat volume yang dimuat dan dipertahankan selama zona pertama berbeda dengan zona untuk 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 akan merutekan peristiwa utama volume ke aplikasi. Otomotif
harus memaksa peristiwa tombol ini diproses oleh
CarAudioService
, yang kemudian memanggil setGroupVolume
atau setMasterMute
, sebagai
yang sesuai. Untuk memaksa perilaku ini, setel atribut
config_handleVolumeKeysInWindowManager
flag untuk true
:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
Peristiwa tombol volume saat ini tidak memiliki cara untuk membedakan zona mana
fungsi tersebut dimaksudkan dan
diasumsikan bahwa semua terkait dengan
zona audio lainnya. Saat peristiwa tombol volume diterima, CarAudioService
akan menentukan
grup volume mana yang akan disesuaikan dengan mengambil konteks audio untuk
pemutar, lalu menyesuaikan grup volume yang berisi perangkat output
yang dikaitkan dengan konteks audio
dengan prioritas tertinggi. Prioritasnya adalah
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
di dalam kendaraan. API sistem yang sesuai untuk nilai penerusan CarAudioManager
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 tersisa sepenuhnya
- Nilai di luar rentang -1 sampai 1 adalah kesalahan
setFadeTowardFront(float value)
menggeser volume speaker ke arah depan (+) atau belakang (-) mobil.- 0,0 berada di tengah
- +1.0 sepenuhnya maju
- -1.0 sepenuhnya ke belakang
- Nilai di luar rentang -1 sampai 1 adalah kesalahan
Anda memutuskan bagaimana nilai-nilai ini harus diterapkan dan bagaimana menampilkan nilai-nilai tersebut pengguna. Strategi ini dapat diterapkan hanya pada media atau pada semua orang Suara Android. Android 11 juga memperkenalkan dukungan untuk menerapkan efek audio ke perangkat output. Dengan demikian, sangat mungkin atau mengelola pudar dan keseimbangan melalui efek audio pada video perangkat output, bukan melalui API ini.
Pengecilan volume audio
Pengecilan volume audio terjadi saat kendaraan mengurangi penguatan untuk satu streaming sehingga {i>stream<i} lain yang diputar bersamaan dapat didengar dengan lebih jelas. Pada AAOS, pengecilan volume audio diimplementasikan oleh HAL. Android tidak memiliki kontrol atas suara di luar OS. Di Android 11, informasi utama yang tersedia bagi HAL untuk membuat keputusan pengecilan volume adalah apakah dua output perangkat keduanya memiliki aliran yang aktif.
Kapan harus mengecil
Meskipun setiap OEM bebas untuk menentukan cara penanganan pengecilan volume oleh HAL, kami merekomendasikan panduan berikut.
Beberapa streaming yang diputar di Android biasanya terjadi saat dua aplikasi atau layanan secara serentak menahan fokus audio. Untuk mengetahui kapan Android dapat memberikan izin serentak fokus, lihat matriks interaksi di Jenis pembatasan. Dengan diperkenalkannya plugin audio mobil, hal ini juga bergantung pada Pengelolaan AudioFocus.
Setiap streaming yang digabungkan oleh Android dilakukan sebelum keuntungan apa pun diterapkan. Dengan demikian, streaming apa pun yang harus dikecilkan saat diputar bersamaan dengan yang lain harus dirutekan ke perangkat {i> output<i} terpisah sehingga HAL dapat menerapkan pengecilan volume sebelum mencampurnya.
Perilaku pengecilan volume yang direkomendasikan
Berikut ini adalah potensi pengecilan volume interaksi serentak yang direkomendasikan.
Interaksi | Tindakan |
---|---|
EMERGENCY
| Bebek atau membisukan semuanya kecuali SAFETY
|
SAFETY |
Bebek semuanya kecuali EMERGENCY |
NAVIGATION |
Bebek semuanya kecuali SAFETY dan EMERGENCY |
CALL |
Bebek semuanya kecuali SAFETY , EMERGENCY ,
dan NAVIGATION |
VOICE |
Bebek CALL_RING |
VEHICLE_SOUNDS |
Anda menentukan pentingnya suara aktif dan apakah suara tersebut mengurangi suara lainnya. |
MUSIC dan ANNOUNCEMENT |
Dikurangi oleh semuanya. Pengecualian adalah nada interaksi sentuh yang dimainkan sebagai
SYSTEM_SOUND .
|
Pertimbangan saat mengecilkan
Beberapa aplikasi dan layanan, seperti navigasi atau asisten, mungkin menggunakan beberapa pemain untuk melakukan tindakan. Menghindari pengurangan nilai yang agresif saat aliran data berhenti mengalir melalui perangkat {i>output<i} untuk memastikan media tidak kembali penuh sebelum diperkecil sebelum 3 pemutaran berikutnya dari navigasi atau aplikasi asisten dimulai.
Untuk kendaraan dengan beberapa panggung suara dengan isolasi yang cukup baik, Anda dapat mengarahkan audio ke area yang berbeda di mobil, bukan mengecilkan volume. Misalnya, petunjuk navigasi dapat dirutekan ke speaker {i>headrest<i} pengemudi saat terus memutar musik di seluruh kabin dengan volume normal.
Suara keselamatan yang penting
Android 11 diperkenalkan
API fokus audio HAL. HAL memastikan
suara yang penting bagi keselamatan diprioritaskan daripada suara lainnya. Jika HAL menyimpan audio
untuk USAGE_EMERGENCY
, tidak ada jaminan bahwa aplikasi dan layanan dari
Android tidak akan memutar suara. HAL menentukan aliran mana dari Android yang harus
dicampur atau dibisukan untuk memutar suara yang penting bagi keselamatan.
Mengonfigurasi UI setelan volume
AAOS memisahkan UI setelan volume dari konfigurasi grup volume. Iklan ini dapat ditempatkan seperti dijelaskan di Mengonfigurasi peningkatan grup volume. Pemisahan ini memastikan bahwa tidak diperlukan perubahan apa pun 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 masing-masing
menentukan AudioAttributes.USAGE
. File ini memberikan rendering yang wajar
dari VolumeGroups
yang ditentukan dengan menggunakan resource yang terkait dengan
penggunaan yang ada dalam setiap VolumeGroup
.
Misalnya, contoh berikut menentukan VolumeGroup
sebagai menyertakan
voice_communication
dan voice_communication_signalling
. Default
implementasi UI setelan mobil merender VolumeGroup
menggunakan
resource yang terkait dengan voice_communication
karena itu adalah matriks 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 yang digunakan
CarAudioManager API berbasis VolumeGroup
berikut ini:
getVolumeGroupCount()
untuk mempelajari jumlah 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 pada update volume dan tombol bisukan memiliki konteks kontekstual dasar-dasar yang dapat menentukan tindakan aplikasi tertentu, seperti volume setelan. Callback volume dan membisukan audio saat ini dari stack audio mobil yang disediakan informasi kontekstual yang terbatas. Untuk melayani kasus penggunaan otomotif dan masa depan dengan lebih baik skalabilitas, CarVolumeGroupEvent ditambahkan ke Android 14. Setiap peristiwa membawa tiga jenis informasi penting:
- Daftar
CarVolumeGroupInfo
EventTypes
(dipetakan bit)- Daftar
ExtraInfos
InfoGrupVolume
Penerima callback peristiwa memiliki akses yang sudah siap ke daftar mobil yang terpengaruh
informasi grup volume. Artinya, aplikasi tidak perlu membuat
panggilan tambahan ke framework Audio mobil untuk mendapatkan status terbaru. Aplikasi ini dapat
cukup gunakan CarVolumeGroupInfos
yang diterima untuk mengupdate UI atau
negara bagian. Untuk memudahkan aplikasi, aspek yang berubah dalam volume mobil
grup juga disediakan sebagai bagian dari EventTypes
, seperti yang dijelaskan di bawah.
EventType
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 nilai
Indeks peningkatan volume maksimum CarVolumeGroups
telah berubah dan dapat dikueri dengan
CarVolumeGroupInfo.getMaxVolumeGainIndex()
.
Tabel berikut menunjukkan hubungan antara EventType
dan
CarVolumeGroupInfo
.
Jenis Peristiwa | InfoGrupVolume |
---|---|
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.isBisukan() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED | CarVolumeGroupInfo.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED | CarVolumeGroupInfo.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED | CarVolumeGroupInfo.getAudioAttributes() |
Info Tambahan
Memberikan informasi tambahan tentang alasan CarVolumeGroup
berubah. Aplikasi
dapat menggunakan informasi ini untuk memberikan konteks tambahan baik untuk memperingatkan pengguna
bertindak atau memberitahu. Misalnya, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
menunjukkan atenuasi transien aktif
karena kelebihan beban termal. Aplikasi
dapat memberi tahu pengguna jika
mereka mencoba meningkatkan volume.
Kami tidak menerapkan proses apa pun untuk ExtraInfos
. Keputusan ini tergantung pada kebijakan Anda
untuk menentukan proses berdasarkan ExtraInfos
. Misalnya, jika atenuasi
aktif karena EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
, Anda juga dapat memilih untuk
memudarkan UI panel volume terlebih dahulu untuk mencegah pengguna mengubah volume.
Lainnya mungkin memilih untuk menampilkan toast bahwa pengecilan volume aktif dan memungkinkan pengguna
untuk mengubah volume.
Framework audio mobil bergantung pada IAudioGainCallback
AudioControl HAL untuk
berikan ExtraInfos
yang disarankan. Untuk mempelajari lebih lanjut, lihat
Callback Perolehan Audio.
CarVolumeGroupEvent
melakukan penskalaan untuk memenuhi kebutuhan framework audio mobil di masa mendatang. Rab
bermaksud mendukung fitur baru melalui CarVolumeGroupEvent
hanya. Rab
sangat menyarankan agar developer aplikasi menggunakan CarVolumeGroupEvent
untuk menangani
perubahan volume grup dan membisukan audio.
Callback peristiwa grup volume mobil
Android 14, menyediakan callback baru untuk dilindungi dan
aplikasi platform Anda untuk mendaftar dan diberi notifikasi tentang CarVolumeGroupEvents
.
Untuk mendaftar callback, gunakan
CarAudioManager#registerCarVolumeGroupEventCallback()
Untuk membatalkan pendaftaran callback, gunakan
CarAudioManager#unregisterCarVolumeGroupEventCallback()
Jika aplikasi mendaftar dengan CarVolumeGroupEventCallback
baru dan versi lama
CarVolumeCallback
, peristiwa CarVolumeGroupEventCallbacks
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 membisukan audio.
Callback perolehan audio
Mulai Android 13, AudioControl HAL dapat memicu callback asinkron untuk mengelola pembaruan level volume karena perubahan sistem audio mobil.
API HAL
AudioControl @2.0 AIDL
Versi 2.0 AudioControl AIDL HAL menambahkan API berikut:
API | Tujuan |
---|---|
IAudioControl#registerGainCallback |
Mendaftarkan instance IAudioGainCallback dengan AudioControl HAL. |
IAudioGainCallback#onAudioDeviceGainsChanged |
Callback asinkron untuk memberitahukan perubahan pada konfigurasi perolehan audio. |
Callback AudioControl HAL menyertakan daftar alasan dan masing-masing
AudioGainConfigInfo
, yang terdiri dari:
- ID Zona
- Alamat port perangkat
- Indeks volume > indeks dapat berupa indeks terbatas atau indeks pembaruan.
Alasan dapat dikategorikan secara luas sebagai:
- Alasan pembatasan. Perubahan sementara pada perilaku suara dan volume.
- Alasan pembaruan. Perubahan permanen pada perilaku volume.
Jenis pembatasan
Mulai AudioControl
HAL AIDL
V3
, berikut adalah jenis yang didukung
batasan:
- Bisukan
- Pemblokiran
- Batasan
- Atenuasi
Batasan aktif | Perubahan volume yang dipicu pengguna | Tombol bisukan yang dipicu pengguna |
---|---|---|
Bisukan | ❌ | ❌ (bunyikan) ✔ (bisukan) |
Pemblokiran | ❌ | ✔ |
Batasan | ❌ (melebihi batas) ✔ (di bawah batas) |
✔ |
Atenuasi | ✔ | ✔ |
Prioritas di antara pembatasan adalah Bisukan > Pemblokiran > Batasan > Atenuasi.
Pembatasan bisukan audio
Batasan bisukan audio adalah:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Framework audio mobil secara internal mempertahankan dua status bisukan ini:
Penonaktifan pengguna. Dialihkan berdasarkan permintaan pengguna, baik melalui
CarAudioManager
atau peristiwa utama.Bisukan HAL. Dialihkan berdasarkan pembatasan pembisuan suara yang diterima melalui
AudioGain
.
Untuk pemroses seperti aplikasi Setelan, membisukan audio grup volume secara keseluruhan
(CarVolumeGroupInfo.isMuted()
) akan didasarkan pada apakah salah satu
pembisuan di atas diaktifkan.
Saat pembisuan HAL diaktifkan, semua volume yang masuk akan berubah dan pembunyian grup permintaan akan diabaikan selama durasi pembatasan.
Kasus interaksi: Penonaktifan HAL aktif dan Pengguna meminta tombol Bisukan
Saat pembisuan HAL diaktifkan dan Penonaktifan pengguna dinonaktifkan:
- Status bisukan keseluruhan grup volume diubah menjadi
true
. - Permintaan dari Pengguna untuk mengaktifkan penonaktifan akan diproses.
- Alasan: Permintaan penonaktifan dari pengguna harus selalu dipenuhi untuk menjaga privasi pengguna.
Saat pembisuan HAL diaktifkan dan Penonaktifan pengguna diaktifkan:
Status bisukan keseluruhan grup volume diubah menjadi
true
.Permintaan dari Pengguna untuk menonaktifkan pembisuan akan
NOT
diproses. Pengguna dalam Cache tetap aktif.Alasan: Permintaan bunyikan pengguna hanya akan dipenuhi jika tidak ada pembatasan aktif.
Alasan: Membisukan audio pengguna yang di-cache dapat menyebabkan ledakan suara yang tidak diinginkan dan membahayakan keselamatan pengguna. Hal ini terutama berlaku jika status bisukan diaktifkan melintasi siklus pengapian yang mengurangi kesadaran akan level suara persepsi Anda.
Kasus interaksi: Bisukan HAL diaktifkan dan dinonaktifkan saat Penonaktifan pengguna tidak memiliki perubahan
Mengalihkan HAL bisukan akan mengubah status nonaktif grup volume secara keseluruhan. Namun demikian, tidak secara langsung memperbarui status bisu pengguna. Saat pembisuan Pengguna dinonaktifkan dan HAL mute yang diaktifkan diterima:
- Status bisukan keseluruhan grup volume diubah menjadi
true
. Permintaan dari Pengguna untuk mengubah volume akan
NOT
diproses saat penonaktifan HAL diaktifkan.Alasan: Pengguna tidak dapat merasakan suara saat pembisuan diaktifkan. Mengizinkan perubahan volume dapat mengakibatkan ledakan suara dan membahayakan keselamatan pengguna.
Alasan: Aplikasi volume dapat mendaftar untuk callback dan memicu pembunyian (CarAudioManager.setVolumeGroupBisukan(...,/* mute=*/ true,..)) secara otomatis tanpa intervensi pengguna, jika ini adalah perilaku yang diharapkan oleh OEM.
Jika pembisuan HAL dinonaktifkan saat Bisukan pengguna dinonaktifkan:
Status bisukan grup volume diubah menjadi
false
.Alasan: Membuat status bisukan melekat dan meminta Pengguna untuk membunyikan menginterupsi Pengguna secara tidak perlu saat status bisukan sering beralih.
Permintaan dari pengguna untuk mengubah volume akan diproses seperti biasa.
Pemblokiran
Batasan pemblokiran adalah:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
Saat Pembatasan pemblokiran aktif, permintaan dari pengguna untuk:
- Perubahan volume tidak akan diproses.
- Membisukan/Membunyikan audio diproses.
Batasan
Batasan batasan adalah:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Saat Pembatasan batasan aktif, permintaan dari pengguna untuk:
Mengubah volume:
- Dalam Batasan diproses
- Di Atas Batasan tidak diproses
Membisukan/Membunyikan audio diproses.
Atenuasi
Batasan reduksi adalah:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Jika pembatasan Attenuasi aktif, permintaan dari pengguna untuk:
Perubahan volume akan diproses. Tingkat volume baru saat ini diatur ke volume yang dilemahkan (bukan ke volume sebelumnya). Perubahan volume mendatang dilakukan dari level ini.
Membisukan/Membunyikan audio diproses.
Perbarui ke indeks
Berikut ini dianggap sebagai update indeks volume asinkron:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Dengan alasan ini, AudioControl HAL dapat memperbarui indeks grup volume saat ini
ke indeks yang ditentukan. Ini terutama digunakan sebagai umpan balik dari sistem audio
untuk permintaan perubahan volume dari framework Audio mobil. Pembaruan indeks adalah
juga dikomunikasikan dengan Aplikasi sebagai callback CarVolumeGroupEvent
untuk menyinkronkan
pada indeks.
Contoh
Kasus Penggunaan: Pengguna mengupdate indeks volume ke 30
Pengguna menggunakan aplikasi Volume untuk mengubah indeks volume ke 30.
Indeks ini dikonversi menjadi penguatan volume dan dikirim ke Audio HAL.
Implementasi vendor
Audio HAL
menerima peningkatan dan update volume baru sistem audio (seperti amp eksternal).Sistem audio merespons bahwa level volume hanya diperbarui ke indeks 15 (untuk alasan yang tidak diketahui oleh Android).
Implementasi vendor dari 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 akan memperbarui indeks ke 15.
Kasus penggunaan: Pemutaran audio pertama setelah keluar dari penangguhan
Indeks volume sebelum penangguhan disetel ke level tinggi 95 (rentang: [0-99]).
Android memasuki mode penangguhan.
Setelah Android tersedia, penangguhan (misalnya, lanjutkan):
Vendor
Audio HAL/AudioControl HAL
menerapkan indeks aman sebesar 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 akan menyinkronkan indeks. Indeks volume sebelum penangguhan adalah 95. Namun, setelah dilanjutkan, indeks ini disetel ke level volume aman 30 oleh pengimplementasi
AudioControl HAL
.
Konfigurasi volume dinamis
Untuk fitur ini, kami mempertimbangkan kasus penggunaan utama berikut:
Konfigurasi end-of-line (EOL) kendaraan.
Produsen mobil lebih memilih untuk memperbarui konfigurasi volume di EOL berdasarkan kendaraan penyiapan sistem audio. Biasanya, ini adalah sideload tanpa memperbarui Image Android SW.
Pembuat mobil mungkin perlu memperbarui konfigurasi volume selama jadwal layanan.
Konfigurasi runtime. Dukungan sistem audio otomotif eksternal konfigurasi {i>amplifier<i} dan ECU ini dapat menjadi {i>host<i} rentang volume konfigurasi yang dikueri selama waktu booting.
Konfigurasi on-demand. Ditawarkan untuk mendukung peningkatan kebutuhan akan fitur audio berbasis permintaan di mana pengguna berlangganan sinyal yang ditingkatkan selama jangka waktu tertentu. Konfigurasi rentang volume baru berlaku selama durasi langganan.
Desain
Konfigurasi volume dinamis dicapai dalam tiga tahap:
Penemuan. Implementasi HAL vendor AudioControl menemukan volume baru rentang pembaruan melalui mekanisme IPC khusus yang dimiliki oleh vendor.
Setelah ditemukan, callback akan dibuat melalui
AudioControl::IModuleChangeCallback
.Perbarui. Stack audio mobil memperbarui status grup volume dengan rentang volume tertentu.
Upaya dilakukan untuk mempertahankan tingkat volume yang sama setelah pembaruan rentang volume. Namun, jika indeks berada di luar batas, indeks volume saat ini akan disetel ke dengan nilai yang aman. Misalnya, level {i>default<i} yang disediakan oleh vendor selama callback.
Callback.
Setelah pembaruan rentang grup volume, stack audio mobil akan memicu callback ke aplikasi yang didaftarkan melalui
CarVolumeGroupEventCallback
.CarVolumeGroupEvent
membawaCarVolumeGroupInfo
yang diupdate, Jenis peristiwa (apa yang berubah) dan Extra-info (mengapa bisa berubah).
Gambar 1. Konfigurasi volume dinamis.
API HAL
AudioControl @ AIDL 3.0
Versi 3.0 AudioControl AIDL HAL memperkenalkan API berikut:
API | |
---|---|
IAudioControl#setModuleChangeCallback | Menetapkan instance IModuleChangeCallback dengan AudioControl HAL. |
IAudioControl#clearModuleChangeCallback | Mengosongkan instance IModuleChangeCallback yang sebelumnya disetel dengan HAL AudioControl. |
IModuleChangeCallback#onAudioPortsDiubah | Callback untuk memberi tahu perubahan pada AudioPorts |
Urutan
Diagram urutan konfigurasi volume dinamis ditampilkan di bawah ini.
Gambar 2. 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 Automotive Definisi BUS:
- Port perangkat.
IN_DEVICE
,OUT_DEVICE
- Koneksi.
BUS
- Alamat. Ditetapkan dalam definisi HAL Audio
- Mode Dapatkan.
JOINT
- Port perangkat.
Vendor harus menentukan superset definisi rentang volume dalam Audio Kebijakan HAL dan menggunakan callback untuk menyesuaikannya untuk varian kendaraan. Lihat
IModuleChangeCallbac
Definisi AIDL untuk informasi selengkapnya.Jika lebih dari satu BUS audio berada pada grup volume yang sama, masing-masing harus memiliki definisi rentang volume yang identik. Kegagalan untuk melakukannya akan menyebabkan mobil framework audio menolak definisi rentang volume baru.