Android Automotive OS (AAOS) dibuat berdasarkan stack audio Android inti untuk mendukung kasus penggunaan agar dapat beroperasi sebagai sistem infotainmen di kendaraan. AAOS bertanggung jawab atas suara infotainment (yaitu, media, navigasi, dan komunikasi), tetapi tidak bertanggung jawab secara langsung atas bunyi bel dan peringatan yang memiliki persyaratan ketersediaan dan pengaturan waktu yang ketat. Meskipun AAOS menyediakan sinyal dan mekanisme untuk membantu kendaraan mengelola audio, pada akhirnya kendaraan yang akan memutuskan suara apa yang harus diputar untuk pengemudi dan penumpang, sehingga memastikan suara yang penting bagi keselamatan dan suara peraturan terdengar dengan benar tanpa gangguan.
Saat Android mengelola pengalaman media kendaraan, sumber media eksternal seperti tuner radio harus diwakili oleh aplikasi, yang dapat menangani fokus audio dan peristiwa tombol media untuk sumber.
Android 11 menyertakan perubahan berikut pada dukungan audio terkait otomotif:
- Pemilihan zona audio otomatis berdasarkan User-ID terkait
- Penggunaan sistem baru untuk mendukung suara khusus otomotif
- Dukungan fokus audio HAL
- Fokus audio yang tertunda untuk streaming non-transien
- Setelan pengguna untuk mengontrol interaksi antara navigasi dan panggilan
Suara dan streaming Android
Sistem audio otomotif menangani suara dan streaming berikut:
Gambar 1. Diagram arsitektur yang berfokus pada aliran data
Android mengelola suara yang berasal dari aplikasi Android, mengontrol aplikasi tersebut dan merutekan suaranya ke perangkat output di HAL berdasarkan jenis suara:
- Streaming logis, yang dikenal sebagai sumber dalam nomenclatur audio inti, diberi tag dengan Atribut Audio.
- Aliran fisik, yang dikenal sebagai perangkat dalam nomenklatur audio inti, tidak memiliki informasi konteks setelah pencampuran.
Untuk keandalan, suara eksternal (berasal dari sumber independen seperti bel peringatan sabuk pengaman) dikelola di luar Android, di bawah HAL atau bahkan di hardware terpisah. Implementer sistem harus menyediakan mixer yang menerima satu atau beberapa aliran input suara dari Android, lalu menggabungkan aliran tersebut dengan cara yang sesuai dengan sumber suara eksternal yang diperlukan oleh kendaraan.
Implementasi HAL dan mixer eksternal bertanggung jawab untuk memastikan suara eksternal yang penting bagi keamanan terdengar dan untuk mencampurkan streaming yang disediakan Android dan merutekannya 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 memunculkan satu atau beberapa aliran data audio yang logis. Data ini dapat berupa mono saluran tunggal atau surround 7.1, tetapi dirutekan dan diperlakukan sebagai satu sumber. Streaming aplikasi dikaitkan dengan AudioAttributes yang memberi sistem petunjuk tentang cara audio harus diekspresikan.
Streaming logis dikirim melalui AudioService dan dirutekan ke satu (dan hanya satu) streaming output fisik yang tersedia, yang masing-masing merupakan output dari mixer dalam AudioFlinger. Setelah atribut audio dicampur ke streaming fisik, atribut tersebut tidak lagi tersedia.
Setiap streaming fisik kemudian dikirim ke Audio HAL untuk dirender di hardware. Dalam aplikasi otomotif, hardware rendering dapat berupa codec lokal (mirip dengan perangkat seluler) atau prosesor jarak jauh di seluruh jaringan fisik kendaraan. Apa pun caranya, tugas implementasi Audio HAL adalah mengirimkan data sampel yang sebenarnya dan membuatnya dapat didengar.
Streaming eksternal
Streaming suara yang tidak boleh dirutekan melalui Android (untuk alasan sertifikasi atau waktu) dapat dikirim langsung ke mixer eksternal. Mulai Android 11, HAL kini dapat meminta fokus untuk suara eksternal ini guna memberi tahu Android sehingga dapat mengambil tindakan yang sesuai seperti menjeda media atau mencegah yang lain mendapatkan fokus.
Jika streaming eksternal adalah 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 tersebut akan meminta fokus audio atas nama sumber media, bukan HAL, dan akan merespons notifikasi fokus dengan memulai/menghentikan sumber eksternal sesuai kebutuhan agar sesuai dengan kebijakan fokus Android. Aplikasi juga bertanggung jawab untuk menangani peristiwa tombol media seperti putar/jeda. Salah satu mekanisme yang disarankan untuk mengontrol perangkat eksternal tersebut adalah HwAudioSource.
Perangkat output
Di tingkat Audio HAL, jenis perangkat AUDIO_DEVICE_OUT_BUS
menyediakan perangkat output generik untuk digunakan dalam sistem audio kendaraan. Perangkat
bus mendukung port yang dapat dialamatkan (dengan setiap port adalah titik akhir untuk
streaming fisik) dan diharapkan menjadi satu-satunya jenis perangkat output yang didukung di
kendaraan.
Implementasi sistem dapat menggunakan satu port bus untuk semua suara Android, dalam hal ini Android akan menggabungkan semuanya dan mengirimkannya sebagai satu streaming.
Atau, HAL dapat menyediakan satu port bus untuk setiap CarAudioContext
guna memungkinkan
pengiriman serentak jenis suara apa pun. Hal ini memungkinkan implementasi HAL
untuk mencampur dan meredam berbagai suara sesuai keinginan.
Penetapan konteks audio ke perangkat output dilakukan melalui
car_audio_configuration.xml
.
Input mikrofon
Saat merekam audio, Audio HAL menerima panggilan openInputStream
yang menyertakan argumen AudioSource
yang menunjukkan cara
input mikrofon harus diproses.
Sumber VOICE_RECOGNITION
(khususnya Asisten Google) mengharapkan streaming mikrofon stereo yang memiliki
efek peredam gema (jika tersedia), tetapi tidak ada pemrosesan lain yang diterapkan.
Beamforming diharapkan dilakukan oleh Asisten.
Input mikrofon multisaluran
Untuk merekam audio dari perangkat dengan lebih dari dua saluran (stereo), gunakan
mask indeks saluran, bukan mask 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
ditetapkan, AudioRecord
hanya menggunakan nilai yang ditetapkan oleh
setChannelMask
(maksimum dua saluran).
Perekaman serentak
Mulai Android 10, framework Android mendukung pengambilan input
serentak, tetapi dengan batasan untuk melindungi privasi pengguna. Sebagai bagian
dari batasan ini, sumber virtual seperti
AUDIO_SOURCE_FM_TUNER
diabaikan, sehingga diizinkan untuk
direkam secara serentak bersama dengan input reguler (seperti mikrofon).
HwAudioSources
juga tidak dianggap sebagai bagian dari batasan pengambilan
serentak.
Aplikasi yang dirancang untuk berfungsi dengan perangkat AUDIO_DEVICE_IN_BUS
atau dengan
perangkat AUDIO_DEVICE_IN_FM_TUNER
sekunder harus mengandalkan
identifikasi perangkat tersebut secara eksplisit dan menggunakan AudioRecord.setPreferredDevice()
untuk mengabaikan logika pemilihan sumber default Android.
Penggunaan audio
AAOS terutama menggunakan
AudioAttributes.AttributeUsages
untuk perutean, penyesuaian volume, dan pengelolaan fokus. Penggunaan adalah
representasi "alasan" streaming diputar. Oleh karena itu, semua streaming
dan permintaan fokus audio harus menentukan penggunaan untuk pemutaran audionya. Jika
tidak ditetapkan secara khusus saat mem-build objek AudioAttributes, penggunaan 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, kecuali memerlukan API sistem
untuk digunakan 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
bukan setUsage
. Memanggil metode ini dengan penggunaan non-sistem
akan menyebabkan IllegalArgumentException
ditampilkan. Selain itu, jika
penggunaan sistem dan penggunaan telah ditetapkan pada builder, builder akan menampilkan
IllegalArgumentException
saat mem-build.
Untuk memeriksa penggunaan yang terkait dengan instance AudioAttributes
, panggil AudioAttributes#getSystemUsage
.
Tindakan ini akan menampilkan 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 pemilihan rute, grup volume, dan pengelolaan fokus
audio.
Konteks audio di Android 11 adalah:
CarAudioContext | Associated AttributeUsages |
---|---|
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 dan penggunaan audio. Baris yang ditandai adalah untuk penggunaan sistem baru.
Audio multizona
Dengan otomotif, ada serangkaian kasus penggunaan baru seputar pengguna serentak yang berinteraksi dengan platform dan ingin menggunakan media terpisah. Misalnya, pengemudi dapat memutar musik di kabin saat penumpang di kursi belakang menonton video YouTube di layar belakang. Audio multi-zona memungkinkan hal ini dengan mengizinkan sumber audio yang berbeda diputar secara bersamaan melalui area kendaraan yang berbeda.
Audio multi-zona mulai Android 10 memungkinkan OEM mengonfigurasi audio ke dalam zona terpisah. Setiap zona adalah kumpulan perangkat dalam kendaraan dengan grup volume, konfigurasi pemilihan rute untuk konteks, dan pengelolaan fokusnya sendiri. Dengan cara ini, kabin utama dapat dikonfigurasi sebagai satu zona audio, sedangkan jack headphone layar belakang dikonfigurasi sebagai zona kedua.
Zona ditentukan sebagai bagian dari car_audio_configuration.xml
.
CarAudioService
kemudian membaca konfigurasi dan membantu AudioService
me-rutekan streaming audio berdasarkan zona terkait. Setiap zona masih menentukan
aturan untuk perutean berdasarkan konteks dan uid aplikasi. Saat pemutar
dibuat, CarAudioService
menentukan zona yang terkait dengan
pemutar, lalu berdasarkan penggunaan, perangkat mana yang akan menjadi tujuan rute
audio AudioFlinger.
Fokus juga dipertahankan secara independen untuk setiap zona audio. Hal ini memungkinkan
aplikasi di zona yang berbeda untuk menghasilkan audio secara independen tanpa
mengganggu satu sama lain, sekaligus membuat aplikasi tetap mengikuti perubahan
fokus dalam zonanya. CarZonesAudioFocus
dalam
CarAudioService
bertanggung jawab untuk mengelola fokus untuk setiap
zona.
Gambar 2. Mengonfigurasi audio multi-zona
HAL Audio
Implementasi audio otomotif mengandalkan HAL Audio Android standar, yang mencakup hal berikut:
IDevice.hal
. Membuat aliran input dan output, menangani volume utama dan membisukan, serta menggunakan:createAudioPatch
. Untuk membuat patch eksternal-eksternal di antara perangkat.IDevice.setAudioPortConfig()
untuk memberikan volume untuk setiap aliran data fisik.
IStream.hal
. Bersama dengan varian input dan output, mengelola streaming sampel audio ke dan dari hardware.
Jenis perangkat otomotif
Jenis perangkat berikut relevan untuk platform otomotif.
Jenis perangkat | Deskripsi |
---|---|
AUDIO_DEVICE_OUT_BUS |
Output utama dari Android (ini adalah cara semua audio dari Android dikirim ke kendaraan). Digunakan sebagai alamat untuk membedakan streaming 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 yang 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 "utama" (digunakan untuk kasus penggunaan otomotif),
"A2DP", "remote_submix", dan "USB". Nama modul dan driver audio
yang sesuai harus dikompilasi ke
audio.primary.$(variant).so
. - devicePorts. Berisi daftar deskripsi 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 output, Anda dapat menentukan kontrol gain yang terdiri dari nilai min/maks/default/langkah dalam millibel (1 millibel = 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
. - mixPorts. Berisi daftar semua aliran output dan input yang ditampilkan oleh HAL audio. Setiap instance mixPort dapat dianggap sebagai streaming fisik ke Android AudioService.
- rute. Menentukan daftar kemungkinan koneksi antara perangkat input dan output atau antara streaming dan perangkat.
Contoh berikut menentukan perangkat output bus0_phone_out tempat semua
streaming audio Android dicampur oleh mixer_bus0_phone_out. Rute ini mengambil
aliran output 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>