Fokus audio

Sebelum memulai streaming logis, aplikasi meminta fokus audio menggunakan audio seperti yang digunakan untuk streaming logis. Aplikasi harus mengikuti fokus kerugian performa yang diharapkan dalam kasus penggunaan otomotif.

Saat mengirim permintaan fokus, direkomendasikan, hal itu tidak diberlakukan oleh sistem. Oleh karena itu, pertimbangkan fokus sebagai sarana untuk secara tidak langsung mengontrol dan menghindari konflik selama pemutaran, bukan sebagai mekanisme kontrol audio utama. Kendaraan sebaiknya tidak bergantung pada sistem fokus untuk pengoperasian subsistem audio.

Memfokuskan interaksi

Untuk mendukung AAOS, permintaan fokus audio ditangani berdasarkan interaksi antara CarAudioContext permintaan dan interaksi saat ini pemegang fokus. 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 diberikan fokus, sementara fokus yang ada kehilangan fokus. Karena kedua aplikasi memutar media, hanya satu aplikasi yang diizinkan untuk menyimpan fokus. Akibatnya, permintaan fokus aplikasi yang baru dimulai akan ditampilkan dengan AUDIOFOCUS_REQUEST_GRANTED saat aplikasi yang sedang memutar musik menerima peristiwa perubahan fokus dengan status kerugian yang sesuai dengan jenis permintaan apa yang telah Anda lakukan.

Tolak interaksi

Dengan interaksi tolak, permintaan masuk akan selalu ditolak. Sebagai misalnya, saat mencoba memutar musik ketika panggilan sedang berlangsung. Di sini ini, jika Telepon menahan fokus audio untuk sebuah panggilan dan aplikasi kedua meminta fokus untuk memutar musik, aplikasi musik menerima AUDIOFOCUS_REQUEST_FAILED sebagai respons terhadap permintaan. Karena permintaan fokus ditolak, tidak ada kehilangan fokus yang akan dikirim ke holder fokus saat ini.

Interaksi serentak

Keunikan AAOS adalah interaksi serentak. Tindakan ini memberi aplikasi yang meminta audio fokus pada mobil, yaitu kemampuan untuk menyimpan fokus secara bersamaan dengan aplikasi lain. Untuk terjadi interaksi serentak, kondisi berikut harus dipenuhi. Versi:

Jika kriteria ini terpenuhi, permintaan fokus akan ditampilkan dengan AUDIOFOCUS_REQUEST_GRANTED sementara pemegang fokus saat ini tidak memiliki perubahan fokus. Namun, jika pemegang fokus saat ini memilih untuk menerima peristiwa bebek atau berhenti saat diperkecil, pemegang fokus saat ini kehilangan fokus, seperti yang terjadi dengan interaksi eksklusif.

Menangani streaming serentak

Meskipun interaksi serentak memiliki banyak kegunaan, berhati-hatilah dalam mencampur dan pengecilan volume pada tingkat perangkat keras di seluruh perangkat {i>output<i}. Kami sangat menyarankan CarAudioContext yang diizinkan untuk diputar secara serentak harus dirutekan ke perangkat output yang berbeda.

Dengan memiliki perangkat output terpisah untuk streaming serentak, hal ini memungkinkan HAL untuk mengecilkan salah satu aliran sebelum mencampurnya, atau untuk mengarahkan aliran fisik ke speaker yang berbeda di dalam kendaraan. Jika aliran data logis dicampur dalam Di Android, keuntungan tidak diubah dan dikirimkan sebagai bagian dari aliran fisik yang sama.

Misalnya, ketika navigasi dan media disampaikan secara bersamaan, untuk streaming media tersebut dapat dikurangi sementara (atau, diperkecil) sehingga instruksi navigasi dapat didengar dengan lebih jelas. Atau, navigasi streaming dapat dirutekan ke speaker sisi pengemudi saat media 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 masing-masing mewakili permintaan masuk.

Misalnya, saat aplikasi media musik memegang fokus sebagai permintaan aplikasi navigasi fokus, matriks menunjukkan bahwa kedua interaksi dapat dimainkan secara bersamaan, dengan mengasumsikan kriteria lain untuk interaksi serentak akan terpenuhi.

Karena interaksi serentak, pengguna bisa memiliki lebih dari satu holder fokus. Dalam hal ini, permintaan fokus yang masuk dibandingkan dengan masing-masing pemegang fokus saat ini sebelum menentukan interaksi apa yang akan diterapkan. Di sini maka interaksi yang paling konservatif akan menang. Tolak, 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. Bila telah ditetapkan, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL mengubah interaksi antara permintaan fokus NAVIGATION yang masuk dan CALL saat ini holder fokus dari serentak hingga ditolak. Jika pengguna lebih menyukai petunjuk navigasi tidak mengganggu panggilan, mereka dapat mengaktifkan setelan. Ini dipertahankan untuk pengguna, dan dapat diatur secara dinamis sehingga fokus selanjutnya permintaan tersebut mengikuti setelan baru.

Fokus audio dapat ditunda

Di Android 11, AAOS menambahkan dukungan untuk meminta fokus audio yang dapat tertunda. Ini memungkinkan permintaan fokus non-sementara tertunda ketika interaksi mereka dengan pemegang fokus saat ini biasanya akan menyebabkan mereka ditolak. Setelah perubahan fokus menghasilkan keadaan di mana permintaan yang tertunda bisa mendapatkan fokus, permintaan tersebut disetujui.

Aturan untuk permintaan fokus audio yang tertunda

  • Hanya permintaan non-sementara. Permintaan tertunda hanya dapat dibuat untuk sumber non-sementara untuk menghindari pemutaran suara sementara setelah menjadi relevan.

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

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

Minta fokus yang dapat ditunda

Untuk membuat permintaan yang dapat tertunda:

  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 akan 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
    

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 mempertimbangkan apa yang menyimpan fokus di zona lain, juga tidak menyebabkan holder fokus di zona lain kehilangan fokus. Dengan fitur ini, fokus kabin utama dapat dikelola secara terpisah dari sistem hiburan di kursi belakang, sehingga tidak mengganggu pemutaran audio di satu zona dengan perubahan fokus ke zona lainnya.

Untuk semua aplikasi, CarAudioService akan otomatis mengelola fokus. Fokus zona audio permintaan ditentukan oleh UserId atau UID yang terkait (untuk mengetahui detailnya, lihat Pemilihan Rute Audio).

Meminta audio dari beberapa zona secara serentak

Jika ingin memutar audio di beberapa zona secara serentak, aplikasi harus meminta 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 zona audio otomatis pemetaan 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 aliran data eksternal. Meskipun opsional, penggunaan API ini sangat dianjurkan untuk memungkinkan suara eksternal menjadi peserta yang optimal dalam ekosistem Android dan untuk memberikan pengalaman pengguna yang mulus.

HAL membuat penentuan akhir tentang suara mana yang harus diprioritaskan. Hingga saat ini, suara yang penting bagi keselamatan dan keselamatan harus tetap diputar terlepas apakah HAL diberi 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 membisukan streaming Android yang sesuai saat diputar suara darurat atau keselamatan untuk memastikan suara tersebut terdengar dengan jelas.

AudioControl@2.0

Versi 2.0 AudioControl HAL memperkenalkan API baru ini:

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

HAL dapat memiliki beberapa permintaan fokus secara bersamaan, tetapi terbatas pada satu permintaan per penggunaan dan pemasangan ID zona. Android segera mengasumsikan HAL mulai memutar suara untuk suatu penggunaan setelah permintaan dibuat dan berlanjut untuk lakukan sampai mengabaikan fokus.

Selain registerFocusListener, permintaan ini bernilai 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. Bersifat opsional agar HAL mendengar 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 untuk beberapa komponen mobil. Sebagai Layanan Plugin Audio Mobil, plugin memungkinkan OEM mengelola permintaan fokus yang dicegat oleh audio mobil layanan. Hal ini membuat OEM lebih fleksibel dalam hal mengelola fokus sesuai kebutuhan oleh aturan dan regulasi. Dengan demikian, interaksi fokus audio mungkin berbeda antara produsen, dan dari satu wilayah ke wilayah lain. Premis dasar untuk fokus audio tetap berlaku, aplikasi tetap harus meminta fokus untuk pengelolaan audio yang lebih baik untuk meningkatkan pengalaman pengguna. Secara umum, aturan tertentu masih berlaku untuk audio permintaan fokus oleh aplikasi:

  • Tanpa posisi, fokus audio prioritas tinggi (termasuk panggilan telepon, aplikasi peringatan darurat, atau notifikasi keselamatan), aplikasi harus dapat memperoleh audio fokus 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 navigasi berfokus secara bersamaan atau eksklusif.

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

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

Meskipun saran di atas tidak lengkap, saran tersebut dapat membantu aplikasi yang meminta fokus untuk mendapatkan fokus jika tidak ada suara prioritas tinggi yang aktif. Meskipun masih tinggi suara prioritas aktif, permintaan fokus yang tertunda harus tetap dipatuhi dan bisa mendapatkan fokus saat suara prioritas tinggi berhenti.