Pengelolaan volume

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

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 dalam activationVolumeConfigEntry 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.

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() dan getGroupMaxVolume() 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 vendorAudio 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:

  1. 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.

  2. Konfigurasi runtime. Sistem audio otomotif mendukung konfigurasi amplifier eksternal dan ECU ini dapat menghosting konfigurasi rentang volume yang dikueri selama waktu booting.

  3. 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 membawa CarVolumeGroupInfo yang diperbarui, Jenis peristiwa (apa yang berubah) dan Info tambahan (mengapa berubah).

gambar

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

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
  • 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.