Manajemen volume

Manajemen volume terkandung dalam CarAudioService , yang menggunakan volume tetap dengan harapan bahwa volume diterapkan di bawah HAL oleh penguat perangkat keras, bukan di perangkat lunak. 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 penguat perangkat keras untuk mengontrol volume, bukan mixer perangkat lunak. Untuk menghindari efek samping, setel tanda config_useFixedVolume ke true (hamparkan seperlunya):

<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 berdasarkan jenis aliran di mixer perangkat lunak. Hal ini mungkin tidak selalu diinginkan karena potensi efek pada aplikasi lain dan fakta bahwa pelemahan volume pada pencampur perangkat lunak dapat mengakibatkan lebih sedikit bit signifikan yang tersedia dalam sinyal saat diterima oleh penguat perangkat keras.

Grup volume

Grup volume mengelola volume untuk kumpulan perangkat dalam zona audio. Untuk setiap grup volume, volume dapat dikontrol secara independen. Keuntungan yang dihasilkan dikonfigurasikan pada perangkat terkait untuk diterapkan oleh amplifier kendaraan. Setelan volume dipertahankan untuk pengguna dan dimuat saat pengguna masuk.

Tentukan 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 lebih perangkat keluaran dengan alamat terkait. Alamat harus sesuai dengan perangkat keluaran yang ditentukan dalam audio_policy_configuration.xml .

Konfigurasikan perolehan grup volume

Setiap grup volume memiliki nilai penguatan 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 penguatan perangkat terkait dan mengonfigurasi grup sebagai berikut:

  • Ukuran langkah. Harus sama untuk semua perangkat yang dikontrol oleh grup volume.
  • Keuntungan minimal. Penguatan minimum terkecil di antara perangkat dalam grup.
  • Keuntungan maksimal. Penguatan maksimum tertinggi di antara perangkat dalam grup.
  • Keuntungan bawaan. Penguatan default tertinggi di antara perangkat dalam grup.

Mengingat cara nilai-nilai ini dikonfigurasi, penguatan grup volume dapat diatur di luar rentang yang didukung untuk perangkat yang terkait dengan grup volume. Dalam hal ini, untuk perangkat tersebut, penguatan diatur ke nilai penguatan minimum atau maksimum perangkat berdasarkan apakah nilai grup volume berada di bawah atau di atas rentang tersebut.

Pengidentifikasi 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. Pengidentifikasi ini digunakan untuk API CarAudioManager yang terkait dengan grup volume. API apa pun yang menggunakan groupId tanpa zoneId ditetapkan secara default ke zona audio utama.

Manajemen volume multi-zona

Setiap zona audio diharapkan memiliki satu atau beberapa grup volume, dan setiap grup volume hanya dikaitkan dengan satu zona audio. Hubungan ini didefinisikan sebagai bagian dari car_audio_configuration.xml . 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. Pengaturan ini bersifat spesifik zona, artinya jika pengguna masuk ke layar yang terkait dengan zona utama, dan kemudian masuk ke zona yang terkait dengan zona audio sekunder, tingkat volume yang dimuat dan dipertahankan untuk zona pertama akan berbeda dengan tingkat volume untuk zona pertama. zona sekunder.

Menangani peristiwa tombol volume

Android mendefinisikan beberapa kode kunci 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 penting ini diproses oleh CarAudioService , yang kemudian memanggil setGroupVolume atau setMasterMute , jika diperlukan. Untuk memaksakan perilaku ini, setel tanda config_handleVolumeKeysInWindowManager ke true :

<resources>
    <bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>

Peristiwa tombol volume saat ini tidak dapat membedakan zona mana yang dimaksudkan dan diasumsikan semuanya terkait dengan zona audio utama. Ketika peristiwa tombol volume diterima, CarAudioService menentukan grup volume mana yang akan disesuaikan dengan mengambil konteks audio untuk pemutar aktif dan kemudian menyesuaikan grup volume yang berisi perangkat output yang terkait dengan konteks audio prioritas tertinggi. Prioritas ditentukan berdasarkan urutan tetap yang ditentukan di CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY .

Memudar dan menyeimbangkan

Kedua versi AudioControl HAL menyertakan API untuk mengatur fade dan keseimbangan pada kendaraan. API sistem yang sesuai untuk CarAudioManager meneruskan nilai ke AudioControl HAL. API ini memerlukan android.car.permission.CAR_CONTROL_AUDIO_VOLUME . API AudioControl adalah:

  • setBalanceTowardRight(float value) menggeser volume speaker ke sisi kanan (+) atau kiri (-) mobil.

    • 0,0 berada di tengah
    • +1.0 sepenuhnya benar
    • -1.0 tersisa sepenuhnya
    • Nilai di luar rentang -1 hingga 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 hingga 1 adalah kesalahan

Anda memutuskan bagaimana nilai-nilai ini harus diterapkan dan bagaimana menampilkan nilai-nilai tersebut kepada pengguna. Mereka dapat diterapkan secara ketat pada media atau secara menyeluruh pada semua suara Android. Android 11 juga memperkenalkan dukungan untuk menerapkan efek audio ke perangkat output. Dengan ini, alternatif lain yang dapat dilakukan adalah mengelola pemudaran dan keseimbangan melalui efek audio pada perangkat keluaran yang sesuai, bukan melalui API ini.

Audio merunduk

Audio ducking terjadi ketika kendaraan mengurangi penguatan untuk satu aliran sehingga aliran lain yang diputar secara bersamaan dapat terdengar lebih jelas. Di AAOS, audio ducking diimplementasikan oleh HAL. Android tidak memiliki kendali atas suara di luar OS. Di Android 11, informasi utama yang tersedia bagi HAL untuk mengambil keputusan adalah apakah dua perangkat keluaran memiliki aliran aktif atau tidak.

Kapan harus merunduk

Meskipun masing-masing OEM berhak menentukan cara penanganan ducking oleh HAL, kami merekomendasikan pedoman berikut.

  • Pemutaran beberapa streaming di Android biasanya terjadi ketika dua aplikasi atau layanan secara bersamaan menahan fokus audio. Untuk mengetahui kapan Android dapat memberikan fokus bersamaan, lihat matriks interaksi di Jenis pembatasan . Dengan diperkenalkannya plugin audio mobil, hal ini juga bergantung pada manajemen AudioFocus Anda.

  • Aliran apa pun yang digabungkan oleh Android dilakukan sebelum keuntungan apa pun diterapkan. Oleh karena itu, aliran apa pun yang harus dihindarkan saat diputar secara bersamaan dengan aliran lain harus dirutekan ke perangkat keluaran terpisah sehingga HAL dapat menerapkan pengecilan sebelum mencampurkannya.

Berikut adalah potensi interaksi bersamaan yang direkomendasikan.

Interaksi Tindakan
EMERGENCY Membungkam atau membisukan segalanya kecuali SAFETY
SAFETY Bebek segalanya kecuali EMERGENCY
NAVIGATION Mengabaikan segalanya kecuali SAFETY dan EMERGENCY
CALL Mengabaikan segalanya kecuali SAFETY , EMERGENCY , dan NAVIGATION
VOICE Bebek CALL_RING
VEHICLE_SOUNDS Anda menentukan pentingnya suara aktif dan apakah suara tersebut mengganggu suara lainnya atau tidak.
MUSIC dan ANNOUNCEMENT Terkejut oleh segalanya. Pengecualian adalah nada interaksi sentuhan yang dimainkan sebagai SYSTEM_SOUND .

Pertimbangan saat merunduk

Beberapa aplikasi dan layanan, seperti navigasi atau asisten, mungkin menggunakan beberapa pemain untuk melakukan tindakan. Hindari pelepasan yang agresif ketika aliran data berhenti mengalir melalui perangkat keluaran untuk memastikan media tidak kembali ke volume penuh sebelum dihindarkan sebelum pemutaran berikutnya dari navigasi atau aplikasi asisten dimulai.

Untuk kendaraan dengan beberapa tahapan suara dengan isolasi yang cukup baik, Anda dapat mengarahkan audio ke berbagai area mobil alih-alih merunduk. Misalnya saja, instruksi navigasi dapat disalurkan ke speaker sandaran kepala pengemudi sambil terus memutar musik ke seluruh kabin dengan volume normal.

Suara kritis keselamatan

Android 11 memperkenalkan API fokus audio HAL . HAL memastikan suara yang penting bagi keselamatan diprioritaskan dibandingkan suara lainnya. Jika HAL menahan fokus audio selama 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 penting bagi keselamatan.

Konfigurasikan UI pengaturan volume

AAOS memisahkan UI pengaturan volume dari konfigurasi grup volume. Ini dapat dihamparkan seperti yang dijelaskan dalam Konfigurasikan perolehan grup volume . Pemisahan ini memastikan bahwa tidak ada perubahan yang diperlukan jika konfigurasi grup volume berubah.

Di UI pengaturan mobil, packages/apps/Car/Settings/res/xml/car_volume_items.xml berisi elemen UI (sumber daya judul dan ikon) yang terkait dengan setiap AudioAttributes.USAGE yang ditentukan. File ini menyediakan rendering yang wajar dari VolumeGroups yang ditentukan dengan menggunakan sumber daya yang terkait dengan penggunaan pertama yang dikenali yang terkandung dalam setiap VolumeGroup .

Misalnya, contoh berikut mendefinisikan VolumeGroup termasuk voice_communication dan voice_communication_signalling . Implementasi default dari UI pengaturan mobil merender VolumeGroup menggunakan sumber daya yang terkait dengan voice_communication karena itu adalah 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 dalam packages/apps/Car/Settings/res/values/attrs.xml . UI pengaturan volume menggunakan CarAudioManager API berbasis VolumeGroup berikut:

  • getVolumeGroupCount() untuk mempelajari berapa banyak kontrol yang harus diambil.
  • getGroupMinVolume() dan getGroupMaxVolume() untuk mendapatkan batas bawah dan atas.
  • getGroupVolume() untuk mendapatkan volume saat ini.
  • registerVolumeChangeObserver() untuk diberitahu tentang perubahan volume.

Acara grup volume mobil

Kasus penggunaan otomotif pada pembaruan volume dan tombol bisu memiliki dasar kontekstual yang dapat menentukan tindakan aplikasi tertentu, seperti pengaturan volume. Panggilan balik volume dan bisu saat ini dari tumpukan audio mobil memberikan informasi kontekstual yang terbatas. Untuk melayani kasus penggunaan otomotif dan skalabilitas di masa depan dengan lebih baik, CarVolumeGroupEvent ditambahkan ke Android 14. Setiap peristiwa membawa tiga jenis informasi penting:

  • Daftar CarVolumeGroupInfo
  • EventTypes (dipetakan sedikit)
  • Daftar ExtraInfos

Info GrupVolume Mobil

Penerima panggilan balik peristiwa memiliki akses siap pakai ke daftar informasi grup volume mobil yang terkena dampak. Artinya, aplikasi tidak perlu melakukan panggilan tambahan apa pun ke kerangka audio Mobil untuk mendapatkan status terkini. Itu cukup menggunakan CarVolumeGroupInfos yang diterima to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of EventTypes`, seperti yang dijelaskan di bawah.

Jenis Acara

Menentukan aspek CarVolumeGroupInfo mana yang berubah. Aplikasi dapat menggunakan ini untuk mengidentifikasi perubahan dan mengambil tindakan yang diperlukan. Misalnya, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED menunjukkan bahwa masing-masing CarVolumeGroups' maximum volume gain index has changed and can be queried by CarVolumeGroupInfo.getMaxVolumeGainIndex()`.

Tabel berikut memperlihatkan hubungan antara EventType dan CarVolumeGroupInfo .

Tipe Peristiwa Info GrupVolume Mobil
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()

Info Ekstra

Memberikan informasi tambahan tentang alasan CarVolumeGroup berubah. Aplikasi dapat menggunakan informasi ini untuk memberikan konteks tambahan guna memperingatkan pengguna agar bertindak atau memberi tahu. Misalnya, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL menunjukkan redaman transien aktif karena kelebihan beban termal. Aplikasi ini dapat memberi tahu pengguna jika mereka mencoba meningkatkan volume.

Kami tidak menerapkan proses apa pun untuk ExtraInfos . Terserah pada kebijaksanaan Anda untuk menentukan proses berdasarkan ExtraInfos . Misalnya, jika redaman aktif karena EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED , Anda juga dapat memilih untuk memudarkan UI bilah volume pada awalnya untuk mencegah pengguna mengubah volume. Orang lain mungkin memilih untuk bersulang bahwa gerakan merunduk aktif dan memungkinkan pengguna mengubah volume.

Kerangka audio mobil bergantung pada AudioControl HAL IAudioGainCallback untuk menyediakan ExtraInfos yang disarankan. Untuk mempelajari lebih lanjut, lihat Panggilan Balik Penguatan Audio .

CarVolumeGroupEvent berskala untuk memenuhi kebutuhan kerangka audio mobil di masa depan. Kami bermaksud untuk mendukung fitur-fitur baru melalui CarVolumeGroupEvent saja. Kami sangat menyarankan agar pengembang aplikasi menggunakan CarVolumeGroupEvent untuk menangani volume grup dan menonaktifkan perubahan.

Panggilan balik acara grup volume mobil

Android 14, menyediakan callback baru bagi aplikasi platform dan hak istimewa untuk mendaftar dan diberi tahu tentang CarVolumeGroupEvents .

  • Untuk mendaftar panggilan balik, gunakan CarAudioManager#registerCarVolumeGroupEventCallback()

  • Untuk membatalkan pendaftaran panggilan balik, gunakan CarAudioManager#unregisterCarVolumeGroupEventCallback()

Jika aplikasi mendaftar dengan CarVolumeGroupEventCallback baru dan CarVolumeCallback lama, kejadian CarVolumeGroupEventCallbacks akan diprioritaskan. Tumpukan audio mobil tidak lagi memicu CarVolumeCallback . Hal ini mencegah duplikat pemicu ke aplikasi yang sama untuk peristiwa yang sama.

Kami sangat menyarankan agar Anda menggunakan CarVolumeGroupEventCallback untuk mengelola volume grup dan menonaktifkan perubahan.

Panggilan balik penguatan audio

Sejak Android 13, AudioControl HAL dapat memicu callback asinkron untuk mengelola pembaruan level volume karena perubahan pada sistem audio mobil.

API HAL

Kontrol Audio @2.0 AIDL

AudioControl AIDL HAL versi 2.0 menambahkan API berikut:

API Tujuan
IAudioControl#registerGainCallback Mendaftarkan instance IAudioGainCallback dengan AudioControl HAL.
IAudioGainCallback#onAudioDeviceGainsChanged Panggilan balik asinkron untuk memberi tahu perubahan pada konfigurasi penguatan audio.

Callback AudioControl HAL mencakup daftar alasan dan masing-masing AudioGainConfigInfo , yang terdiri dari:

  • Id Zona
  • Alamat port perangkat
  • Indeks volume > indeks dapat berupa indeks terbatas atau indeks pembaruan.

Alasannya dapat dikategorikan secara luas sebagai:

  • Alasan pembatasan. Perubahan sementara pada perilaku volume dan bisu.
  • Perbarui alasan. Perubahan permanen pada perilaku volume.

Jenis pembatasan

Pada AudioControl HAL AIDL V3 , berikut adalah jenis pembatasan yang didukung:

  • Bisu
  • Pemblokiran
  • Keterbatasan
  • Atenuasi
Pembatasan aktif Perubahan volume yang dipicu pengguna Tombol bisu yang dipicu oleh pengguna
Bisu ❌ (bersuara)

✔ (bisu)
Pemblokiran
Keterbatasan ❌ (melebihi batas)

✔ (di bawah batas)
Atenuasi

Prioritas antara pembatasan adalah Mute > Blocking > Limitation > Attenuation.

Pembatasan bisu

Pembatasan bisu adalah:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Framework audio mobil secara internal mempertahankan dua kondisi bisu berikut:

  • Pengguna bisu. Dialihkan berdasarkan permintaan dari pengguna, baik melalui CarAudioManager atau peristiwa penting.

  • HAL bisu. Dialihkan berdasarkan pembatasan bisu yang diterima melalui panggilan balik AudioGain .

Bagi pendengar seperti aplikasi Setelan, status bisu keseluruhan grup volume ( CarVolumeGroupInfo.isMuted() ) akan didasarkan pada apakah salah satu dari bisu di atas diaktifkan.

Jika bisu HAL diaktifkan, semua perubahan volume masuk dan permintaan suara grup akan diabaikan selama durasi pembatasan.

Kasus interaksi: HAL mute aktif dan Permintaan pengguna untuk Mute beralih

Jika HAL mute diaktifkan dan User mute dinonaktifkan:

  • Status bisu keseluruhan grup volume diubah menjadi true .
  • Permintaan dari Pengguna untuk mengaktifkan mute akan diproses.
    • Alasan: Permintaan bisu pengguna harus dipenuhi setiap saat untuk menjaga privasi pengguna.

Saat HAL mute diaktifkan dan User mute diaktifkan:

  • Status bisu keseluruhan grup volume diubah menjadi true .

  • Permintaan dari Pengguna untuk menonaktifkan mute NOT akan diproses. Status senyap Pengguna yang di-cache tetap aktif.

    • Alasan: Permintaan suara pengguna hanya akan dipenuhi jika tidak ada pembatasan aktif.

    • Alasan: Mematikan suara yang di-cache. Bisukan pengguna dapat menyebabkan ledakan suara yang tidak diinginkan dan membahayakan keselamatan pengguna. Hal ini terutama berlaku jika status senyap diaktifkan di seluruh siklus penyalaan sehingga menurunkan kesadaran pengguna terhadap persepsi tingkat suara.

Kasus interaksi: HAL Mute diaktifkan dan dinonaktifkan sementara User mute tidak mengalami perubahan

Mengalihkan bisu HAL akan mengubah status bisu grup volume secara keseluruhan. Namun, ini tidak secara langsung memperbarui status bisu pengguna. Ketika Bisu pengguna dinonaktifkan dan panggilan balik bisu HAL untuk diaktifkan diterima:

  • Status bisu keseluruhan grup volume diubah menjadi true .
  • Permintaan dari Pengguna untuk mengubah volume NOT akan diproses selama bisu HAL diaktifkan.

    • Alasan: Pengguna tidak dapat merasakan suara saat mode bisu diaktifkan. Membiarkan perubahan volume dapat mengakibatkan ledakan suara dan membahayakan keselamatan pengguna.

    • Alasan: Aplikasi volume dapat mendaftar untuk panggilan balik dan memicu suara (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) secara otomatis tanpa campur tangan pengguna, jika ini adalah perilaku yang diharapkan oleh OEM.

Ketika bisu HAL dinonaktifkan sementara bisu pengguna dinonaktifkan:

  • Status bisu grup volume diubah menjadi false .

    Alasan: Membuat status bisu menjadi kaku dan meminta Pengguna untuk mengaktifkan suara dapat mengganggu Pengguna secara tidak perlu ketika status bisu sering berubah-ubah.

  • Permintaan dari pengguna untuk mengubah volume akan diproses secara normal.

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 diproses.
  • Alihkan bisu diproses.

Keterbatasan

Batasan batasannya adalah:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Ketika pembatasan Batasan aktif, permintaan dari pengguna untuk:

  • Ubah volume:

    • Dalam Batasan diproses
    • Batasan di atas tidak diproses
  • Alihkan bisu diproses.

Atenuasi

Batasan atenuasi adalah:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

Saat pembatasan Atenuasi aktif, permintaan dari pengguna untuk:

  • Perubahan volume diproses. Tingkat volume baru saat ini diatur ke volume yang dilemahkan (bukan ke volume sebelumnya). Perubahan volume di masa depan dilakukan dari level ini.

  • Alihkan bisu diproses.

Perbarui ke indeks

Berikut ini dianggap sebagai pembaruan 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 kerangka audio Mobil. Pembaruan indeks juga dikomunikasikan dengan Aplikasi sebagai panggilan balik 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 diubah menjadi penguatan 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 level volume hanya diperbarui ke indeks 15 (untuk alasan yang tidak diketahui Android).

  • Implementasi vendor dari pemicu AudioControl HAL :

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Layanan audio mobil menggunakan indeks baru dari panggilan balik yang digunakan untuk persistensi dan panggilan balik ke aplikasi volume. Indeks yang diminta pengguna adalah 30. Namun, umpan balik asinkron sistem audio memperbarui indeks menjadi 15.

Kasus penggunaan: Pemutaran audio pertama setelah keluar dari penangguhan

  • Indeks volume sebelum penangguhan diatur ke level tinggi 95 (kisaran: [0-99]).

  • Android memasuki penangguhan.

  • Setelah Android ada, tangguhkan (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 panggilan balik yang digunakan untuk persistensi dan panggilan baliknya sendiri ke aplikasi volume yang menyinkronkan indeks. Indeks volume sebelum penangguhan adalah 95. Namun, setelah dilanjutkan, indeks ini disetel ke tingkat volume aman sebesar 30 oleh pelaksana AudioControl HAL .

Konfigurasi volume dinamis

Untuk fitur ini kami mempertimbangkan kasus penggunaan utama berikut:

  1. Konfigurasi kendaraan end-of-line (EOL).

    • Produsen mobil lebih memilih untuk memperbarui konfigurasi volume di EOL berdasarkan pengaturan sistem audio kendaraan. Biasanya, ini adalah sideload tanpa memperbarui image Android SW.

    • Produsen mobil mungkin perlu memperbarui konfigurasi volume selama jadwal servis.

  2. Konfigurasi waktu proses. Sistem audio otomotif mendukung konfigurasi amplifier eksternal dan ECU ini dapat menampung konfigurasi rentang volume yang ditanyakan selama waktu booting.

  3. Konfigurasi sesuai permintaan. Ditawarkan untuk mendukung meningkatnya kebutuhan akan fitur audio berbasis permintaan di mana pengguna berlangganan pemrosesan sinyal yang ditingkatkan untuk jangka waktu tertentu. Konfigurasi rentang volume baru berlaku selama durasi berlangganan.

Desain

Konfigurasi volume dinamis dicapai dalam tiga tahap:

  • Penemuan. Implementasi HAL AudioControl vendor menemukan pembaruan rentang volume baru melalui mekanisme IPC khusus yang dimiliki oleh vendor.

    Setelah ditemukan, panggilan balik dihasilkan melalui AudioControl::IModuleChangeCallback .

  • Memperbarui. Tumpukan 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 melampaui batas, indeks volume saat ini ditetapkan ke nilai aman. Misalnya, level default yang disediakan oleh vendor selama panggilan balik.

  • Panggilan balik.

    • Pasca pembaruan rentang grup volume, tumpukan audio mobil memicu panggilan balik ke aplikasi yang terdaftar melalui CarVolumeGroupEventCallback .

    • CarVolumeGroupEvent membawa CarVolumeGroupInfo yang diperbarui, tipe Acara (apa yang berubah) dan Info tambahan (mengapa berubah).

gambar

Gambar 1. Konfigurasi volume dinamis.

API HAL

Kontrol Audio @ 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 disetel dengan AudioControl HAL.
IModuleChangeCallback#onAudioPortsChanged Panggilan balik untuk memberitahukan perubahan pada AudioPorts

Urutan

Diagram urutan konfigurasi volume dinamis ditampilkan di bawah.

gambar

Gambar 2. Diagram urutan untuk konfigurasi volume dinamis.

Aspek kunci

Untuk mengoptimalkan fitur ini, pertimbangkan hal berikut.

  • AudioPort yang disediakan sebagai bagian dari callback harus sesuai dengan definisi BUS Otomotif:

    • Pelabuhan perangkat. IN_DEVICE , OUT_DEVICE
    • Koneksi. BUS
    • Alamat. Didefinisikan dalam definisi Audio HAL
    • Dapatkan mode. JOINT
  • Vendor harus menentukan superset definisi rentang volume dalam kebijakan Audio HAL dan menggunakan callback untuk menyesuaikannya dengan varian kendaraan. Lihat definisi IModuleChangeCallbac AIDL untuk informasi lebih lanjut.

  • Jika lebih dari satu BUS audio termasuk dalam grup volume yang sama, masing-masing BUS harus memiliki definisi rentang volume yang sama. Kegagalan untuk melakukan hal ini mengakibatkan kerangka audio mobil menolak definisi rentang volume yang baru.