Android Automotive OS (AAOS) dibangun di atas tumpukan audio Android inti untuk mendukung kasus penggunaan pengoperasian sebagai sistem infotainment di dalam kendaraan. AAOS bertanggung jawab atas suara infotainment (yaitu, media, navigasi, dan komunikasi) namun tidak secara langsung bertanggung jawab atas bunyi lonceng dan peringatan yang memiliki persyaratan ketersediaan dan waktu yang ketat. Meskipun AAOS memberikan sinyal dan mekanisme untuk membantu kendaraan mengatur audio, pada akhirnya kendaraanlah yang menentukan suara apa yang harus dimainkan untuk pengemudi dan penumpang, memastikan suara penting keselamatan dan suara peraturan terdengar dengan baik tanpa gangguan.
Saat Android mengelola pengalaman media kendaraan, sumber media eksternal seperti radio tuner harus diwakili oleh aplikasi, yang dapat menangani fokus audio dan peristiwa media penting untuk sumber tersebut.
Android 11 menyertakan perubahan berikut pada dukungan audio terkait otomotif:
- Pemilihan zona audio otomatis berdasarkan ID Pengguna terkait
- Penggunaan sistem baru untuk mendukung suara khusus otomotif
- Dukungan fokus audio HAL
- Fokus audio tertunda untuk streaming non-sementara
- Pengaturan pengguna untuk mengontrol interaksi antara navigasi dan panggilan
Suara dan streaming Android
Sistem audio otomotif menangani suara dan aliran berikut:
Gambar 1. Diagram arsitektur aliran-sentris
Android mengelola suara yang berasal dari aplikasi Android, mengontrol aplikasi tersebut, dan merutekan suaranya ke perangkat output di HAL berdasarkan jenis suara:
- Aliran logis , yang dikenal sebagai sumber dalam tata nama audio inti, ditandai dengan Atribut Audio .
- Aliran fisik , yang dikenal sebagai perangkat dalam tata nama audio inti, tidak memiliki informasi konteks setelah pencampuran.
Untuk keandalan, suara eksternal (berasal dari sumber independen seperti lonceng peringatan sabuk pengaman) dikelola di luar Android, di bawah HAL, atau bahkan di perangkat keras terpisah. Pelaksana sistem harus menyediakan mixer yang menerima satu atau lebih aliran input suara dari Android dan kemudian menggabungkan aliran tersebut dengan cara yang sesuai dengan sumber suara eksternal yang dibutuhkan oleh kendaraan.
Implementasi HAL dan mixer eksternal bertanggung jawab untuk memastikan suara eksternal yang penting bagi keselamatan terdengar dan untuk mencampur aliran yang disediakan Android dan mengarahkannya ke speaker yang sesuai.
suara Android
Aplikasi mungkin memiliki satu atau beberapa pemutar yang berinteraksi melalui API Android standar (misalnya, AudioManager untuk kontrol fokus atau MediaPlayer untuk streaming) untuk memancarkan satu atau beberapa aliran data audio yang logis. Data ini dapat berupa saluran tunggal mono atau 7.1 surround, namun disalurkan dan diperlakukan sebagai sumber tunggal. Aliran aplikasi dikaitkan dengan AudioAttributes yang memberikan petunjuk kepada sistem tentang bagaimana audio harus diungkapkan.
Aliran logis dikirim melalui AudioService dan dirutekan ke satu (dan hanya satu) aliran keluaran fisik yang tersedia, yang masing-masing merupakan keluaran mixer dalam AudioFlinger. Setelah atribut audio digabungkan ke aliran fisik, atribut tersebut tidak lagi tersedia.
Setiap aliran fisik kemudian dikirimkan ke Audio HAL untuk dirender pada perangkat keras. Dalam aplikasi otomotif, rendering perangkat keras dapat berupa codec lokal (mirip dengan perangkat seluler) atau prosesor jarak jauh di seluruh jaringan fisik kendaraan. Apa pun yang terjadi, tugas implementasi Audio HAL adalah mengirimkan data sampel aktual dan membuatnya dapat didengar.
Aliran eksternal
Aliran suara yang tidak boleh dirutekan melalui Android (untuk alasan sertifikasi atau pengaturan waktu) dapat dikirim langsung ke mixer eksternal. Mulai Android 11, HAL kini dapat meminta fokus untuk suara eksternal ini guna memberi tahu Android agar dapat mengambil tindakan yang tepat seperti menjeda media atau mencegah orang lain mendapatkan fokus.
Jika streaming eksternal merupakan sumber media yang harus berinteraksi dengan lingkungan suara yang dihasilkan Android (misalnya, menghentikan pemutaran MP3 saat tuner eksternal diaktifkan), streaming eksternal tersebut harus diwakili oleh aplikasi Android. Aplikasi semacam itu akan meminta fokus audio atas nama sumber media, bukan HAL, dan akan merespons notifikasi fokus dengan memulai/menghentikan sumber eksternal jika diperlukan agar sesuai dengan kebijakan fokus Android. Aplikasi ini juga bertanggung jawab menangani peristiwa penting media seperti putar/jeda. Salah satu mekanisme yang disarankan untuk mengontrol perangkat eksternal tersebut adalah HwAudioSource .
Perangkat keluaran
Pada tingkat Audio HAL, jenis perangkat AUDIO_DEVICE_OUT_BUS
menyediakan perangkat keluaran umum untuk digunakan dalam sistem audio kendaraan. Perangkat bus mendukung port yang dapat dialamatkan (di mana setiap port adalah titik akhir untuk aliran fisik) dan diharapkan menjadi satu-satunya jenis perangkat keluaran yang didukung di kendaraan.
Implementasi sistem dapat menggunakan satu port bus untuk semua suara Android, dalam hal ini Android menggabungkan semuanya dan mengirimkannya sebagai satu aliran. Alternatifnya, HAL dapat menyediakan satu port bus untuk setiap CarAudioContext
untuk memungkinkan pengiriman jenis suara apa pun secara bersamaan. Hal ini memungkinkan implementasi HAL untuk mencampur dan mengurangi suara yang berbeda sesuai keinginan.
Penetapan konteks audio ke perangkat keluaran dilakukan melalui car_audio_configuration.xml
.
Masukan mikrofon
Saat merekam audio, Audio HAL menerima panggilan openInputStream
yang menyertakan argumen AudioSource
yang menunjukkan bagaimana input mikrofon harus diproses.
Sumber VOICE_RECOGNITION
(khususnya Asisten Google) mengharapkan aliran mikrofon stereo yang memiliki efek pembatalan gema (jika tersedia) namun tidak ada pemrosesan lain yang diterapkan padanya. Beamforming diharapkan dilakukan oleh Asisten.
Masukan mikrofon multi-saluran
Untuk menangkap audio dari perangkat dengan lebih dari dua saluran (stereo), gunakan masker indeks saluran, bukan masker indeks posisi (seperti CHANNEL_IN_LEFT
). Contoh:
final AudioFormat audioFormat = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(44100) .setChannelIndexMask(0xf /* 4 channels, 0..3 */) .build(); final AudioRecord audioRecord = new AudioRecord.Builder() .setAudioFormat(audioFormat) .build(); audioRecord.setPreferredDevice(someAudioDeviceInfo);
Jika setChannelMask
dan setChannelIndexMask
disetel, AudioRecord
hanya menggunakan nilai yang disetel oleh setChannelMask
(maksimum dua saluran).
Penangkapan secara bersamaan
Mulai Android 10, framework Android mendukung pengambilan input secara bersamaan, namun dengan batasan untuk melindungi privasi pengguna. Sebagai bagian dari pembatasan ini, sumber virtual seperti AUDIO_SOURCE_FM_TUNER
diabaikan, dan dengan demikian diperbolehkan untuk diambil secara bersamaan bersama dengan input reguler (seperti mikrofon). HwAudioSources
juga tidak dianggap sebagai bagian dari pembatasan pengambilan bersamaan.
Aplikasi yang dirancang untuk berfungsi dengan perangkat AUDIO_DEVICE_IN_BUS
atau perangkat AUDIO_DEVICE_IN_FM_TUNER
sekunder harus mengandalkan identifikasi perangkat tersebut secara eksplisit dan menggunakan AudioRecord.setPreferredDevice()
untuk melewati logika pemilihan sumber default Android.
Penggunaan audio
AAOS terutama menggunakan AudioAttributes.AttributeUsages
untuk perutean, penyesuaian volume, dan manajemen fokus. Penggunaan adalah representasi dari "mengapa" streaming diputar. Oleh karena itu, semua permintaan streaming dan fokus audio harus menentukan penggunaan untuk pemutaran audionya. Jika tidak disetel secara spesifik saat membuat objek AudioAttributes, penggunaannya akan ditetapkan secara default ke USAGE_UNKNOWN
. Meskipun saat ini diperlakukan sama dengan USAGE_MEDIA
, perilaku ini tidak boleh diandalkan untuk pemutaran media.
Penggunaan sistem
Di Android 11, penggunaan sistem diperkenalkan. Penggunaan ini berperilaku serupa dengan penggunaan yang ditetapkan sebelumnya, hanya saja penggunaan ini memerlukan API sistem serta android.permission.MODIFY_AUDIO_ROUTING
. Penggunaan sistem baru adalah:
-
USAGE_EMERGENCY
-
USAGE_SAFETY
-
USAGE_VEHICLE_STATUS
-
USAGE_ANNOUNCEMENT
Untuk membuat AudioAttributes
dengan penggunaan sistem, gunakan AudioAttributes.Builder#setSystemUsage
alih-alih setUsage
. Memanggil metode ini dengan penggunaan non-sistem akan menghasilkan IllegalArgumentException
yang dilempar. Selain itu, jika penggunaan dan penggunaan sistem telah disetel pada pembuat, IllegalArgumentException
akan muncul saat membuat.
Untuk memeriksa penggunaan apa yang dikaitkan dengan instans AudioAttributes
, hubungi AudioAttributes#getSystemUsage
. Ini mengembalikan penggunaan atau penggunaan sistem yang terkait.
Konteks audio
Untuk menyederhanakan konfigurasi audio AAOS, penggunaan serupa telah dikelompokkan ke dalam CarAudioContext
. Konteks audio ini digunakan di seluruh CarAudioService
untuk menentukan perutean, grup volume, dan manajemen fokus audio.
Konteks audio di Android 11 adalah:
Konteks Audio Mobil | Penggunaan Atribut Terkait |
---|---|
MUSIC | UNKNOWN, GAME, MEDIA |
NAVIGATION | ASSISTANCE_NAVIGATION_GUIDANCE |
VOICE_COMMAND | ASSISTANT, ASSISTANCE_ACCESSIBILITY |
CALL_RING | NOTIFICATION_RINGTONE |
CALL | VOICE_COMMUNICATION, VOICE_COMMUNICATION_SIGNALING |
ALARM | ALARM |
NOTIFICATION | NOTIFICATION, NOTIFICATION_* |
SYSTEM_SOUND | ASSISTANCE_SONIFICATION |
EMERGENCY | EMERGENCY |
SAFETY | SAFETY |
VEHICLE_STATUS | VEHICLE_STATUS |
ANNOUNCEMENT | ANNOUNCEMENT |
Pemetaan antara konteks audio dan penggunaan. Baris yang disorot adalah untuk penggunaan sistem baru.
Audio multi-zona
Dengan otomotif, hadir serangkaian kasus penggunaan baru seputar pengguna yang berinteraksi dengan platform secara bersamaan dan ingin menggunakan media terpisah. Misalnya, pengemudi dapat memutar musik di dalam kabin sementara penumpang di kursi belakang menonton video YouTube di layar belakang. Audio multi-zona memungkinkan hal ini dengan memungkinkan sumber audio yang berbeda diputar secara bersamaan melalui berbagai area kendaraan.
Audio multi-zona yang dimulai di Android 10 memungkinkan OEM mengonfigurasi audio ke dalam zona terpisah. Setiap zona adalah kumpulan perangkat di dalam kendaraan dengan grup volumenya sendiri, konfigurasi perutean untuk konteks, dan manajemen fokus. Dengan cara ini, kabin utama dapat dikonfigurasi sebagai satu zona audio, sedangkan jack headphone di layar belakang dikonfigurasi sebagai zona kedua.
Zona didefinisikan sebagai bagian dari car_audio_configuration.xml
. CarAudioService
kemudian membaca konfigurasi dan membantu AudioService merutekan aliran audio berdasarkan zona terkaitnya. Setiap zona masih menentukan aturan perutean berdasarkan konteks dan cairan aplikasi. Saat pemutar dibuat, CarAudioService
menentukan zona mana yang dikaitkan dengan pemutar tersebut, lalu berdasarkan penggunaannya, ke perangkat mana AudioFlinger harus merutekan audionya.
Fokus juga dipertahankan secara independen untuk setiap zona audio. Hal ini memungkinkan aplikasi di zona berbeda untuk menghasilkan audio secara mandiri tanpa mengganggu satu sama lain, sementara aplikasi tetap memperhatikan perubahan fokus dalam zonanya. CarZonesAudioFocus
dalam CarAudioService
bertanggung jawab untuk mengelola fokus untuk setiap zona.
Gambar 2. Konfigurasikan audio multi-zona
Audio HAL
Implementasi audio otomotif mengandalkan Android Audio HAL standar, yang mencakup hal berikut:
-
IDevice.hal
. Membuat aliran input dan output, menangani volume utama dan mematikan suara, serta menggunakan:-
createAudioPatch
. Untuk membuat patch eksternal-eksternal antar perangkat. -
IDevice.setAudioPortConfig()
untuk menyediakan volume untuk setiap aliran fisik.
-
-
IStream.hal
. Seiring dengan varian input dan output, mengelola streaming sampel audio ke dan dari perangkat keras.
Jenis perangkat otomotif
Jenis perangkat berikut ini relevan untuk platform otomotif.
Tipe perangkat | Keterangan |
---|---|
AUDIO_DEVICE_OUT_BUS | Output utama dari Android (inilah cara semua audio dari Android dikirimkan ke kendaraan). Digunakan sebagai alamat untuk membedakan aliran untuk setiap konteks. |
AUDIO_DEVICE_OUT_TELEPHONY_TX | Digunakan untuk audio yang dirutekan ke radio seluler untuk transmisi. |
AUDIO_DEVICE_IN_BUS | Digunakan untuk input yang tidak diklasifikasikan. |
AUDIO_DEVICE_IN_FM_TUNER | Hanya digunakan untuk input radio siaran. |
AUDIO_DEVICE_IN_TV_TUNER | Digunakan untuk perangkat TV jika ada. |
AUDIO_DEVICE_IN_LINE | Digunakan untuk jack input AUX. |
AUDIO_DEVICE_IN_BLUETOOTH_A2DP | Musik diterima melalui Bluetooth. |
AUDIO_DEVICE_IN_TELEPHONY_RX | Digunakan untuk audio yang diterima dari radio seluler yang terkait dengan panggilan telepon. |
Mengonfigurasi perangkat audio
Perangkat audio yang terlihat oleh Android harus ditentukan di /audio_policy_configuration.xml
, yang mencakup komponen berikut:
- nama modul. Mendukung "primer" (digunakan untuk kasus penggunaan otomotif), "A2DP", "remote_submix", dan "USB". Nama modul dan driver audio yang sesuai harus dikompilasi ke
audio.primary.$(variant).so
. - port perangkat. Berisi daftar deskriptor perangkat untuk semua perangkat input dan output (termasuk perangkat yang terpasang secara permanen dan perangkat yang dapat dilepas) yang dapat diakses dari modul ini.
- Untuk setiap perangkat keluaran, Anda dapat menentukan kontrol penguatan yang terdiri dari nilai min/maks/default/langkah dalam milibel (1 milibel = 1/100 dB = 1/1000 bel).
- Atribut alamat pada instance devicePort dapat digunakan untuk menemukan perangkat, meskipun ada beberapa perangkat dengan jenis perangkat yang sama seperti
AUDIO_DEVICE_OUT_BUS
. - campuranPorts. Berisi daftar semua aliran keluaran dan masukan yang diekspos oleh audio HAL. Setiap instance mixPort dapat dianggap sebagai aliran fisik ke Android AudioService.
- rute. Mendefinisikan daftar kemungkinan koneksi antara perangkat input dan output atau antara aliran dan perangkat.
Contoh berikut mendefinisikan perangkat keluaran bus0_phone_out yang mana semua aliran audio Android dicampur dengan mixer_bus0_phone_out. Rute tersebut mengambil aliran keluaran mixer_bus0_phone_out
ke perangkat bus0_phone_out
.
<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>bus0_phone_out</item> <defaultOutputDevice>bus0_phone_out</defaultOutputDevice> <mixPorts> <mixPort name="mixport_bus0_phone_out" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="bus0_phone_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="BUS00_PHONE"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> <gains> <gain name="" mode="AUDIO_GAIN_MODE_JOINT" minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/> </gains> </devicePort> </devicePorts> <routes> <route type="mix" sink="bus0_phone_out" sources="mixport_bus0_phone_out"/> </routes> </module> </modules> </audioPolicyConfiguration>