Audio Otomotif

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:

Suara dan streaming Android

Sistem audio otomotif menangani suara dan streaming berikut:

Diagram arsitektur yang berfokus pada aliran data

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.

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