Pengelolaan volume

AAOS memiliki pengelolaan volumenya sendiri dalam CarAudioService. Hal ini menggunakan volume tetap dengan harapan bahwa volume harus diterapkan di bawah HAL oleh penguat hardware, bukan di software. Fitur ini juga mengatur perangkat output ke dalam grup volume untuk 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 benar (overlay sesuai kebutuhan):

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

Jika tanda config_useFixedVolume tidak ditetapkan (atau ditetapkan ke salah), aplikasi dapat memanggil AudioManager.setStreamVolume() dan mengubah volume menurut jenis streaming di mixer software. Hal ini mungkin tidak diinginkan karena potensi efek pada aplikasi lain dan fakta bahwa atenuasi volume di mixer software menghasilkan lebih sedikit bit signifikan yang tersedia dalam sinyal saat diterima di amplifier hardware.

Grup volume

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

Menentukan grup volume

CarAudioService menggunakan grup volume yang ditentukan di car_audio_configuration.xml:

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

Contoh penerapan car_audio_configuration.xml.

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

Mengonfigurasi peningkatan grup volume

Setiap grup volume memiliki nilai gain minimum, maksimum, dan default serta ukuran langkah. Nilai ini ditentukan 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 gain perangkat terkait dan mengonfigurasi grup sebagai berikut:

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

Karena cara konfigurasi nilai ini, Anda dapat menetapkan gain grup volume di luar rentang yang didukung untuk perangkat yang terkait dengan grup volume. Dalam hal ini, untuk perangkat tersebut, penguatan akan 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 berdasarkan urutan definisinya 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 API CarAudioManager 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. Lihat contoh yang diberikan di Menentukan grup volume di atas.

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 utama, lalu kemudian login ke zona yang terkait dengan zona audio sekunder, level volume yang dimuat dan dipertahankan untuk zona pertama akan berbeda dengan zona sekunder.

Menangani peristiwa tombol volume

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

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 yang dimaksud, sehingga diasumsikan bahwa semuanya terkait dengan zona audio utama. Saat peristiwa tombol volume diterima, CarAudioService menentukan grup volume yang akan disesuaikan dengan mengambil konteks audio untuk pemutar yang aktif, lalu menyesuaikan grup volume yang berisi perangkat output yang terkait dengan konteks audio prioritas tertinggi. Prioritas ditentukan berdasarkan pengurutan tetap yang ditentukan di CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.

Pudar dan seimbang

Kedua versi AudioControl HAL menyertakan API untuk menyetel fade dan balance di kendaraan. Ada API sistem yang sesuai untuk CarAudioManager yang meneruskan nilai ke HAL AudioControl. 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 di kanan, -1,0 sepenuhnya di kiri, dan nilai di luar rentang -1 hingga 1 adalah error.
  • setFadeTowardFront(float value) - Mengalihkan volume speaker ke 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 dapat memutuskan cara menerapkan nilai ini dan cara nilai tersebut akan ditampilkan kepada pengguna. Pembatasan ini dapat diterapkan secara ketat ke media atau di seluruh sistem untuk semua suara Android.

Android 11 juga memperkenalkan dukungan untuk menerapkan efek audio ke perangkat output. Dengan ini, Anda dapat mengelola fade dan keseimbangan secara alternatif melalui efek audio di 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 didengar dengan lebih jelas. Di AAOS, audio ducking diserahkan kepada HAL untuk diterapkan karena berpotensi ada banyak suara di luar Android yang tidak dapat dikontrol oleh OS. Di Android 11, informasi utama yang tersedia untuk HAL guna membuat keputusan peredam adalah apakah dua perangkat output memiliki streaming aktif.

Kapan harus menunduk

Meskipun setiap OEM dapat menentukan cara penanganan peredam suara oleh HAL-nya, ada beberapa panduan umum yang kami rekomendasikan. Beberapa streaming yang diputar dalam Android paling sering terjadi saat dua aplikasi/layanan memegang fokus audio secara bersamaan. Dengan mempertimbangkan hal tersebut, lihat Matriks interaksi untuk mempelajari kapan Android dapat memberikan fokus serentak dan, oleh karena itu, kapan dua streaming yang berbeda dapat diputar secara serentak.

Perhatikan bahwa setiap streaming yang digabungkan oleh Android akan dilakukan sebelum keuntungan diterapkan. Dengan demikian, setiap streaming yang harus di-duck saat diputar secara serentak dengan streaming lain harus dirutekan ke perangkat output terpisah sehingga HAL dapat menerapkan duck sebelum menggabungkannya.

Perilaku penyembunyian yang direkomendasikan

Berikut adalah potensi interaksi serentak yang sebaiknya menerapkan ducking:

  • EMERGENCY. Bisukan atau perkecil semua suara kecuali SAFETY untuk memastikan pengemudi mendengar suara
  • SAFETY. Bisukan semua kecuali EMERGENCY untuk memastikan pengemudi mendengar suara
  • NAVIGATION. Menyembunyikan semua kecuali SAFETY dan EMERGENCY
  • CALL. Menyembunyikan semua kecuali SAFETY, EMERGENCY, dan NAVIGATION
  • VOICE. Duck CALL_RING
  • OEM dapat menentukan tingkat kepentingan VEHICLE_SOUNDS aktif dan apakah mereka harus meredam suara lain untuk memastikan pengemudi mendengarnya atau tidak.
  • MUSIC dan ANNOUNCEMENT harus dihindari oleh semua hal. Pengecualian utamanya adalah nada interaksi sentuh yang saat ini diputar sebagai SYSTEM_SOUND

Pertimbangan lainnya saat menunduk

Beberapa aplikasi/layanan seperti navigasi atau asisten mungkin menggunakan beberapa pemain untuk menyelesaikan tindakannya. OEM harus menghindari penghentian yang terlalu agresif berdasarkan kapan data streaming berhenti datang melalui perangkat output ini untuk memastikan pengguna tidak sejenak mengembalikan media ke volume penuh sebelum dihentikan kembali saat pemutaran berikutnya dari aplikasi navigasi atau asisten dimulai.

Untuk kendaraan dengan beberapa panggung suara dengan isolasi yang cukup baik, ada juga opsi untuk merutekan audio ke area mobil yang berbeda, bukan menundukkan. Misalnya, petunjuk navigasi dapat diarahkan ke speaker headrest pengemudi saat musik terus diputar di seluruh kabin dengan volume normal.

Suara penting untuk keselamatan

Meskipun Android 11 memperkenalkan HAL audio focus API, HAL tetap dapat memastikan suara yang penting untuk keselamatan diprioritaskan daripada yang lain. Meskipun HAL memiliki fokus audio untuk USAGE_EMERGENCY, hal itu tidak menjamin aplikasi dan layanan dalam Android tidak akan memutar suara. HAL dapat menentukan streaming mana dari Android yang harus dicampur atau dibisukan saat suara penting keamanan diputar.

Mengonfigurasi UI setelan volume

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

Di UI Setelan Mobil, file 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 di 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 merupakan 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. UI setelan volume 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.