Pengelolaan volume

AAOS memiliki pengelolaan volumenya sendiri di CarAudioService. Model ini menggunakan konfigurasi volume dengan ekspektasi bahwa volume harus diterapkan di bawah HAL oleh hardware {i>amplifier<i} daripada perangkat lunak. Fitur ini juga mengatur perangkat output ke dalam grup volume menerapkan penguatan yang sama ke semua perangkat yang terkait dengan grup volume.

Menggunakan volume tetap

Implementasi AAOS harus mengontrol volume menggunakan amplifier hardware, bukan mixer software. Untuk menghindari efek samping, tetapkan tanda config_useFixedVolume ke true (overlay jika diperlukan):

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

Jika tanda config_useFixedVolume tidak ditetapkan (atau ditetapkan ke salah), aplikasi dapat memanggil AudioManager.setStreamVolume() dan mengubah volume berdasarkan jenis aliran di mixer software. Hal ini mungkin tidak diinginkan karena efek potensial pada aplikasi lain dan fakta bahwa pelemahan volume pada pencampur perangkat lunak menghasilkan lebih sedikit bit{i> <i}signifikan yang tersedia dalam sinyal ketika diterima di penguat perangkat keras.

Grup volume

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

Menentukan kelompok 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>

Contoh implementasi car_audio_configuration.xml.

Setiap grup volume harus berisi satu atau beberapa perangkat output dengan alamat terkait. Alamat ini harus sesuai dengan perangkat {i>output<i} yang ditentukan dalam audio_policy_configuration.xml.

Mengonfigurasi penambahan grup volume

Setiap grup volume memiliki nilai perolehan minimum, maksimum, dan default, serta ukuran langkah. Hal ini ditentukan berdasarkan nilai yang dikonfigurasi di audio_policy_configuration.xml untuk perangkat terkait dengan kelompok volume.

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

Selama inisialisasi, grup volume akan memeriksa nilai keuntungan dari perangkat dan konfigurasi grup sebagai berikut:

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

Karena cara nilai-nilai ini dikonfigurasi, ada kemungkinan untuk mengatur penguatan grup volume di luar rentang yang didukung untuk perangkat yang terkait dengan grup volume. Dalam hal ini, untuk perangkat tersebut, keuntungan akan ditetapkan ke nilai minimum atau maksimum perangkat dapatkan nilai berdasarkan apakah nilai grup volume berada di bawah atau di atas rentang tersebut.

ID grup volume

Grup volume diidentifikasi saat runtime berdasarkan urutan definisinya dalam file XML. ID berkisar antara 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. Pengidentifikasi ini digunakan untuk CarAudioManager API yang terkait dengan grup volume. API apa pun yang mengambil 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 didefinisikan sebagai bagian dari car_audio_configuration.xml. Lihat contoh yang tersedia di Menentukan grup volume di atas.

Tingkat volume saat ini untuk setiap zona dipertahankan untuk pengguna yang terkait dengan zona tersebut. Setelan ini bersifat khusus zona, artinya jika pengguna login di layar yang terkait dengan zona utama, dan selanjutnya masuk ke zona yang terkait dengan di zona audio sekunder, level volume yang dimuat dan dipertahankan di zona pertama akan berbeda dari zona sekunder.

Menangani peristiwa tombol volume

Android menentukan beberapa kode tombol untuk kontrol volume, termasuk KEYCODE_VOLUME_UP, KEYCODE_VOLUME_DOWN, dan KEYCODE_VOLUME_MUTE. Secara default, Android merutekan tombol volume peristiwa pada aplikasi. Implementasi otomotif harus memaksa peristiwa utama ini untuk CarAudioService, yang kemudian dapat memanggil setGroupVolume atau setMasterMute sebagaimana mestinya.

Untuk memaksa perilaku ini, setel config_handleVolumeKeysInWindowManager tandai ke true:

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

Peristiwa tombol volume saat ini tidak memiliki cara untuk membedakan zona mana yang dimaksud ditujukan untuk, dan dengan demikian dianggap semua terkait dengan zona audio utama. Saat peristiwa tombol volume diterima, CarAudioService akan menentukan volume grup untuk menyesuaikan dengan mengambil konteks audio untuk pemutar aktif, lalu menyesuaikannya grup volume yang berisi perangkat output yang terkait dengan prioritas tertinggi konteks audio. Prioritas ditentukan berdasarkan urutan tetap yang ditentukan dalam CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.

Pudar dan seimbang

Kedua versi AudioControl HAL menyertakan API untuk menyetel pudar dan keseimbangan dalam yang digunakan untuk kendaraan. Ada API sistem yang sesuai untuk CarAudioManager yang meneruskan nilai sampai ke HAL AudioControl. API ini memerlukan android.car.permission.CAR_CONTROL_AUDIO_VOLUME.

AudioControl API adalah:

  • setBalanceTowardRight(float value). Menggeser volume speaker ke arah sisi kanan (+) atau kiri (-) mobil. 0.0 berada di tengah, +1.0 sepenuhnya benar, -1,0 sepenuhnya tersisa, dan nilai di luar rentang -1 hingga 1 adalah kesalahan.
  • setFadeTowardFront(float value) - Menggeser volume speaker bagian depan (+) atau belakang (-) mobil. 0.0 berada di tengah, +1.0 sepenuhnya ke depan, -1.0 sepenuhnya ke belakang, dan nilai di luar rentang -1 hingga 1 adalah error.

OEM sendiri yang memutuskan bagaimana nilai ini harus diterapkan dan bagaimana nilainya akan ditampilkan kepada pengguna. Iklan ini dapat diterapkan hanya pada media atau di seluruh mengakses semua suara Android.

Android 11 juga memperkenalkan dukungan untuk menerapkan efek audio ke perangkat output. Dengan ini, kita bisa mengatur pudar dan keseimbangan melalui efek audio pada perangkat output yang sesuai, bukan melalui API ini.

Pengecilan volume audio

Pengurangan volume audio terjadi saat kendaraan mengurangi penguatan untuk satu streaming agar streaming lain yang diputar pada saat yang sama dapat didengar dengan lebih jelas. Pada AAOS, pengecilan volume audio diserahkan kepada HAL untuk diterapkan karena kemungkinan ada banyak suara di luar Android yang tidak dapat dikontrol oleh OS. Di Android 11, informasi utama tersedia di HAL untuk membuat keputusan pengecilan volume adalah apakah dua perangkat {i>output<i} memiliki feed yang aktif.

Kapan harus mengecil

Meskipun setiap OEM memiliki keputusan untuk menentukan bagaimana penanganan pengecilan volume oleh HAL mereka, ada beberapa panduan umum yang kami rekomendasikan. Beberapa streaming yang diputar di Android akan paling sering terjadi ketika dua aplikasi/layanan menahan fokus audio secara serentak. Mengingat hal itu, lihat Matriks interaksi untuk mempelajari kapan Android dapat memberikan fokus serentak dan, oleh karena itu, saat memungkinkan dua berbagai streaming untuk dimainkan secara serentak.

Perlu diingat bahwa streaming apa pun yang digabungkan oleh Android akan dilakukan sebelum keuntungan apa pun yang diterapkan. Dengan demikian, setiap streaming yang harus dikecilkan ketika diputar bersamaan dengan yang lain harus dirutekan untuk perangkat {i>output<i} terpisah sehingga HAL dapat menerapkan pengecilan volume sebelum mencampurnya bersama-sama.

Perilaku pengecilan volume yang direkomendasikan

Berikut ini adalah potensi interaksi serentak yang kami sarankan untuk mengecilkan yang akan diterapkan:

  • EMERGENCY. Pengecilan volume atau bisukan semua audio kecuali SAFETY hingga pastikan pengemudi mendengar suara
  • SAFETY. Hapus semua kecuali EMERGENCY untuk memastikan pengemudi mendengar suara
  • NAVIGATION. Bebek semuanya kecuali SAFETY dan EMERGENCY
  • CALL. Bebek semuanya kecuali SAFETY, EMERGENCY, dan NAVIGATION
  • VOICE. Bebek CALL_RING
  • OEM dapat menentukan tingkat kepentingan VEHICLE_SOUNDS yang aktif dan apakah mereka harus mengecilkan suara lain untuk memastikan pengemudi dapat mendengarnya.
  • MUSIC dan ANNOUNCEMENT harus diperkecil oleh semuanya. Pengecualian utama untuk hal ini adalah nada interaksi sentuh yang saat ini dimainkan sebagai SYSTEM_SOUND

Pertimbangan lain saat mengecilkan

Beberapa aplikasi/layanan seperti navigasi atau asisten mungkin menggunakan banyak pemain untuk menyelesaikan tindakan mereka. OEM harus menghindari pengurangan beban terlalu agresif berdasarkan kapan data streaming berhenti yang masuk melalui perangkat {i>output<i} ini untuk memastikan pengguna tidak segera mendapatkan ke volume penuh sebelum diperkecil kembali sebagai pemutaran berikutnya dari navigasi atau aplikasi Google Assistant dimulai.

Untuk kendaraan dengan beberapa peredam suara dengan isolasi yang cukup baik, tersedia juga opsi untuk mengarahkan audio ke area yang berbeda dari mobil, bukan mengecilkan volume. Misalnya, navigasi petunjuk dapat diarahkan ke speaker {i>headrest<i} saat musik terus diputar di seluruh kabin dengan volume normal.

Suara keselamatan yang penting

Sementara Android 11 memperkenalkan API fokus audio HAL, sampai pada HAL untuk memastikan bahwa suara yang penting keselamatan lebih diprioritaskan daripada lainnya. Meskipun HAL menyimpan fokus audio untuk USAGE_EMERGENCY, HAL tersebut tidak menjamin aplikasi dan layanan dalam Android tidak akan memutar suara. Terserah HAL untuk menentukan streaming mana dari Android yang harus dicampur atau dibisukan karena suara yang penting untuk keamanan yang dimainkan.

Mengonfigurasi UI setelan volume

AAOS memisahkan UI setelan volume dari konfigurasi grup volume (yang dapat ditempatkan seperti yang dijelaskan dalam Mengonfigurasi grup volume). Pemisahan ini memastikan bahwa tidak perubahan diperlukan jika konfigurasi grup volume berubah pada masa mendatang.

Di UI Setelan Mobil, packages/apps/Car/Settings/res/xml/car_volume_items.xml berisi elemen UI (sumber daya judul dan ikon) yang terkait dengan masing-masing elemen AudioAttributes.USAGE. File ini memberikan perenderan yang wajar VolumeGroups yang telah ditentukan dengan menggunakan resource yang terkait dengan mengenali penggunaan yang ada di setiap VolumeGroup.

Misalnya, contoh berikut mendefinisikan VolumeGroup sebagai menyertakan voice_communication dan voice_communication_signalling. Default implementasi UI setelan mobil merender VolumeGroup menggunakan resource terkait dengan voice_communication karena itu adalah yang 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. Setelan volume UI menggunakan CarAudioManager API berbasis VolumeGroup berikut:

  • getVolumeGroupCount() untuk mengetahui jumlah kontrol yang harus digambar.
  • getGroupMinVolume() dan getGroupMaxVolume() untuk mendapatkan batas bawah dan atas.
  • getGroupVolume() untuk mendapatkan volume saat ini.
  • registerVolumeChangeObserver() untuk mendapatkan notifikasi tentang perubahan volume.