Fokus audio

Sebelum memulai aliran logis, aplikasi meminta fokus audio menggunakan atribut audio yang sama seperti yang digunakan untuk aliran logis. Aplikasi harus memperhitungkan kehilangan fokus agar berfungsi seperti yang diharapkan dalam kasus penggunaan otomotif.

Meskipun mengirimkan permintaan fokus disarankan, hal ini tidak diterapkan oleh sistem. Oleh karena itu, pertimbangkan fokus sebagai sarana 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 antara CarAudioContext permintaan dan pemegang fokus saat ini. Ada tiga jenis interaksi:

  • Eksklusif
  • Menolak
  • Bersamaan

Interaksi eksklusif

Ini adalah model interaksi yang paling umum digunakan dengan Android.

Dalam interaksi eksklusif , hanya satu aplikasi yang diperbolehkan untuk mempertahankan fokus dalam satu waktu. Oleh karena itu, permintaan fokus yang masuk diberikan fokus sementara pemegang fokus yang ada kehilangan fokus. Karena kedua aplikasi memutar media, hanya satu aplikasi yang diperbolehkan untuk mempertahankan fokus. Hasilnya, permintaan fokus aplikasi yang baru dimulai dikembalikan dengan AUDIOFOCUS_REQUEST_GRANTED sementara aplikasi yang sedang memutar musik menerima peristiwa perubahan fokus dengan status kehilangan yang sesuai dengan jenis permintaan yang dibuat.

Tolak interaksi

Dengan interaksi penolakan , permintaan masuk selalu ditolak. Misalnya, saat mencoba memutar musik saat panggilan sedang berlangsung. Dalam hal ini, jika Dialer menahan 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 dikirimkan ke pemegang fokus saat ini.

Interaksi serentak

Yang unik dari AAOS adalah interaksi bersamaan . Hal ini memberikan aplikasi yang meminta fokus audio di dalam mobil kemampuan untuk mempertahankan fokus secara bersamaan dengan aplikasi lain. Agar interaksi secara bersamaan dapat terjadi, kondisi berikut harus dipenuhi. Itu:

Jika kriteria ini terpenuhi, maka permintaan fokus akan dikembalikan dengan AUDIOFOCUS_REQUEST_GRANTED sementara pemegang fokus saat ini tidak mengalami perubahan fokus. Namun, jika pemegang fokus saat ini memilih untuk menerima peristiwa yang dirahasiakan atau menjeda saat peristiwa tersebut dihindarkan, pemegang fokus saat ini akan kehilangan fokus, seperti yang terjadi pada interaksi eksklusif.

Menangani aliran bersamaan

Meskipun interaksi serentak memiliki banyak kegunaan, berhati-hatilah dalam mencampur dan menghindari tingkat perangkat keras di seluruh perangkat keluaran. Kami sangat menyarankan CarAudioContext yang diizinkan untuk diputar secara bersamaan harus dirutekan ke perangkat keluaran yang berbeda.

Dengan memiliki perangkat output terpisah untuk aliran bersamaan, hal ini memungkinkan HAL untuk menghindari salah satu aliran sebelum mencampurnya, atau mengarahkan aliran fisik ke speaker berbeda di dalam kendaraan. Jika aliran logis digabungkan dalam Android, perolehan tidak akan berubah dan dikirimkan sebagai bagian dari aliran fisik yang sama.

Misalnya, ketika navigasi dan media dikirimkan secara bersamaan, penguatan aliran media untuk sementara dapat dikurangi (atau, dikurangi) sehingga instruksi navigasi dapat didengar dengan lebih jelas. Sebagai alternatif, aliran navigasi dapat dialihkan ke speaker sisi pengemudi sementara media terus diputar di seluruh kabin.

Matriks interaksi

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

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

Karena interaksi yang terjadi secara bersamaan, pemegang fokus dapat memiliki lebih dari satu orang. Dalam hal ini, permintaan fokus yang masuk dibandingkan dengan masing-masing pemegang fokus saat ini sebelum menentukan interaksi apa yang akan diterapkan. Dalam hal ini, interaksi yang paling konservatiflah yang menang. Tolak, lalu eksklusif, dan akhirnya bersamaan.

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 disetel, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL mengubah interaksi antara permintaan fokus NAVIGATION yang masuk dan pemegang fokus CALL saat ini dari serentak menjadi rejects . Jika pengguna lebih memilih agar petunjuk navigasi tidak mengganggu panggilan, mereka dapat mengaktifkan pengaturan tersebut. Hal ini dipertahankan untuk pengguna, dan dapat diatur secara dinamis sehingga permintaan fokus berikutnya mengikuti pengaturan baru.

Fokus audio yang tertunda

Di Android 11, AAOS menambahkan dukungan untuk meminta fokus audio yang dapat ditunda . Hal ini memungkinkan permintaan fokus non-sementara ditunda ketika interaksinya dengan pemegang fokus saat ini biasanya mengakibatkan permintaan tersebut ditolak. Setelah perubahan fokus menghasilkan keadaan di mana permintaan yang tertunda bisa mendapatkan fokus, permintaan tersebut dikabulkan.

Aturan untuk permintaan fokus audio tertunda

  • Hanya permintaan non-sementara. Permintaan tertunda hanya dapat dibuat untuk sumber non-sementara agar suara sementara 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 sebesar AUDIOFOCUS_REQUEST_DELAYED .

  • Permintaan yang dapat ditunda harus memiliki OnAudioFocusChangeListener Setelah permintaan ditunda, pendengar digunakan untuk memberi tahu pemohon ketika permintaan akhirnya dikabulkan ( AUDIOFOCUS_GAIN ), atau jika kemudian ditolak ( AUDIOFOCUS_LOSS ).

Minta 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. Ketika 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
    

Manajemen fokus multi-zona

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

Untuk semua aplikasi, CarAudioService secara otomatis mengelola fokus. Zona audio permintaan fokus ditentukan oleh UserId atau UID yang terkait (untuk detailnya, lihat Perutean Audio ).

Minta audio dari beberapa zona secara bersamaan

Jika aplikasi ingin memutar audio di beberapa zona secara bersamaan, 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 bundel ini memungkinkan pemohon untuk mengganti pemetaan zona audio otomatis untuk menggunakan ID zona yang ditentukan. Oleh karena itu, aplikasi dapat mengeluarkan permintaan terpisah untuk zona audio berbeda.

Fokus audio HAL

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

HAL membuat keputusan akhir mengenai suara mana yang harus mendapat prioritas. Sejauh ini, suara darurat dan keselamatan harus diputar terlepas dari apakah HAL diberikan fokus audio atau tidak dan harus terus diputar sebagaimana mestinya meskipun HAL kehilangan fokus audio. Hal yang sama berlaku untuk semua suara yang diwajibkan oleh peraturan pemerintah.

HAL harus secara proaktif menonaktifkan streaming Android jika diperlukan saat memutar suara darurat atau penting bagi keselamatan untuk memastikannya terdengar jelas.

AudioKontrol@2.0

AudioControl HAL versi 2.0 memperkenalkan API baru berikut:

API Tujuan
IAudioControl#registerFocusListener Mendaftarkan instance IFocusListener dengan AudioControl HAL. Pendengar ini memungkinkan HAL untuk meminta dan mengabaikan fokus audio. HAl menyediakan instance ICloseHandle yang akan digunakan oleh Android untuk membatalkan pendaftaran pendengar.
IAudioControl#onAudioFocusChange Memberi tahu HAL tentang perubahan status permintaan fokus yang dibuat oleh HAL melalui IFocusListener , termasuk respons terhadap permintaan fokus awal.
IFocusListener#requestAudioFocus Permintaan fokus atas nama HAL untuk penggunaan tertentu, Id zona, dan jenis perolehan fokus.
IFocusListener#abandonAudioFocus Abaikan permintaan fokus HAL yang ada untuk penggunaan dan Id zona tertentu.

HAL dapat memiliki beberapa permintaan fokus pada saat yang sama, namun terbatas pada satu permintaan per penggunaan dan pemasangan ID zona. Android mengasumsikan HAL segera mulai memutar suara untuk suatu penggunaan setelah permintaan dibuat dan terus melakukannya hingga kehilangan fokus.

Selain registerFocusListener , permintaan ini merupakan oneway untuk memastikan bahwa Android tidak menunda HAL saat permintaan fokus diproses. HAL tidak perlu menunggu untuk mendapatkan fokus sebelum memainkan suara-suara yang penting bagi keselamatan. HAL bersifat opsional untuk mendengarkan dan merespons perubahan fokus audio melalui IAudioControl#onAudioFocusChange .

Layanan fokus audio mobil OEM

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

  • Tanpa berdiri apa pun, aplikasi fokus audio prioritas tinggi (termasuk panggilan telepon, peringatan darurat, atau pemberitahuan keselamatan) seharusnya bisa mendapatkan fokus audio baik secara sementara atau permanen.

  • Saat fokus media aktif:

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

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

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

  • Saat aplikasi fokus audio prioritas tinggi (termasuk panggilan telepon, peringatan darurat, atau pemberitahuan keselamatan) aktif, permintaan fokus audio tertunda apa pun yang masuk harus dikabulkan atau ditunda sesuai kebutuhan.

Meskipun saran di atas tidak menyeluruh, namun dapat membantu aplikasi yang meminta fokus untuk mendapatkan fokus jika tidak ada suara aktif berprioritas tinggi. Meskipun suara berprioritas tinggi aktif, permintaan fokus tertunda tetap harus dipenuhi dan harus dapat memperoleh fokus ketika suara berprioritas tinggi berhenti.