Audio Otomotif

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:

Suara dan streaming Android

Sistem audio otomotif menangani suara dan aliran berikut:

Diagram arsitektur yang berpusat pada aliran

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.

Konfigurasikan audio multi-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>