Fokus Audio

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:

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

Interaksi fokus audio

Gambar 1. Interaksi fokus audio

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 sinkron AUDIOFOCUS_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.