Fokus audio

Sebelum memulai streaming logis, aplikasi meminta fokus audio menggunakan atribut audio yang sama seperti yang digunakan untuk streaming logis. Aplikasi harus memperhatikan hilangnya fokus agar berperforma seperti yang diharapkan dalam kasus penggunaan otomotif.

Meskipun direkomendasikan, pengiriman permintaan fokus tidak diberlakukan oleh sistem. Oleh karena itu, pertimbangkan fokus sebagai cara untuk mengontrol secara tidak langsung dan menghindari konflik selama pemutaran, bukan sebagai mekanisme kontrol audio utama. Kendaraan tidak boleh bergantung pada sistem fokus untuk pengoperasian subsistem audio.

Interaksi fokus

Untuk mendukung AAOS, permintaan fokus audio ditangani berdasarkan interaksi yang telah ditentukan sebelumnya antara CarAudioContext permintaan dan pemegang fokus saat ini. Ada tiga jenis interaksi:

  • Eksklusif
  • Tolak
  • Concurrent

Interaksi eksklusif

Ini adalah model interaksi yang paling umum digunakan dengan Android.

Dalam interaksi eksklusif, hanya satu aplikasi yang diizinkan untuk mempertahankan fokus pada satu waktu. Oleh karena itu, permintaan fokus yang masuk akan diberi fokus saat pemegang fokus yang ada kehilangan fokus. Karena kedua aplikasi memutar media, hanya satu aplikasi yang diizinkan untuk mempertahankan fokus. Akibatnya, permintaan fokus aplikasi yang baru dimulai ditampilkan dengan AUDIOFOCUS_REQUEST_GRANTED saat aplikasi musik yang sedang diputar menerima peristiwa perubahan fokus dengan status hilang yang sesuai dengan jenis permintaan yang dibuat.

Menolak interaksi

Dengan interaksi tolak, permintaan masuk selalu ditolak. Misalnya, saat mencoba memutar musik saat panggilan sedang berlangsung. Dalam hal ini, jika Telepon memiliki fokus audio untuk panggilan dan aplikasi kedua meminta fokus untuk memutar musik, aplikasi musik akan menerima AUDIOFOCUS_REQUEST_FAILED sebagai respons terhadap permintaan tersebut. Karena permintaan fokus ditolak, tidak ada kehilangan fokus yang dikirim ke pemegang fokus saat ini.

Interaksi serentak

Interaksi serentak adalah unik untuk AAOS. Hal ini memberi aplikasi yang meminta fokus audio di mobil kemampuan untuk mempertahankan fokus secara serentak dengan aplikasi lain. Agar interaksi serentak dapat terjadi, kondisi berikut harus terpenuhi. The:

Jika kriteria ini terpenuhi, permintaan fokus akan ditampilkan dengan AUDIOFOCUS_REQUEST_GRANTED, sedangkan holder fokus saat ini tidak memiliki perubahan fokus. Namun, jika holder fokus saat ini memilih untuk menerima peristiwa duck atau dijeda saat duck, holder fokus saat ini akan kehilangan fokus, seperti yang terjadi dengan interaksi eksklusif.

Menangani streaming serentak

Meskipun interaksi serentak memiliki banyak kegunaan, berhati-hatilah saat melakukan pencampuran dan penyamaran pada tingkat hardware di seluruh perangkat output. Sebaiknya instance CarAudioContext yang diizinkan untuk diputar secara serentak harus diarahkan ke perangkat output yang berbeda.

Dengan memiliki perangkat output terpisah untuk streaming serentak, HAL dapat menyembunyikan salah satu streaming sebelum mencampurnya, atau merutekan streaming fisik ke speaker yang berbeda di kendaraan. Jika aliran logis dicampur dalam Android, penguatan tidak akan diubah dan dikirimkan sebagai bagian dari aliran fisik yang sama.

Misalnya, saat navigasi dan media dikirim secara bersamaan, gain untuk streaming media dapat dikurangi untuk sementara (atau, diredam) sehingga petunjuk navigasi dapat didengar dengan lebih jelas. Atau, streaming navigasi dapat dirutekan ke speaker sisi pengemudi saat media terus diputar di seluruh kabin.

Matriks interaksi

Tabel ini menunjukkan matriks interaksi seperti yang ditentukan oleh CarAudioService. Setiap baris mewakili CarAudioContext holder fokus saat ini dan setiap kolom mewakili permintaan yang masuk.

Misalnya, saat aplikasi media musik mempertahankan fokus saat aplikasi navigasi meminta fokus, matriks menunjukkan bahwa kedua interaksi dapat diputar secara serentak, dengan asumsi kriteria lain untuk interaksi serentak terpenuhi.

Karena interaksi serentak, Anda dapat memiliki lebih dari satu holder fokus. Dalam hal ini, permintaan fokus yang masuk dibandingkan dengan setiap holder fokus saat ini sebelum menentukan interaksi yang akan diterapkan. Dalam hal ini, interaksi yang paling konservatif akan menang. Menolak, lalu eksklusif, dan akhirnya serentak.

Matriks interaksi fokus audio

Gambar 1. Matriks interaksi fokus audio.

Di Android 11, setelan pengguna baru diperkenalkan untuk memungkinkan pengguna mengubah perilaku interaksi antara navigasi dan panggilan telepon. Jika ditetapkan, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL akan mengubah interaksi antara permintaan fokus NAVIGATION yang masuk dan holder fokus CALL saat ini dari serentak menjadi menolak. Jika pengguna lebih memilih agar petunjuk navigasi tidak mengganggu panggilan, mereka dapat mengaktifkan setelan tersebut. Hal ini akan dipertahankan untuk pengguna, dan dapat ditetapkan secara dinamis sehingga permintaan fokus berikutnya mematuhi setelan baru.

Fokus audio yang dapat ditunda

Di Android 11, AAOS menambahkan dukungan untuk meminta fokus audio yang dapat ditunda. Hal ini memungkinkan permintaan fokus non-transien tertunda saat interaksinya dengan holder fokus saat ini biasanya akan menyebabkannya ditolak. Setelah perubahan fokus menghasilkan status saat permintaan tertunda dapat memperoleh fokus, permintaan akan diberikan.

Aturan untuk permintaan fokus audio yang tertunda

  • Hanya permintaan non-transien. Permintaan yang tertunda hanya dapat dilakukan untuk sumber non-transien agar suara transien tidak diputar lama setelah relevan.

  • Hanya satu permintaan yang dapat ditunda dalam satu waktu. Jika permintaan yang dapat ditunda dibuat saat sudah ada permintaan yang tertunda, permintaan tertunda asli akan menerima peristiwa perubahan AUDIOFOCUS_LOSS dan permintaan baru akan menerima respons sinkron AUDIOFOCUS_REQUEST_DELAYED.

  • Permintaan yang dapat ditunda harus memiliki OnAudioFocusChangeListener. Setelah permintaan ditunda, pemroses digunakan untuk memberi tahu pemohon saat permintaan akhirnya disetujui (AUDIOFOCUS_GAIN), atau jika ditolak nanti (AUDIOFOCUS_LOSS).

Meminta fokus yang dapat ditunda

Untuk membuat permintaan yang dapat ditunda:

  1. Gunakan AudioFocusRequest.Builder#setAcceptsDelayedFocusGain.

    mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener();
    
    mDelayedFocusRequest = new AudioFocusRequest
         .Builder(AudioManager.AUDIOFOCUS_GAIN)
         .setAudioAttributes(mMusicAudioAttrib)
         .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener)
         .setForceDucking(false)
         .setWillPauseWhenDucked(false)
         .setAcceptsDelayedFocusGain(true)
         .build();
    
  2. Saat membuat permintaan, tangani respons AUDIOFOCUS_REQUEST_DELAYED:

    int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest);
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        // start audio playback
        return;
    }
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
         // audio playback delayed to audio focus listener
         return;
    }
    
  3. Saat permintaan tertunda, pemroses fokus menangani perubahan fokus:

    private final class MediaWithDelayedFocusListener implements
    OnAudioFocusChangeListener {
           @Override
           public void onAudioFocusChange(int focusChange) {
               synchronized (mLock) {
                   switch (focusChange) {
                       case AudioManager.AUDIOFOCUS_GAIN:
                            // Start focus playback
                       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                            // Pause media transiently
                       case AudioManager.AUDIOFOCUS_LOSS:
                            // Stop media
    

Penghapusan yang diberlakukan sistem

Android 15 memperkenalkan audio fade yang diberlakukan sistem di AAOS. Di Android, fokus audio tidak diterapkan oleh sistem. Jadi, meskipun developer aplikasi didorong untuk mematuhi pedoman fokus audio, jika aplikasi terus diputar dengan keras bahkan setelah kehilangan fokus audio, sistem tidak dapat mencegahnya.

Dalam lingkungan otomotif yang sangat penting bagi keselamatan, kepatuhan terhadap fokus audio sangat penting untuk meminimalkan gangguan pengemudi. Dengan fitur ini, framework audio kini otomatis memudarkan aplikasi yang kehilangan fokus audio, untuk pengalaman audio yang lebih terkontrol dan dapat diprediksi.

Peningkatan ini membantu memastikan bahwa aplikasi mematuhi keputusan hilangnya fokus audio seperti yang ditentukan oleh matriks interaksi, sehingga mencegah konflik pemutaran audio.

Desain tingkat tinggi

Gambar berikut menunjukkan desain dan dukungan tingkat tinggi untuk fitur hilang fokus di mobil:

Desain tingkat tinggi untuk fitur memudar yang diterapkan sistem

Gambar 2. Desain tingkat tinggi untuk fitur memudar yang diterapkan sistem.

  • Pemudaran yang ditargetkan: Penerapan pemudaran sistem di Android 15 dirancang khusus untuk situasi saat aplikasi kehilangan fokus audio, tetapi terus memutar audio.
  • Mekanisme memudar: Saat aplikasi kehilangan fokus audio ke aplikasi baru yang meminta:
    • Framework audio akan otomatis memudarkan audio aplikasi yang kehilangan fokus.
    • Setelah memudar, streaming audio akan dibisukan oleh sistem.
    • Aplikasi kemudian menerima notifikasi hilangnya fokus audio.
    • Aplikasi yang berperilaku tidak baik akan dibisukan hingga mendapatkan kembali fokus audio.
    • Logika defaultnya adalah memudar aplikasi yang memudar setelah 2 detik. Namun, OEM dapat mengonfigurasinya ke nilai waktu tunggu apa pun.
    • Framework audio menggunakan konfigurasi OEM untuk operasi memudar dan muncul.
  • File konfigurasi OEM: Android 15 menyertakan file konfigurasi baru, car_audio_fade_configuration.xml:

    • File ini memungkinkan OEM menentukan kriteria kapan penerapan fokus audio sistem diterapkan ke aplikasi yang kehilangan fokus.
    • Framework audio menerapkan memudar dan membisukan hanya jika aplikasi yang kalah cocok dengan aturan yang ditentukan OEM dalam file XML ini.
    • Hal ini memberikan mekanisme bagi OEM untuk menyesuaikan perilaku fitur berdasarkan karakteristik aplikasi atau jenis penggunaan audio.
  • Kontrol fitur dengan RRO: Flag fitur runtime resource overlay (RRO) baru, audioUseFadeManagerConfiguration, telah diperkenalkan untuk mengaktifkan atau menonaktifkan fitur ini:

    • Fitur ini dinonaktifkan secara default.
    • Untuk mengaktifkan hilangnya fokus audio yang diberlakukan sistem, OEM harus menetapkan tanda ini ke true.
    • Meskipun framework audio mobil mengharapkan definisi konfigurasi fade yang valid saat tanda diaktifkan, tidak adanya definisi tersebut tidak otomatis menghasilkan pengecualian fatal.
    • Semua aplikasi konfigurasi memudar harus memiliki definisi memudar yang cocok. Merupakan error fatal untuk memanggil konfigurasi fade (dengan namanya) sebagai bagian dari konfigurasi audio mobil tanpa memberikan definisi yang valid.
    • Jika tanda dinonaktifkan, semua definisi konfigurasi memudar dan referensi konfigurasi apa pun akan diabaikan.

Konfigurasi pengelola memudar

Framework audio Android 15 memperkenalkan FadeManagerConfiguration terpadu untuk memberi OEM kontrol terperinci atas perilaku audio yang memudar. Framework ini diilustrasikan dalam Gambar 3:

Konfigurasi pengelola memudar

Gambar 3. Konfigurasi pengelola memudar.

Konfigurasi ini mencakup:

  • Properti transisi pudar: Setelan untuk pudar dan muncul.
    • Dapat ditentukan dengan penggunaan atau atribut audio tertentu.
    • Memungkinkan setelan durasi kustom.
    • Setelan ini digunakan untuk membuat VolumeShaper.Configuration.
  • Kebijakan memudar: Aturan yang mengatur kapan pemudaran terjadi.
    • Tombol global untuk mengaktifkan atau menonaktifkan memudar.
    • Daftar penggunaan audio yang dapat dikonfigurasi dan dapat di-fade (memenuhi syarat untuk di-fade saat kehilangan fokus).
    • Daftar pengecualian (tidak dapat disamarkan) mencegah sumber audio penting atau yang ditetapkan disamarkan. Daftar ini dapat didasarkan pada:
      • Jenis konten
      • Atribut audio
      • UID aplikasi (hanya dapat ditetapkan selama runtime)

Konfigurasi OEM

Di bagian ini, kita akan melihat penyesuaian OEM yang tersedia.

File XML konfigurasi audio mobil memudar

Android 15 memperkenalkan file konfigurasi baru, car_audio_fade_configuration.xml, yang memungkinkan penyesuaian OEM yang ekstensif terhadap perilaku audio yang memudar selama kehilangan fokus.

  • File XML ini memungkinkan definisi beberapa konfigurasi memudar yang berbeda, yang masing-masing memerlukan nama unik untuk referensi silang dalam car_audio_configuration.xml.
  • Konfigurasi ini dapat diterapkan secara fleksibel di berbagai zona audio dan konfigurasi zona.
  • Secara khusus, setiap konfigurasi memudar hanya menerima nilai durasi dalam milidetik, yang kemudian digunakan sistem untuk menghasilkan VolumeShaper.Configuration yang sesuai secara internal.

Untuk panduan implementasi praktis, lihat contoh konfigurasi yang disediakan untuk emulator yang terletak di device/generic/car/emulator/audio/car_audio_fade_configuration.xml.

File XML konfigurasi audio mobil

Android 15 memperkenalkan file car_audio_configuration.xml yang diperbarui, sekarang versi 4, yang menggabungkan tag applyFadeConfigs dan fadeConfig baru. Tag applyFadeConfigs dapat berisi beberapa definisi fadeConfig, sehingga memungkinkan konfigurasi memudar yang fleksibel. Setiap definisi:

  • Harus menyertakan satu fadeConfig default yang ditetapkan dengan isDefault = true.
  • Dapat menyertakan beberapa definisi fadeConfig sementara. Konfigurasi sementara ini diterapkan secara khusus selama interaksi kehilangan fokus audio, dan hanya jika aplikasi yang memperoleh fokus audio cocok dengan kriteria yang ditentukan dalam konfigurasi sementara.

Untuk panduan implementasi praktis, lihat contoh konfigurasi yang disediakan untuk emulator yang terletak di device/generic/car/emulator/audio/car_audio_configuration.xml.

Ekstensi layanan fokus audio OEM

OEM yang menerapkan layanan fokus audio mobil kustom memiliki fleksibilitas untuk mengonfigurasi setelan audio fade dengan menyertakannya dalam OemCarAudioFocusResult. Hal ini dapat dilakukan menggunakan metode builder setAudioAttributesToCarAudioFadeConfigurationMap():

/** @see OemCarAudioFocusResult#getAudioAttributesToCarAudioFadeConfigurationMap() **/
@NonNull
public Builder setAudioAttributesToCarAudioFadeConfigurationMap(@NonNull
        Map<AudioAttributes, CarAudioFadeConfiguration> attrsToCarAudioFadeConfig) {
}

Secara khusus, OEM dapat memilih untuk menggunakan setelan memudar saat booting yang telah dikonfigurasi sebelumnya atau menerapkan konfigurasi secara dinamis melalui layanan fokus audio kustom mereka, yang menawarkan kontrol yang dapat disesuaikan.

Diagram urutan

Diagram urutan ini menggambarkan perilaku setelah pemberian fokus audio ke App2 dan hilangnya fokus audio berikutnya oleh App1:

  • Setelah layanan audio mobil mengirim hilangnya fokus audio ke App1, pemutaran dari pemutar App1 akan mengalami memudar seperti yang ditentukan oleh FadeManagerConfiguration aktif. Setelah operasi memudar selesai, App1 akan menerima callback kehilangan fokus audio standar.
  • Secara opsional, audio untuk App1 dapat di-fade kembali setelah durasi yang dapat dikonfigurasi. OEM memiliki fleksibilitas untuk menetapkan durasi ini melalui Builder#setFadeInDurationForUsage(int, long) sesuai dengan persyaratan produk spesifik mereka.

Diagram urutan untuk fitur audio mobil memudar

Gambar 4. Diagram urutan untuk fitur audio mobil yang memudar.

Pengelolaan fokus multi-zona

Untuk kendaraan dengan beberapa zona audio, fokus audio dikelola secara terpisah untuk setiap zona. Dengan demikian, permintaan ke satu zona tidak memperhitungkan apa yang memegang fokus di zona lain, atau menyebabkan pemegang fokus di zona lain kehilangan fokus. Dengan demikian, fokus kabin utama dapat dikelola secara terpisah dari sistem hiburan kursi belakang, sehingga tidak mengganggu pemutaran audio di satu zona dengan perubahan yang dilakukan dalam fokus ke zona lain.

Untuk semua aplikasi, CarAudioService secara otomatis mengelola fokus. Zona audio permintaan fokus ditentukan oleh UserId atau UID terkait (untuk mengetahui detailnya, lihat Pemetaan audio multi-zona).

Meminta audio dari beberapa zona secara serentak

Jika ingin memutar audio di beberapa zona secara serentak, aplikasi harus meminta fokus untuk setiap zona dengan menyertakan AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID dalam paket:

//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
               zoneId);

AudioAttributes attributesWithZone = new AudioAttributes.Builder()
     .setUsage(AudioAttributes.USAGE_MEDIA)
     .addBundle(bundle)
     .build();

//Create focus request using built attributesWithZone

Parameter paket ini memungkinkan pemohon mengganti pemetaan zona audio otomatis untuk menggunakan ID zona yang ditentukan. Oleh karena itu, aplikasi dapat mengeluarkan permintaan terpisah untuk zona audio yang berbeda.

Fokus audio HAL

Mulai Android 11, HAL diaktifkan untuk meminta fokus atas nama streaming eksternal. Meskipun bersifat opsional, penggunaan API ini sangat dianjurkan untuk memungkinkan suara eksternal menjadi peserta yang optimal dalam ekosistem Android dan memberikan pengalaman pengguna yang lancar.

HAL membuat keputusan akhir tentang suara mana yang harus diprioritaskan. Untuk hal ini, suara darurat dan keamanan yang penting harus diputar terlepas dari apakah HAL diberi fokus audio atau tidak dan harus terus diputar sebagaimana mestinya meskipun HAL kehilangan fokus audio. Hal yang sama berlaku untuk suara apa pun yang diwajibkan oleh peraturan pemerintah.

HAL harus secara proaktif membisukan streaming Android sebagaimana mestinya saat memutar suara darurat atau penting untuk keselamatan untuk memastikan suara tersebut terdengar dengan jelas.

AudioControl@2.0

AudioControl HAL versi 2.0 memperkenalkan API baru berikut:

API Tujuan
IAudioControl#registerFocusListener Mendaftarkan instance IFocusListener dengan HAL AudioControl. Pemroses ini memungkinkan HAL meminta dan mengabaikan fokus audio. HAl menyediakan instance ICloseHandle yang akan digunakan oleh Android untuk membatalkan pendaftaran pemroses.
IAudioControl#onAudioFocusChange Memberi tahu HAL tentang perubahan status untuk memfokuskan permintaan yang dibuat oleh HAL melalui IFocusListener, termasuk respons terhadap permintaan fokus awal.
IFocusListener#requestAudioFocus Meminta fokus atas nama HAL untuk penggunaan, ID zona, dan jenis peningkatan fokus yang ditentukan.
IFocusListener#abandonAudioFocus Menghentikan permintaan fokus HAL yang ada untuk penggunaan dan ID zona yang ditentukan.

HAL dapat memiliki beberapa permintaan fokus secara bersamaan, tetapi dibatasi hingga satu permintaan per penggunaan dan penyambungan ID zona. Android mengasumsikan bahwa HAL segera mulai memutar suara untuk penggunaan setelah permintaan dibuat dan terus melakukannya hingga mengabaikan fokus.

Selain registerFocusListener, permintaan ini adalah oneway untuk memastikan bahwa Android tidak menunda HAL saat permintaan fokus diproses. HAL seharusnya tidak menunggu untuk mendapatkan fokus sebelum memutar suara yang penting bagi keselamatan. HAL dapat memilih untuk memproses dan merespons perubahan fokus audio melalui IAudioControl#onAudioFocusChange.

Layanan fokus audio mobil OEM

Di Android 14, AAOS memperkenalkan layanan plugin OEM mobil untuk mengaktifkan konfigurasi untuk beberapa komponen mobil. Untuk Layanan Plugin Audio Mobil, layanan plugin memungkinkan OEM mengelola permintaan fokus yang dicegat oleh layanan audio mobil. Hal ini memberi OEM lebih banyak fleksibilitas dalam hal mengelola fokus seperti yang diperlukan oleh aturan dan peraturan. Dengan demikian, interaksi fokus audio dapat berbeda antar produsen, dan dari wilayah ke wilayah. Premis dasar untuk fokus audio tetap berlaku, bahwa aplikasi harus tetap meminta fokus untuk audio pengelolaan yang lebih baik guna meningkatkan pengalaman pengguna. Secara umum, aturan tertentu masih berlaku untuk permintaan fokus audio oleh aplikasi:

  • Tanpa fokus audio prioritas tinggi yang tetap (termasuk panggilan telepon, peringatan darurat, atau notifikasi keamanan), aplikasi harus dapat memperoleh fokus audio secara sementara atau permanen.

  • Saat fokus media aktif:

    • Aplikasi yang meminta fokus penggunaan panggilan harus dapat menerima panggilan secara serentak atau eksklusif.

    • Aplikasi yang meminta fokus penggunaan navigasi harus dapat menerima fokus navigasi secara serentak atau eksklusif.

    • Aplikasi yang meminta fokus penggunaan asisten harus dapat menerima fokus penggunaan secara serentak atau eksklusif.

  • Saat aplikasi fokus audio prioritas tinggi (termasuk panggilan telepon, peringatan darurat, atau notifikasi keselamatan) aktif, setiap permintaan fokus audio tertunda yang masuk harus diberikan atau ditunda sesuai kebutuhan.

Meskipun tidak lengkap, saran ini dapat membantu aplikasi yang meminta fokus untuk mendapatkan fokus jika tidak ada suara berprioritas tinggi yang aktif. Meskipun suara berprioritas tinggi aktif, permintaan fokus yang tertunda tetap harus dihormati dan harus dapat mendapatkan fokus saat suara berprioritas tinggi berhenti.