Audio Otomotif

Android Automotive OS (AAOS) dibangun di atas tumpukan audio Android inti untuk mendukung kasus penggunaan untuk beroperasi sebagai sistem infotainment di dalam kendaraan. AAOS bertanggung jawab atas suara infotainment (yaitu, media, navigasi, dan komunikasi) tetapi tidak secara langsung bertanggung jawab atas lonceng dan peringatan yang memiliki persyaratan ketersediaan dan pengaturan waktu yang ketat. Sementara AAOS menyediakan sinyal dan mekanisme untuk membantu kendaraan mengelola audio, pada akhirnya terserah pada kendaraan untuk membuat panggilan tentang suara apa yang harus dimainkan untuk pengemudi dan penumpang, memastikan suara kritis keselamatan dan suara peraturan terdengar dengan benar 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 kunci media untuk sumber tersebut.

Android 11 menyertakan perubahan berikut pada dukungan audio terkait otomotif:

Suara dan aliran Android

Sistem audio otomotif menangani suara dan aliran berikut:

Diagram arsitektur aliran-sentris

Gambar 1. Diagram arsitektur aliran-sentris

Android mengelola suara yang berasal dari aplikasi Android, mengontrol aplikasi tersebut dan mengarahkan suaranya ke perangkat keluaran di HAL berdasarkan jenis suara:

  • Aliran logis , yang dikenal sebagai sumber dalam nomenklatur audio inti, ditandai 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 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 diperlukan oleh kendaraan.

Implementasi HAL dan mixer eksternal bertanggung jawab untuk memastikan suara eksternal yang kritis terhadap keselamatan didengar dan untuk pencampuran di 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, tetapi dirutekan dan diperlakukan sebagai satu sumber. Aliran aplikasi dikaitkan dengan AudioAttributes yang memberikan petunjuk sistem tentang bagaimana audio harus diekspresikan.

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 dikirim ke Audio HAL untuk dirender pada perangkat keras. Dalam aplikasi otomotif, perangkat keras rendering dapat berupa codec lokal (mirip dengan perangkat seluler) atau prosesor jarak jauh di seluruh jaringan fisik kendaraan. Either way, itu tugas implementasi Audio HAL untuk mengirimkan data sampel yang sebenarnya dan membuatnya menjadi terdengar.

Aliran eksternal

Aliran suara yang tidak boleh dirutekan melalui Android (untuk alasan sertifikasi atau waktu) dapat dikirim langsung ke mixer eksternal. Pada Android 11, HAL sekarang dapat meminta fokus untuk suara eksternal ini untuk menginformasikan Android sehingga dapat mengambil tindakan yang tepat seperti menjeda media atau mencegah orang lain mendapatkan fokus.

Jika aliran eksternal adalah sumber media yang harus berinteraksi dengan lingkungan suara yang dihasilkan Android (misalnya, menghentikan pemutaran MP3 saat tuner eksternal dihidupkan), aliran eksternal tersebut harus diwakili oleh aplikasi Android. Aplikasi semacam itu akan meminta fokus audio atas nama sumber media, bukan HAL, dan akan menanggapi pemberitahuan fokus dengan memulai/menghentikan sumber eksternal sebagaimana diperlukan agar sesuai dengan kebijakan fokus Android. Aplikasi ini juga bertanggung jawab untuk menangani peristiwa kunci 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 output 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 dalam kendaraan.

Implementasi sistem dapat menggunakan satu port bus untuk semua suara Android, dalam hal ini Android menggabungkan semuanya dan mengirimkannya sebagai satu aliran. Sebagai alternatif, 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 mengecilkan 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) tetapi 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 topeng indeks saluran alih-alih topeng 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);

Saat setChannelMask dan setChannelIndexMask disetel, AudioRecord hanya menggunakan nilai yang ditetapkan oleh setChannelMask (maksimum dua saluran).

Penangkapan bersamaan

Mulai Android 10, kerangka kerja Android mendukung pengambilan input secara bersamaan , tetapi dengan batasan untuk melindungi privasi pengguna. Sebagai bagian dari pembatasan ini, sumber virtual seperti AUDIO_SOURCE_FM_TUNER diabaikan, dan dengan demikian diizinkan untuk ditangkap secara bersamaan bersama dengan input biasa (seperti mikrofon). HwAudioSources juga tidak dianggap sebagai bagian dari pembatasan pengambilan bersamaan.

Aplikasi yang dirancang untuk bekerja dengan perangkat AUDIO_DEVICE_IN_BUS atau dengan perangkat AUDIO_DEVICE_IN_FM_TUNER sekunder harus bergantung pada pengidentifikasian 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 manajemen fokus. Penggunaan adalah representasi dari "mengapa" aliran sedang dimainkan. Oleh karena itu, semua streaming dan permintaan fokus audio harus menentukan penggunaan untuk pemutaran audionya. Jika tidak secara khusus disetel saat membuat objek AudioAttributes, penggunaan akan didefaultkan ke USAGE_UNKOWN . 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 mirip dengan penggunaan yang ditetapkan sebelumnya, kecuali mereka 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 alih-alih setUsage . Memanggil metode ini dengan penggunaan non-sistem akan mengakibatkan IllegalArgumentException dilempar. Juga, jika penggunaan dan penggunaan sistem telah ditetapkan pada pembuat, itu akan mengeluarkan IllegalArgumentException saat membangun.

Untuk memeriksa penggunaan apa yang dikaitkan dengan instance AudioAttributes , panggil 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:

MobilAudioKonteks Atribut TerkaitPenggunaan
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 di sekitar pengguna bersamaan yang berinteraksi dengan platform 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 ini dengan memungkinkan sumber audio yang berbeda diputar secara bersamaan melalui area kendaraan yang berbeda.

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 dapat dikonfigurasi sebagai zona kedua.

Zona didefinisikan sebagai bagian dari car_audio_configuration.xml . CarAudioService kemudian membaca konfigurasi dan membantu AudioService merutekan streaming audio berdasarkan zona yang terkait. Setiap zona masih mendefinisikan aturan untuk perutean berdasarkan konteks dan uid aplikasi. Saat pemutar dibuat, CarAudioService menentukan zona mana pemutar dikaitkan, dan kemudian berdasarkan penggunaan, ke perangkat mana AudioFlinger harus merutekan audio.

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 sementara aplikasi tetap menghargai perubahan fokus di dalam zonanya. CarZonesAudioFocus dalam CarAudioService bertanggung jawab untuk mengelola fokus untuk setiap zona.

Konfigurasikan audio multi-zona

Gambar 2. Konfigurasi 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 master dan mematikan suara, dan menggunakan:
    • createAudioPatch . Untuk membuat patch eksternal-eksternal antar perangkat.
    • IDevice.setAudioPortConfig() untuk menyediakan volume untuk setiap aliran fisik.
  • IStream.hal . Bersama 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 (ini adalah bagaimana 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 dialihkan ke radio seluler untuk transmisi.
AUDIO_DEVICE_IN_BUS Digunakan untuk input yang tidak diklasifikasikan secara lain.
AUDIO_DEVICE_IN_FM_TUNER Digunakan hanya 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 menyertakan 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 .
  • mixPorts. Berisi daftar semua aliran output dan input yang diekspos oleh audio HAL. Setiap instans 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 di mana semua aliran audio Android dicampur oleh mixer_bus0_phone_out. Rute mengambil aliran keluaran mixer_bus0_phone_out ke device 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>