Sebelum memulai streaming logis, aplikasi harus meminta fokus audio menggunakan atribut audio yang sama seperti yang digunakan untuk streaming logisnya. Meskipun pengiriman permintaan fokus tersebut direkomendasikan, permintaan tersebut tidak diberlakukan oleh sistem. Beberapa aplikasi mungkin secara eksplisit melewati pengiriman permintaan untuk mencapai perilaku tertentu (misalnya, untuk sengaja memutar suara selama panggilan telepon).
Oleh karena itu, Anda harus mempertimbangkan fokus sebagai cara untuk mengontrol dan menghilangkan konflik pemutaran secara tidak langsung, 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, tolak, dan serentak.
Interaksi eksklusif
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 holder fokus yang ada
kehilangan fokus. Contohnya adalah saat pengguna memulai aplikasi musik baru saat
musik sudah diputar di aplikasi yang ada. Karena keduanya memutar media, hanya
salah satu aplikasi yang diizinkan untuk mempertahankan fokus pada satu waktu. Akibatnya, permintaan fokus
aplikasi yang baru dimulai akan ditampilkan dengan AUDIOFOCUS_REQUEST_GRANTED
dan
aplikasi yang saat ini 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.
Menolak interaksi
Dengan interaksi tolak, permintaan yang masuk selalu ditolak. Mencoba memutar
musik saat panggilan sedang berlangsung adalah contoh interaksi yang ditolak. Dalam hal ini,
jika alat pilih saat ini memegang fokus audio untuk panggilan dan aplikasi kedua meminta
fokus untuk memutar musik, aplikasi musik akan menerima AUDIOFOCUS_REQUEST_FAILED
sebagai respons atas permintaannya. Karena permintaan fokus ditolak, tidak ada kehilangan fokus jenis apa pun
yang dikirim ke holder fokus saat ini.
Interaksi serentak
Yang paling unik dari AAOS adalah interaksi serentak. Hal ini memberi aplikasi yang meminta fokus audio di mobil kemampuan untuk mempertahankan fokus secara bersamaan dengan aplikasi lain. Agar interaksi serentak dapat terjadi, kondisi berikut harus terpenuhi. Bagian:
- Permintaan fokus yang masuk harus meminta
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
. - Holder fokus saat ini tidak
setPauseWhenDucked(true)
. - Holder fokus saat ini tidak memilih untuk 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
berhenti sementara saat duck, holder fokus saat ini akan kehilangan fokus seperti halnya interaksi
eksklusif.
Menangani streaming serentak
Meskipun interaksi serentak memiliki banyak aplikasi yang berguna, OEM harus menangani
pencampuran dan peredam suara di tingkat hardware di seluruh perangkat output. Oleh karena itu, sebaiknya
CarAudioContext
hanya dirutekan ke perangkat output
yang sama dengan CarAudioContext
yang tidak dapat diputar secara serentak. 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, gain-nya tidak akan diubah
dan dikirim sebagai bagian dari aliran fisik yang sama.
Misalnya, saat navigasi dan media dikirimkan secara bersamaan, gain untuk streaming media dapat dikurangi untuk sementara (di-duck) 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
.
Baris mewakili CarAudioContext
holder fokus saat ini dan kolom
mewakili permintaan yang masuk.
Melihat contoh, saat aplikasi media musik saat ini memegang fokus dan aplikasi navigasi meminta fokus, matriks menunjukkan bahwa kedua interaksi tersebut dapat diputar secara serentak, dengan asumsi kriteria lain untuk Interaksi serentak terpenuhi.
Karena interaksi serentak, lebih dari satu holder fokus dapat ada. Dalam hal ini, permintaan fokus yang masuk dibandingkan dengan setiap pemegang fokus saat ini sebelum memutuskan jenis interaksi yang akan diterapkan. Dalam hal ini, interaksi yang paling konservatif akan menang (menolak, lalu eksklusif, dan terakhir serentak).
Dalam tabel berikut, interaksi fokus antara CarAudioContext untuk permintaan fokus yang masuk (kolom) dan konteks holder fokus yang ada (baris) disediakan. Setiap sel mewakili jenis interaksi yang diharapkan untuk kedua konteks tersebut.
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. 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 tolak.
Jadi, jika pengguna tidak ingin petunjuk navigasi mengganggu panggilan mereka,
mereka dapat mengaktifkan setelan ini. Nilai ini dipertahankan untuk pengguna, dan dapat ditetapkan secara dinamis
sehingga permintaan fokus berikutnya mematuhi nilai setelan 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-transien tertunda saat interaksinya dengan pemegang fokus saat ini biasanya akan menyebabkan permintaan tersebut ditolak. Setelah perubahan fokus menghasilkan status tempat permintaan yang tertunda dapat mendapatkan fokus, permintaan akan diberikan.
Aturan untuk permintaan fokus audio yang tertunda
- Khusus permintaan non-transien - seperti yang disebutkan sebelumnya, permintaan tertunda hanya dapat dibuat untuk sumber non-transien. Hal ini untuk menghindari suara sementara yang 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 asli yang tertunda
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();
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, pemroses 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
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 menahan fokus di zona lain, atau menyebabkan pemegang fokus di zona lain kehilangan fokus. Dengan hal ini, fokus kabin utama dapat dikelola secara terpisah dari sistem hiburan kursi belakang, sehingga menghindari gangguan pemutaran audio di satu zona oleh perubahan fokus di zona lain.
Untuk semua aplikasi, pengelolaan fokus ditangani oleh CarAudioService
secara otomatis. Zona audio permintaan fokus ditentukan berdasarkan
UserId
atau UID
terkait. Untuk mengetahui detailnya, lihat
Perutean Audio.
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, dengan ini aplikasi dapat mengeluarkan permintaan terpisah untuk zona audio yang berbeda.
Fokus Audio HAL
Mulai Android 11, HAL kini diaktifkan untuk meminta fokus atas nama streaming eksternal. Meskipun bersifat opsional, API ini sangat dianjurkan untuk memungkinkan suara eksternal menjadi peserta yang lebih baik dalam ekosistem Android dan memberikan pengalaman pengguna yang lebih lancar.
Perlu diingat bahwa HAL masih bertanggung jawab untuk membuat panggilan akhir terkait bunyi 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.
Demikian pula, HAL harus tetap membisukan streaming Android secara proaktif sesuai kebutuhan saat memutar suara darurat atau keamanan yang penting untuk memastikan suara tersebut terdengar dengan jelas.
AudioControl@2.0
AudioControl HAL versi 2.0 memperkenalkan beberapa API baru:
API | Tujuan |
---|---|
IAudioControl#registerFocusListener |
Mendaftarkan instance IFocusListener dengan HAL AudioControl.
Pemroses ini memungkinkan HAL meminta dan mengabaikan fokus audio. HAl diharapkan
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 . Hal ini mencakup respons terhadap permintaan fokus awal.
|
IFocusListener#requestAudioFocus |
Meminta fokus atas nama HAL untuk penggunaan, ID zona, dan jenis penguatan 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. Perhatikan bahwa Android mengasumsikan HAL segera mulai memutar suara untuk penggunaan setelah permintaan dibuat, dan terus melakukannya hingga melepaskan fokus.
Selain registerFocusListener
, semua permintaan ini adalah oneway
untuk memastikan Android tidak menunda HAL saat permintaan fokus diproses. HAL
tidak boleh menunggu untuk mendapatkan fokus sebelum memutar suara yang penting bagi keselamatan. HAL
dapat memilih untuk memproses dan merespons perubahan fokus audio melalui
IAudioControl#onAudioFocusChange
, meskipun dianjurkan jika sesuai.