Pengelolaan volume

Pengelolaan volume dimuat di CarAudioService, yang menggunakan volume tetap dengan ekspektasi 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 pencampur 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 disetel ke false), aplikasi dapat memanggil AudioManager.setStreamVolume() untuk mengubah volume berdasarkan jenis streaming di mixer software. Hal ini mungkin tidak selalu diinginkan karena adanya potensi efek pada aplikasi lain dan fakta bahwa pelemahan volume pada mixer software dapat mengakibatkan lebih sedikit bit signifikan yang tersedia pada sinyal saat diterima oleh amplifier hardware.

Grup volume

Grup volume mengelola volume untuk sekumpulan perangkat dalam zona audio. Untuk setiap grup volume, volume dapat dikontrol secara terpisah. Keuntungan yang dihasilkan dikonfigurasi pada perangkat terkait untuk diterapkan oleh amplifier kendaraan. Setelan volume disimpan untuk pengguna dan dimuat saat pengguna login.

Menentukan grup volume

CarAudioService menggunakan grup volume yang ditentukan di car_audio_configuration.xml:

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <device address="bus0_media_out">
                        <context context="music"/>
                    </device>
                </group>
                <group>
                    <device address="bus1_navigation_out">
                        <context context="navigation"/>
                    </device>
                    <device address="bus2_voice_command_out">
                        <context context="voice_command"/>
                    </device>
                </group>
                ...
            </volumeGroups>
        </zone>
     </zones>
</audioZoneConfiguration>

Setiap grup volume harus berisi satu atau beberapa perangkat output dengan alamat terkait. Alamat harus sesuai dengan perangkat output yang ditentukan 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 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 akan memeriksa nilai perolehan dari perangkat terkait dan mengonfigurasi grup sebagai berikut:

  • Ukuran langkah. Harus sama untuk semua perangkat yang dikontrol oleh grup volume.
  • Penguatan minimum. Perolehan 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 ini dikonfigurasi, Anda dapat menetapkan peningkatan grup volume di luar rentang yang didukung untuk perangkat yang terkait dengan grup volume tersebut. Dalam hal ini, untuk perangkat tersebut, penguatan ditetapkan ke nilai penguatan minimum atau maksimum perangkat berdasarkan apakah nilai grup volume berada di bawah atau di atas rentang.

ID grup volume

Grup volume diidentifikasi saat runtime dalam urutan yang ditentukan dalam file XML. ID berkisar dari 0 hingga N-1 dalam zona audio, dengan N adalah jumlah grup volume di zona tersebut. Dengan cara ini, ID grup volume tidak unik di seluruh zona. ID ini digunakan untuk CarAudioManager API yang terkait dengan grup volume. Setiap API yang menggunakan groupId tanpa zoneId akan ditetapkan secara default ke zona audio utama.

Pengelolaan volume multi-zona

Setiap zona audio diharapkan memiliki satu atau beberapa grup volume, dan setiap grup volume hanya dikaitkan dengan satu zona audio. Hubungan ini ditentukan sebagai bagian dari car_audio_configuration.xml. Untuk mempelajari lebih lanjut, lihat contoh di atas di Menentukan grup volume.

Level volume saat ini untuk setiap zona dipertahankan untuk pengguna yang terkait dengan zona tersebut. Setelan ini berlaku khusus zona, artinya jika pengguna login pada tampilan yang terkait dengan zona utama, kemudian setelah login ke zona yang terkait dengan zona audio sekunder, tingkat volume yang dimuat dan dipertahankan untuk zona pertama berbeda dengan yang ada 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. Implementasi otomatis harus memaksa peristiwa utama ini diproses oleh CarAudioService, yang kemudian memanggil setGroupVolume atau setMasterMute, sebagaimana sesuai. Untuk memaksa perilaku ini, tetapkan flag config_handleVolumeKeysInWindowManager ke true:

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

Peristiwa tombol volume saat ini tidak memiliki cara untuk membedakan zona mana yang dituju dan dianggap terkait dengan zona audio utama. Saat peristiwa tombol volume diterima, CarAudioService akan menentukan grup volume 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 pengurutan tetap yang ditentukan dalam CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.

Pudar dan seimbang

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

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

    • 0,0 berada di tengah
    • +1.0 sepenuhnya benar
    • -1.0 tersisa sepenuhnya
    • Nilai di luar rentang -1 sampai 1 adalah kesalahan
  • setFadeTowardFront(float value) menggeser volume speaker ke bagian 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 cara penerapan nilai ini dan cara menampilkan nilai tersebut kepada pengguna. Filter ini dapat diterapkan hanya pada media atau di seluruh platform untuk semua suara Android. Android 11 juga memperkenalkan dukungan untuk menerapkan efek audio ke perangkat output. Dengan demikian, Anda dapat mengelola pudar dan keseimbangan secara alternatif melalui efek audio pada perangkat output yang sesuai, bukan melalui API ini.

Pengecilan volume audio

Pengecilan volume audio terjadi saat kendaraan mengurangi penguatan satu streaming sehingga streaming lain yang diputar secara 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 penurunan volume adalah apakah dua perangkat output memiliki aliran aktif atau tidak.

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 menahan fokus audio secara serentak. 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.

  • Setiap streaming yang digabungkan oleh Android dilakukan sebelum keuntungan diterapkan. Dengan demikian, setiap stream yang harus diperkecil saat diputar bersamaan dengan stream lain harus dirutekan ke perangkat output terpisah agar HAL dapat menerapkan pengecilan volume sebelum mencampurnya.

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 akan menentukan tingkat kepentingan suara aktif dan apakah suara tersebut mengecilkan suara lain atau tidak.
MUSIC dan ANNOUNCEMENT Dikurangi oleh semuanya. Pengecualian adalah nada interaksi sentuh yang diputar sebagai SYSTEM_SOUND.

Pertimbangan saat mengecilkan

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

Untuk kendaraan dengan beberapa peredam suara dengan isolasi yang cukup baik, Anda dapat mengarahkan audio ke berbagai area mobil, bukan mengecilkan volume. Misalnya, petunjuk navigasi dapat diarahkan ke speaker sandaran kepala pengemudi sambil terus memutar musik di seluruh kabin dengan volume normal.

Suara keselamatan yang penting

Android 11 memperkenalkan API fokus audio HAL. HAL memastikan suara yang penting bagi keselamatan lebih diprioritaskan daripada suara lainnya. Jika HAL menyimpan fokus audio untuk USAGE_EMERGENCY, tidak ada jaminan bahwa aplikasi dan layanan dari Android tidak akan memutar suara. HAL menentukan streaming mana dari Android yang harus dicampur atau dibisukan untuk memutar suara yang penting bagi keamanan.

Mengonfigurasi UI setelan volume

AAOS memisahkan UI setelan volume dari konfigurasi grup volume. Ini dapat ditempatkan seperti yang dijelaskan dalam Mengonfigurasi peningkatan grup volume. Pemisahan ini memastikan bahwa konfigurasi grup volume tidak diperlukan jika konfigurasi grup volume berubah.

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

Misalnya, contoh berikut menentukan VolumeGroup sebagai menyertakan voice_communication dan voice_communication_signalling. Implementasi default UI setelan mobil merender VolumeGroup menggunakan resource yang terkait dengan voice_communication karena 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 di packages/apps/Car/Settings/res/values/attrs.xml. UI setelan volume menggunakan CarAudioManager API berbasis VolumeGroup berikut:

  • getVolumeGroupCount() untuk mempelajari jumlah kontrol yang harus digambar.
  • getGroupMinVolume() 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 dari update volume dan tombol bisukan memiliki dasar kontekstual yang dapat menentukan tindakan aplikasi tertentu, seperti setelan volume. Callback volume dan membisukan audio saat ini dari stack audio mobil memberikan informasi kontekstual terbatas. Untuk melayani kasus penggunaan otomotif dan skalabilitas mendatang dengan lebih baik, CarVolumeGroupEvent ditambahkan ke Android 14. Setiap peristiwa membawa tiga jenis informasi penting:

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

InfoGrupVolume

Penerima callback peristiwa memiliki akses yang sudah siap ke daftar informasi grup volume mobil yang terpengaruh. Artinya, aplikasi tidak perlu melakukan panggilan tambahan ke framework Audio mobil untuk mendapatkan status terbaru. Cukup menggunakan CarVolumeGroupInfos yang diterima untuk mengupdate UI atau status internal. Untuk memudahkan aplikasi, aspek yang berubah dalam kelompok volume mobil juga disediakan sebagai bagian dari EventTypes, seperti yang dijelaskan di bawah.

EventType

Menentukan aspek CarVolumeGroupInfo mana yang telah berubah. Aplikasi dapat menggunakannya untuk mengidentifikasi perubahan dan melakukan tindakan yang diperlukan. Misalnya, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED menunjukkan bahwa masing-masing indeks peningkatan volume maksimum CarVolumeGroups telah berubah dan dapat dikueri oleh 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 guna memberi tahu pengguna agar bertindak atau memberi tahu. Misalnya, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL menunjukkan redaman sementara yang aktif karena kelebihan beban termal. Aplikasi dapat memberi tahu pengguna jika mereka mencoba meningkatkan volume.

Kami tidak menegakkan proses apa pun untuk ExtraInfos. Anda bebas menentukan proses berdasarkan ExtraInfos. Misalnya, jika pelemahan aktif karena EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED, Anda juga dapat memilih untuk memudarkan UI panel volume di awal untuk mencegah pengguna mengubah volume. Aplikasi lain dapat memilih untuk menampilkan toast yang pengecilan volumenya aktif dan memungkinkan pengguna mengubah volume.

Framework audio mobil bergantung pada IAudioGainCallback AudioControl HAL untuk menyediakan ExtraInfos yang disarankan. Untuk mempelajari lebih lanjut, lihat Callback Perolehan Audio.

CarVolumeGroupEvent melakukan penskalaan untuk memenuhi kebutuhan framework audio mobil di masa mendatang. Kami ingin mendukung fitur baru hanya melalui CarVolumeGroupEvent. Sebaiknya developer aplikasi menggunakan CarVolumeGroupEvent untuk menangani volume grup dan membisukan perubahan.

Callback peristiwa grup volume mobil

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

  • Untuk mendaftarkan callback, gunakan CarAudioManager#registerCarVolumeGroupEventCallback()

  • Untuk membatalkan pendaftaran callback, gunakan CarAudioManager#unregisterCarVolumeGroupEventCallback()

Jika aplikasi didaftarkan 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 gunakan CarVolumeGroupEventCallback untuk mengelola volume grup dan membisukan perubahan.

Callback perolehan audio

Mulai Android 13, AudioControl HAL dapat memicu callback asinkron untuk mengelola update level volume akibat perubahan pada 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 AudioGainConfigInfo yang terkait, yang terdiri dari:

  • ID Zona
  • Alamat port perangkat
  • Indeks volume > indeks dapat berupa indeks terbatas atau indeks update.

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 pembatasan yang didukung:

  • Membisukan
  • Pemblokiran
  • Batasan
  • Atenuasi
Batasan aktif Perubahan volume yang dipicu pengguna Tombol bisukan yang dipicu pengguna
Membisukan ❌ (bunyikan)

✔ (bisukan)
Pemblokiran
Batasan ❌ (melebihi batas)

✔ (di bawah batas)
Atenuasi

Prioritas di antara pembatasan adalah Bisukan > Pemblokiran > Batasan > Attenuasi.

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 yang diterima melalui callback AudioGain.

Untuk pemroses seperti aplikasi Setelan, status pembisuan keseluruhan grup volume (CarVolumeGroupInfo.isMuted()) akan didasarkan pada apakah salah satu pembisuan di atas diaktifkan atau tidak.

Jika pembisuan HAL diaktifkan, semua perubahan volume yang masuk dan permintaan bunyi grup 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. Status nonaktif Pengguna yang di-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 keamanan pengguna. Hal ini terutama berlaku jika status bisukan diaktifkan di seluruh siklus pembakaran yang menurunkan kesadaran pengguna terhadap persepsi tingkat suara.

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, hal ini tidak secara langsung memperbarui status nonaktif pengguna. Saat Penonaktifan pengguna dinonaktifkan dan callback pembisuan HAL 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 keamanan 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 audio mungkin tidak perlu mengganggu Pengguna 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. Level volume baru saat ini disetel 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 mengupdate indeks saat ini grup volume ke indeks yang ditentukan. Fungsi ini terutama digunakan sebagai masukan dari sistem audio untuk permintaan perubahan volume dari framework Audio mobil. Update indeks juga dikomunikasikan dengan Aplikasi sebagai callback CarVolumeGroupEvent untuk menyinkronkan 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 volume baru dan mengupdate sistem audio (seperti amp eksternal).

  • Sistem audio merespons bahwa level volume hanya diupdate 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 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 30 ke sistem audio secara lokal.

    • Vendor AudioControl HAL juga memicu callback untuk indeks aman:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Layanan audio mobil menggunakan indeks baru dari callback yang digunakan untuk persistensi dan callback-nya sendiri ke aplikasi volume yang menyinkronkan indeks. Indeks volume sebelum penangguhan adalah 95. Namun, setelah dilanjutkan, indeks ini ditetapkan ke level volume aman 30 oleh pengimplementasi AudioControl HAL.

Konfigurasi volume dinamis

Untuk fitur ini, kami mempertimbangkan kasus penggunaan utama berikut:

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

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

    • Pembuat 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 makin meningkat akan fitur audio berbasis permintaan, yang memungkinkan pengguna berlangganan pemrosesan sinyal yang ditingkatkan selama jangka waktu tertentu. Konfigurasi rentang volume baru valid selama durasi langganan.

Desain

Konfigurasi volume dinamis dicapai dalam tiga tahap:

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

    Setelah ditemukan, callback akan 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, level default 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 membawa CarVolumeGroupInfo, Jenis peristiwa (apa yang berubah) dan Info ekstra (alasannya berubah) yang diperbarui.

gambar

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 Menghapus instance IModuleChangeCallback yang sebelumnya ditetapkan dengan AudioControl HAL.
IModuleChangeCallback#onAudioPortsDiubah Callback untuk memberi tahu perubahan pada AudioPorts

Urutan

Diagram urutan konfigurasi volume dinamis ditampilkan di bawah ini.

gambar

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 definisi Automotive BUS:

    • Port perangkat. IN_DEVICE, OUT_DEVICE
    • Koneksi. BUS
    • Alamat. Ditetapkan dalam definisi HAL Audio
    • Mode Dapatkan. 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 informasi selengkapnya.

  • Jika lebih dari satu BUS audio berada dalam grup volume yang sama, masing-masing BUS harus memiliki definisi rentang volume yang identik. Jika cara ini tidak dilakukan, framework audio mobil akan menolak definisi rentang volume yang baru.