Android Automotive OS (AAOS) dibuat berdasarkan stack audio Android inti untuk mendukung kasus penggunaan untuk beroperasi sebagai sistem infotainmen di dalam kendaraan. AAOS bertanggung jawab atas suara infotainmen (yaitu, media, navigasi, dan komunikasi), tetapi tidak secara langsung bertanggung jawab atas bunyi bel dan peringatan yang persyaratan ketersediaan dan waktu yang ketat. Sementara AAOS memberikan sinyal dan mekanisme untuk membantu kendaraan mengelola audio. Pada akhirnya, terserah pada kendaraan untuk menentukan suara apa yang harus diputar bagi pengemudi dan penumpang, memastikan suara yang penting bagi keselamatan dan suara yang mengatur terdengar tanpa gangguan.
Karena Android mengelola pengalaman media di kendaraan, sumber media eksternal seperti tuner radio harus diwakili oleh aplikasi, yang dapat menangani audio fokus dan peristiwa tombol media untuk sumber.
Android 11 menyertakan perubahan berikut pada audio terkait otomotif dukung:
- Pemilihan zona audio otomatis berdasarkan User-ID terkait
- Penggunaan sistem baru untuk mendukung suara khusus otomotif
- Dukungan fokus audio HAL
- Fokus audio tertunda untuk streaming non-sementara
- Setelan pengguna untuk mengontrol interaksi antara navigasi dan panggilan
Audio dan streaming Android
Sistem audio otomotif menangani suara dan streaming berikut:
Gambar 1. Diagram arsitektur yang berfokus pada stream
Android mengelola suara yang berasal dari aplikasi Android, mengontrol aplikasi tersebut dan mengarahkan suara mereka ke perangkat {i> output<i} di HAL berdasarkan jenis suara:
- Streaming logis, yang dikenal sebagai sumber dalam audio inti nomenklatur, diberi tag dengan Atribut Audio.
- Streaming fisik, yang dikenal sebagai perangkat dalam audio inti nomenklatur, tidak memiliki informasi konteks setelah pencampuran.
Untuk keandalan, suara eksternal (yang berasal dari sumber seperti bunyi peringatan sabuk pengaman) dikelola di luar Android, di bawah HAL atau bahkan dalam perangkat keras terpisah. Pengimplementasi sistem harus menyediakan pencampur yang menerima satu atau beberapa aliran input suara dari Android, lalu menggabungkan melakukan streaming dengan cara yang sesuai dengan sumber suara eksternal yang diperlukan oleh saat ini.
Implementasi HAL dan pencampur eksternal bertanggung jawab untuk memastikan suara eksternal yang penting bagi keamanan akan terdengar dan untuk dicampur dengan suara melakukan streaming dan mengarahkannya ke pembicara yang sesuai.
Suara Android
Aplikasi mungkin memiliki satu atau beberapa pemain yang berinteraksi melalui Android standar API (misalnya, AudioManager untuk kontrol fokus atau MediaPlayer untuk streaming) untuk memunculkan satu atau beberapa aliran data audio logis. Data ini dapat berupa mono saluran tunggal atau surround 7.1, tetapi dirutekan dan diperlakukan sebagai sumber tunggal. Streaming aplikasi dikaitkan dengan AudioAttributes yang memberikan petunjuk kepada sistem tentang bagaimana audio harus dinyatakan.
Streaming logis dikirim melalui AudioService dan dirutekan ke salah satunya (dan hanya satu) dari streaming output fisik yang tersedia, yang masing-masing merupakan output dari mixer dalam AudioFlinger. Setelah atribut audio dicampur ke streaming fisik, mereka tidak lagi tersedia.
Tiap aliran fisik kemudian dikirimkan ke HAL Audio untuk dirender di perangkat kerasnya. Dalam aplikasi otomotif, hardware rendering dapat berupa codec lokal (serupa dengan perangkat seluler) atau prosesor jarak jauh di seluruh struktur fisik kendaraan jaringan. Bagaimanapun, tugas implementasi HAL Audio adalah mengirimkan data sampel aktual dan menyebabkannya menjadi terdengar.
Streaming eksternal
Streaming suara yang tidak boleh dirutekan melalui Android (untuk sertifikasi atau waktu) dapat dikirim langsung ke pencampur eksternal. Mulai Android 11, HAL sekarang dapat meminta fokus untuk suara eksternal ini guna memberi tahu Android sehingga dapat mengambil tindakan yang tepat seperti menjeda media atau mencegah sehingga orang lain tidak bisa fokus.
Jika streaming eksternal merupakan sumber media yang dapat berinteraksi dengan suara yang dihasilkan Android (misalnya, menghentikan pemutaran MP3 saat eksternal dihidupkan), streaming eksternal tersebut harus diwakili oleh aplikasi Android. Aplikasi seperti itu 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 fokus Android lebih lanjut. Aplikasi juga bertanggung jawab untuk menangani peristiwa tombol media seperti memutar/menjeda. Salah satu mekanisme yang disarankan untuk mengontrol perangkat eksternal tersebut adalah HwAudioSource.
Perangkat output
Di level Audio HAL, jenis perangkat AUDIO_DEVICE_OUT_BUS
menyediakan perangkat output generik untuk digunakan dalam sistem audio kendaraan. Bus
perangkat mendukung porta yang dapat diberi alamat (di mana setiap porta adalah titik akhir untuk
aliran fisik) dan diharapkan menjadi satu-satunya jenis perangkat output yang didukung di
sebuah kendaraan.
Implementasi sistem bisa menggunakan satu porta bus untuk semua suara Android, di
dalam hal ini Android mencampur semuanya dan
mengirimkannya sebagai satu aliran.
Atau, HAL dapat menyediakan satu port bus untuk setiap CarAudioContext
pengiriman jenis suara apa pun secara serentak. Hal ini memungkinkan HAL
untuk mencampur dan mengecilkan suara berbeda sesuai keinginan.
Penetapan konteks audio ke perangkat {i>output<i} dilakukan melalui
car_audio_configuration.xml
.
Input mikrofon
Saat merekam audio, HAL Audio menerima openInputStream
panggilan yang menyertakan argumen AudioSource
yang menunjukkan bagaimana
input mikrofon akan diproses.
Sumber VOICE_RECOGNITION
(khususnya Asisten Google) mengharapkan streaming mikrofon stereo yang memiliki
efek pengurangan gema (jika tersedia), tetapi tidak ada pemrosesan lain yang diterapkan padanya.
Beamforming diharapkan akan dilakukan oleh Asisten.
Input mikrofon multisaluran
Untuk merekam audio dari perangkat yang memiliki 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
(maksimal dua saluran).
Pengambilan foto serentak
Mulai Android 10, framework Android mendukung perekaman serentak
input, tetapi dengan batasan untuk melindungi privasi pengguna. Sebagai bagian
batasan ini, sumber virtual seperti
AUDIO_SOURCE_FM_TUNER
diabaikan, sehingga diizinkan untuk
direkam secara serentak dengan input reguler (seperti mikrofon).
HwAudioSources
juga tidak dianggap sebagai bagian dari
pembatasan tangkapan layar.
Aplikasi yang didesain agar berfungsi dengan AUDIO_DEVICE_IN_BUS
perangkat atau dengan
perangkat AUDIO_DEVICE_IN_FM_TUNER
sekunder harus menggunakan
mengidentifikasi perangkat tersebut 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 dari “mengapa” streaming sedang diputar. Oleh karena itu, semua aliran data
dan permintaan fokus audio harus menentukan penggunaan untuk pemutaran audionya. Kapan
tidak secara khusus ditetapkan saat membangun objek AudioAttributes, penggunaannya akan
ditetapkan secara default ke USAGE_UNKNOWN
. Meskipun saat ini diperlakukan sama
sebagai USAGE_MEDIA
, perilaku ini tidak boleh diandalkan untuk media
pemutaran.
Penggunaan sistem
Di Android 11, penggunaan sistem diperkenalkan. Penggunaan ini berperilaku
mirip dengan penggunaan yang ditetapkan sebelumnya, kecuali jika penggunaan tersebut memerlukan API sistem
yang akan digunakan, serta android.permission.MODIFY_AUDIO_ROUTING
. Yang baru
penggunaan sistem 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
baik penggunaan sistem maupun penggunaan telah
ditetapkan pada builder, itu akan memunculkan
IllegalArgumentException
saat membangun.
Untuk memeriksa penggunaan yang terkait dengan AudioAttributes
panggil AudioAttributes#getSystemUsage
.
Data ini 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 dalam
CarAudioService
untuk menentukan pemilihan rute, grup volume, dan fokus audio
otomatisasi pengelolaan biaya.
Konteks audio di Android 11 adalah:
Konteks MobilAudio | AttributeUsages 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 dan penggunaan audio. Baris yang disorot adalah untuk penggunaan sistem.
Audio multi-zona
Dengan otomotif, hadir serangkaian kasus penggunaan baru seputar pengguna serentak berinteraksi dengan platform dan ingin menggunakan media terpisah. Sebagai misalnya, pengemudi dapat memutar musik di kabin sementara penumpang di kursi belakang sedang menonton video YouTube di layar belakang. Audio multi-zona memungkinkan dengan memungkinkan sumber audio yang berbeda untuk diputar secara serentak melalui area yang berbeda ukuran 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 fokus otomatisasi pengelolaan biaya. Dengan cara ini, kabin utama dapat dikonfigurasi sebagai satu audio sedangkan colokan headphone layar belakang dikonfigurasi sebagai zona kedua.
Zona ditentukan sebagai bagian dari car_audio_configuration.xml
.
CarAudioService
kemudian membaca konfigurasi dan membantu AudioService
arahkan streaming audio berdasarkan zona yang terkait. Setiap zona masih menentukan
aturan untuk perutean berdasarkan konteks dan UID aplikasi. Saat pemain
dibuat, CarAudioService
menentukan zona tempat pemain berada
yang dikaitkan dengan perangkat AudioFlinger, kemudian berdasarkan penggunaannya
seharusnya mengarahkan audio.
Fokus juga dipertahankan secara independen untuk setiap zona audio. Hal ini memungkinkan
aplikasi di zona berbeda untuk menghasilkan audio secara independen tanpa
saling mengganggu satu sama lain sementara
aplikasi tetap mengikuti perubahan
fokus sesuai zona mereka. CarZonesAudioFocus
di dalam
CarAudioService
bertanggung jawab untuk mengelola fokus untuk setiap
zona waktu.
Gambar 2. Mengonfigurasi audio multi-zona
HAL Audio
Implementasi audio otomotif mengandalkan Android Audio HAL standar, yang mencakup hal-hal berikut:
IDevice.hal
. Membuat aliran input dan output, menangani volume utama dan pembisuan, serta menggunakan:createAudioPatch
. Untuk membuat patch eksternal-eksternal antar-perangkat.IDevice.setAudioPortConfig()
untuk memberikan volume bagi setiap aliran 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 (inilah cara semua audio dari Android diantarkan ke kendaraan). Digunakan sebagai alamat untuk membedakan streaming untuk setiap konteks. |
AUDIO_DEVICE_OUT_TELEPHONY_TX |
Digunakan untuk audio yang diarahkan 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 colokan 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 ponsel panggilan telepon. |
Mengonfigurasi perangkat audio
Perangkat audio yang terlihat oleh Android harus ditetapkan di
/audio_policy_configuration.xml
, yang mencakup komponen berikut:
- nama modul. Mendukung "primary" (digunakan untuk kasus penggunaan otomotif),
"A2DP", "remote_submix", dan "USB". Nama modul dan audio yang sesuai
driver harus dikompilasi ke
audio.primary.$(variant).so
. - {i>devicePort<i}. Berisi daftar deskriptor perangkat untuk semua input dan output perangkat (termasuk perangkat yang terpasang secara permanen dan perangkat portabel) yang dapat diakses dari modul ini.
- Untuk setiap perangkat {i>output<i}, Anda dapat menentukan kontrol perolehan yang terdiri dari nilai minimum/maks/default/langkah dalam milibel (1 milibel = 1/100 dB = 1/1000 bel).
- Atribut alamat pada instance devicePort dapat digunakan untuk menemukan
walaupun ada beberapa perangkat
dengan tipe perangkat yang sama dengan
AUDIO_DEVICE_OUT_BUS
. - mixPorts. Berisi daftar semua aliran output dan input yang diekspos oleh HAL audio. Setiap {i>instance<i} mixPort dapat dianggap sebagai aliran fisik untuk Android AudioService.
- rute perjalanan. Menentukan daftar kemungkinan koneksi antara input dan output perangkat atau antara streaming dan perangkat.
Contoh berikut menentukan bus0_phone_out perangkat output di mana semua
Streaming audio Android dicampur dengan mixer_bus0_phone_out. Rute tersebut 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>