Fokus Audio

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:

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.

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