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 yang sedang memutar musik 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:
Permintaan fokus masuk harus meminta AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
Holder fokus saat ini tidak setPauseWhenDucked(true)
Holder fokus saat ini memilih untuk tidak menerima peristiwa duck
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
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 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 di bawah 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.
Gambar 1. Matriks interaksi fokus audio.
Navigasi selama panggilan telepon
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 sinkronAUDIOFOCUS_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:
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();
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; }
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
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 Pemilihan rute 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 permintaan fokus 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 untuk 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 masih 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, pemberitahuan darurat, atau notifikasi keselamatan), 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 secara 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 secara eksklusif.
Saat aplikasi fokus audio prioritas tinggi (termasuk panggilan telepon, notifikasi darurat, atau notifikasi keselamatan) aktif, setiap permintaan fokus audio tertunda yang masuk 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 suara berprioritas tinggi aktif, permintaan fokus yang tertunda tetap harus dihormati dan harus dapat mendapatkan fokus saat suara berprioritas tinggi berhenti.