Sebelum memulai aliran logis, aplikasi harus meminta fokus audio menggunakan atribut audio yang sama seperti yang akan digunakan untuk aliran logisnya. Saat mengirim permintaan fokus seperti itu disarankan, itu tidak diberlakukan oleh sistem. Beberapa aplikasi mungkin secara eksplisit melewatkan pengiriman permintaan untuk mencapai perilaku tertentu (misalnya, dengan sengaja memutar suara selama panggilan telepon).
Untuk alasan ini, Anda harus mempertimbangkan fokus sebagai cara untuk mengontrol dan mendekonflik pemutaran secara tidak langsung, dan bukan sebagai mekanisme kontrol audio utama; kendaraan tidak boleh bergantung pada sistem fokus untuk pengoperasian subsistem audio.
Interaksi fokus
Untuk mendukung kebutuhan AAOS, permintaan fokus audio ditangani berdasarkan interaksi yang telah ditentukan sebelumnya antara CarAudioContext
permintaan dan pemegang fokus saat ini. Ada tiga jenis interaksi: eksklusif, menolak, dan bersamaan.
Interaksi eksklusif
Dalam interaksi eksklusif, hanya satu aplikasi yang diizinkan untuk mempertahankan fokus pada satu waktu. Oleh karena itu, permintaan fokus yang masuk diberikan fokus sementara pemegang fokus yang ada kehilangan fokus. Contohnya adalah ketika pengguna memulai aplikasi musik baru saat musik sudah diputar di aplikasi yang sudah ada. Karena keduanya memutar media, hanya satu aplikasi yang diizinkan untuk menahan fokus pada satu waktu. Akibatnya, permintaan fokus aplikasi yang baru dimulai akan kembali dengan AUDIOFOCUS_REQUEST_GRANTED
dan aplikasi yang sedang memutar musik akan menerima peristiwa perubahan fokus dengan status kehilangan yang sesuai dengan jenis permintaan yang dibuat. Ini adalah model interaksi yang paling sering terlihat dengan Android.
Tolak interaksi
Dengan interaksi penolakan, permintaan yang masuk selalu ditolak. Mencoba memutar musik saat panggilan sedang berlangsung adalah contoh interaksi yang ditolak. Dalam hal ini, jika dialer sedang menahan fokus audio untuk panggilan dan aplikasi kedua meminta fokus untuk memutar musik, aplikasi musik akan menerima AUDIOFOCUS_REQUEST_FAILED
sebagai tanggapan atas permintaannya. Karena permintaan fokus ditolak, tidak ada kehilangan fokus jenis apa pun yang dikirim ke pemegang fokus saat ini.
Interaksi bersamaan
Yang paling unik untuk AAOS adalah interaksi bersamaan. Ini memberikan aplikasi yang meminta fokus audio di dalam mobil kemampuan untuk menahan fokus secara bersamaan dengan aplikasi lain. Agar interaksi bersamaan berlangsung, kondisi berikut harus dipenuhi. Itu:
- Permintaan fokus yang masuk harus meminta
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
. - Pemegang fokus saat ini tidak
setPauseWhenDucked(true)
. - Pemegang fokus saat ini tidak memilih untuk menerima acara bebek.
Jika kriteria ini terpenuhi, maka permintaan fokus akan kembali dengan AUDIOFOCUS_REQUEST_GRANTED
sementara pemegang fokus saat ini tidak akan memiliki perubahan fokus. Namun, jika pemegang fokus saat ini memilih untuk menerima acara bebek atau berhenti saat menunduk, pemegang fokus saat ini akan kehilangan fokus seperti halnya dengan interaksi eksklusif.
Menangani aliran bersamaan
Sementara interaksi bersamaan memiliki banyak aplikasi yang berguna, OEM harus berhati-hati dalam mencampur dan merunduk pada tingkat perangkat keras di seluruh perangkat keluaran. Karena itu, sangat disarankan agar CarAudioContext
s hanya dirutekan ke perangkat keluaran yang sama dengan CarAudioContext
s yang tidak dapat mereka mainkan secara bersamaan. Dengan memiliki perangkat output terpisah untuk aliran bersamaan, ini memungkinkan HAL untuk merunduk salah satu aliran sebelum mencampurnya bersama-sama, atau untuk mengarahkan aliran fisik ke speaker yang berbeda di dalam kendaraan. Jika aliran logis digabungkan dalam Android, keuntungannya tidak akan berubah dan akan dikirimkan sebagai bagian dari aliran fisik yang sama.
Misalnya, ketika navigasi dan media dikirimkan secara bersamaan, penguatan aliran media untuk sementara waktu dapat dikurangi (merunduk) sehingga instruksi navigasi dapat terdengar lebih jelas. Atau, 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 didefinisikan oleh CarAudioService
. Baris mewakili CarAudioContext
pemegang fokus saat ini dan kolom mewakili permintaan masuk.
Melihat contoh, di mana aplikasi media musik saat ini memegang fokus dan fokus permintaan aplikasi navigasi, matriks menunjukkan bahwa dua interaksi dapat diputar secara bersamaan, dengan asumsi kriteria lain untuk interaksi Serentak terpenuhi.
Karena interaksi bersamaan, mungkin ada lebih dari satu pemegang fokus. Dalam hal ini, permintaan fokus yang masuk akan dibandingkan dengan masing-masing pemegang fokus saat ini sebelum memutuskan jenis interaksi apa yang akan diterapkan. Dalam hal ini, interaksi yang paling konservatif menang (menolak, lalu eksklusif, dan akhirnya bersamaan).
Dalam tabel berikut, interaksi fokus antara CarAudioContext untuk permintaan fokus masuk (kolom) dan konteks pemegang fokus yang ada (baris) disediakan. Setiap sel mewakili tipe interaksi yang diharapkan untuk dua konteks, di mana:
- R: Tolak interaksi
- E: Interaksi eksklusif
- C: Interaksi bersamaan
Gambar 1. Interaksi fokus audio
Navigasi selama panggilan telepon
Di Android 11, setelan pengguna baru telah diperkenalkan untuk memungkinkan pengguna mengubah perilaku interaksi antara navigasi dan panggilan telepon. Saat disetel, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL
akan mengubah interaksi antara permintaan fokus NAVIGATION
yang masuk dan pemegang fokus CALL
saat ini dari bersamaan menjadi menolak . Jadi, jika pengguna memilih untuk tidak memiliki instruksi navigasi yang mengganggu panggilan mereka, mereka dapat mengaktifkan pengaturan ini. Ini bertahan untuk pengguna, dan dapat diatur secara dinamis agar permintaan fokus berikutnya menghormati nilai pengaturan baru.
Fokus audio yang dapat ditunda
Di Android 11, AAOS telah 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 dapat memperoleh fokus, permintaan akan dikabulkan.
Aturan untuk permintaan fokus audio yang tertunda
- Hanya permintaan non-sementara - seperti yang disebutkan sebelumnya, permintaan tertunda hanya dapat dibuat untuk sumber non-sementara. Ini untuk menghindari pemutaran suara sementara lama setelah itu relevan.
- Hanya satu permintaan yang dapat ditunda pada satu waktu - Jika permintaan yang dapat ditunda dibuat saat sudah ada permintaan 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 tertunda, pendengar akan digunakan untuk memberi tahu pemohon ketika permintaan akhirnya dikabulkan (AUDIOFOCUS_GAIN
), atau jika ditolak nanti (AUDIOFOCUS_LOSS
).
Minta fokus yang tertunda
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();
Kemudian, 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, pendengar fokus bertanggung jawab untuk 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 akan dikelola secara independen untuk setiap zona. Dengan demikian, permintaan ke satu zona tidak akan memperhitungkan apa yang menahan fokus di zona lain, juga tidak akan menyebabkan pemegang fokus di zona lain kehilangan fokus. Dengan ini, fokus kabin utama dapat diatur secara terpisah dari sistem hiburan kursi belakang, sehingga menghindari gangguan pemutaran audio di satu zona oleh perubahan fokus di zona lain.
Untuk semua aplikasi, manajemen fokus ditangani oleh CarAudioService
secara otomatis. Zona audio permintaan fokus ditentukan berdasarkan UserId
atau UID
yang terkait. Untuk detailnya, lihat Perutean Audio .
Meminta 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 bundel:
//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 mengganti pemetaan zona audio otomatis untuk menggunakan ID zona yang ditentukan. Oleh karena itu, dengan ini aplikasi dapat mengeluarkan permintaan terpisah untuk zona audio yang berbeda.
Fokus Audio HAL
Mulai Android 11, HAL sekarang diaktifkan untuk meminta fokus atas nama streaming eksternal. Meskipun opsional, API ini sangat dianjurkan untuk memungkinkan suara eksternal menjadi partisipan yang lebih baik dalam ekosistem Android dan memberikan pengalaman pengguna yang lebih lancar.
Ingatlah bahwa HAL masih bertanggung jawab untuk membuat panggilan terakhir seputar suara apa yang harus diprioritaskan. Sejauh ini, suara kritis darurat dan keselamatan harus dimainkan terlepas dari apakah HAL diberikan fokus audio atau tidak, dan harus terus diputar sebagaimana mestinya bahkan jika HAL kehilangan fokus audio. Hal yang sama berlaku untuk suara apa pun yang diwajibkan oleh peraturan.
Sejalan dengan itu, HAL harus tetap secara proaktif membisukan aliran Android sebagaimana mestinya saat memutar suara darurat atau kritis keselamatan untuk memastikannya terdengar dengan jelas.
AudioControl@2.0
AudioControl HAL versi 2.0 memperkenalkan beberapa API baru:
API | Tujuan |
---|---|
IAudioControl#registerFocusListener | Mendaftarkan instance IFocusListener dengan AudioControl HAL. Pendengar ini memungkinkan HAL untuk meminta dan mengabaikan fokus audio. HAl diharapkan menyediakan instance ICloseHandle untuk digunakan oleh Android untuk membatalkan pendaftaran listener. |
IAudioControl#onAudioFocusChange | Memberi tahu HAL tentang perubahan status untuk memfokuskan permintaan yang dibuat oleh HAL melalui IFocusListener . Ini termasuk tanggapan terhadap permintaan fokus awal. |
IFocusListener#requestAudioFocus | Permintaan fokus atas nama HAL untuk penggunaan tertentu, ID zona, dan jenis penguatan fokus. |
IFocusListener#abandonAudioFocus | Abaikan permintaan fokus HAL yang ada untuk penggunaan dan ID zona yang ditentukan. |
HAL dapat memiliki beberapa permintaan fokus secara bersamaan, tetapi terbatas pada satu permintaan per penggunaan dan pemasangan ID zona. Perhatikan bahwa Android menganggap HAL akan segera mulai memutar suara untuk penggunaan setelah permintaan dibuat, dan akan terus melakukannya hingga mengabaikan fokus.
Selain registerFocusListener
, permintaan ini semuanya oneway
untuk memastikan bahwa Android tidak menunda HAL saat permintaan fokus diproses. HAL tidak boleh menunggu untuk mendapatkan fokus sebelum memainkan suara yang kritis terhadap keselamatan. Ini opsional bagi HAL untuk mendengarkan dan merespons perubahan fokus audio melalui IAudioControl#onAudioFocusChange
, meskipun dianjurkan bila perlu.