Audio Otomotif

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:

Audio dan streaming Android

Sistem audio otomotif menangani suara dan streaming berikut:

Diagram arsitektur yang berfokus pada stream

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.

Mengonfigurasi audio multi-zona

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>