Mengonfigurasi Kebijakan Audio

Rilis Android 10 menyertakan pemfaktoran ulang yang signifikan dari pengelola kebijakan audio untuk memberikan lebih banyak fleksibilitas guna mendukung kasus penggunaan otomotif yang kompleks:

  • Strategi perutean khusus OEM.
  • Grup volume yang dapat disesuaikan untuk grup jenis aliran lama menggunakan kurva volume yang sama.
  • Strategi perutean dideklarasikan oleh mesin kebijakan audio alih-alih dikodekan secara keras.
  • Kurva volume dan grup yang dikelola oleh mesin kebijakan audio.
  • Pemfaktoran ulang internal mempersiapkan pemisahan di masa mendatang antara kode umum dan kode yang dapat dikonfigurasi dan menawarkan manajemen perangkat audio yang lebih kaya. Misalnya, penggunaan semua properti perangkat bukan hanya jenisnya dalam aturan kebijakan.

Android 7.0 memperkenalkan format file konfigurasi kebijakan audio (XML) untuk menjelaskan topologi audio Anda.

Rilis Android sebelumnya diperlukan menggunakan device/<company>/<device>/audio/audio_policy.conf untuk mendeklarasikan perangkat audio yang ada pada produk Anda (Anda dapat melihat contoh file ini untuk perangkat keras audio Galaxy Nexus di device/samsung/tuna/audio/audio_policy.conf ). Namun, CONF adalah format kepemilikan sederhana yang terlalu terbatas untuk menggambarkan topologi kompleks untuk vertikal seperti televisi dan mobil.

Android 7.0 tidak lagi audio_policy.conf dan menambahkan dukungan untuk mendefinisikan topologi audio menggunakan format file XML yang lebih dapat dibaca manusia, memiliki berbagai alat pengeditan dan penguraian, dan cukup fleksibel untuk menjelaskan topologi audio yang kompleks. Android 7.0 menggunakan flag build USE_XML_AUDIO_POLICY_CONF untuk memilih format XML file konfigurasi.

Keuntungan dari format XML

Seperti dalam file CONF, file XML memungkinkan penentuan jumlah dan jenis profil aliran keluaran dan masukan, perangkat yang dapat digunakan untuk pemutaran dan pengambilan, dan atribut audio. Selain itu, format XML menawarkan penyempurnaan berikut:

  • Di Android 10, lebih dari satu aplikasi perekaman aktif diizinkan secara bersamaan.
    • Perekaman mulai tidak pernah ditolak karena situasi konkurensi.
    • registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) memberi tahu klien tentang perubahan jalur pengambilan.
  • Dalam situasi berikut, klien mendapatkan sampel audio senyap:
    • Kasus penggunaan sensitif privasi (misalnya, VOICE_COMMUNICATION ) aktif.
    • Klien tidak memiliki layanan latar depan atau UI latar depan.
    • Peran khusus diakui oleh kebijakan:
      • Layanan aksesibilitas: Dapat merekam bahkan jika kasus penggunaan sensitif privasi aktif.
      • Asisten: Dianggap sensitif privasi jika UI berada di atas.
  • Profil audio memiliki struktur yang mirip dengan deskriptor audio sederhana HDMI, memungkinkan serangkaian laju pengambilan sampel/masker saluran yang berbeda untuk setiap format audio.
  • Ada definisi eksplisit untuk semua kemungkinan koneksi antara perangkat dan aliran. Sebelumnya, aturan implisit memungkinkan untuk menghubungkan semua perangkat yang terpasang ke modul HAL yang sama, mencegah kebijakan audio mengontrol koneksi yang diminta dengan API patch audio. Dalam format XML, deskripsi topologi mendefinisikan batasan koneksi.
  • Dukungan untuk menyertakan menghindari pengulangan standar A2DP, USB, atau mengubah rute pengiriman definisi.
  • Kurva volume dapat disesuaikan. Sebelumnya, tabel volume di-hardcode. Dalam format XML, tabel volume dijelaskan dan dapat dikustomisasi.

Template di frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml menunjukkan banyak fitur yang digunakan.

Format dan lokasi file

File konfigurasi kebijakan audio yang baru adalah audio_policy_configuration.xml dan terletak di /system/etc . Contoh berikut menunjukkan konfigurasi kebijakan audio sederhana dalam format file XML untuk Android 12 dan untuk versi di bawah Android 12.

Struktur tingkat atas berisi modul yang sesuai dengan setiap modul perangkat keras audio HAL, di mana setiap modul memiliki daftar port campuran, port perangkat, dan rute:

  • Port campuran menjelaskan kemungkinan profil konfigurasi untuk aliran yang dapat dibuka di HAL audio untuk pemutaran dan pengambilan.
  • Port perangkat menjelaskan perangkat yang dapat dilampirkan dengan jenisnya (dan secara opsional alamat dan properti audio, jika relevan).
  • Rute dipisahkan dari deskriptor port campuran, memungkinkan deskripsi rute dari perangkat ke perangkat atau streaming ke perangkat.

Tabel volume adalah daftar titik sederhana yang mendefinisikan kurva yang digunakan untuk menerjemahkan dari indeks UI ke volume dalam dB. File sertakan yang terpisah menyediakan kurva default, tetapi setiap kurva untuk kasus penggunaan dan kategori perangkat tertentu dapat ditimpa.

Inklusi file

Metode Penyertaan XML (XInclude) dapat digunakan untuk menyertakan informasi konfigurasi kebijakan audio yang terletak di file XML lainnya. Semua file yang disertakan harus mengikuti struktur yang dijelaskan di atas dengan batasan berikut:

  • File hanya dapat berisi elemen tingkat atas.
  • File tidak boleh berisi elemen XInclude.

Gunakan termasuk untuk menghindari penyalinan informasi konfigurasi modul HAL audio Android Open Source Project (AOSP) standar ke semua file konfigurasi kebijakan audio (yang rentan terhadap kesalahan). File XML konfigurasi kebijakan audio standar disediakan untuk HAL audio berikut:

  • A2DP: a2dp_audio_policy_configuration.xml
  • Rute ulang submix: rsubmix_audio_policy_configuration.xml
  • USB: usb_audio_policy_configuration.xml

Organisasi kode kebijakan audio

AudioPolicyManager.cpp dibagi menjadi beberapa modul untuk memudahkan pemeliharaan dan konfigurasi. Organisasi frameworks/av/services/audiopolicy mencakup modul berikut.

Modul Keterangan
/managerdefault Mencakup antarmuka umum dan implementasi perilaku yang umum untuk semua aplikasi. Mirip dengan AudioPolicyManager.cpp dengan fungsionalitas mesin dan konsep umum yang diabstraksikan.
/common Mendefinisikan kelas dasar (misalnya, struktur data untuk profil aliran audio keluaran input, deskriptor perangkat audio, patch audio, dan port audio). Ini sebelumnya didefinisikan di dalam AudioPolicyManager.cpp .
/engine

Menerapkan aturan yang menentukan perangkat dan volume mana yang harus digunakan untuk kasus penggunaan tertentu. Ini mengimplementasikan antarmuka standar dengan bagian generik, seperti untuk mendapatkan perangkat yang sesuai untuk pemutaran atau pengambilan kasus penggunaan tertentu, atau untuk mengatur perangkat yang terhubung atau status eksternal (yaitu, status panggilan penggunaan paksa) yang dapat mengubah perutean keputusan.

Tersedia dalam dua versi: dapat dikonfigurasi dan default . Untuk informasi tentang cara memilih versi, lihat Konfigurasi menggunakan Kerangka Parameter .

/engineconfigurable Implementasi mesin kebijakan yang mengandalkan Kerangka Parameter (lihat di bawah). Konfigurasi didasarkan pada Kerangka Parameter dan di mana kebijakan ditentukan oleh file XML.
/enginedefault Implementasi mesin kebijakan berdasarkan implementasi Pengelola Kebijakan Audio Android sebelumnya. Ini adalah default dan termasuk aturan hard-code yang sesuai dengan implementasi Nexus dan AOSP.
/service Termasuk antarmuka pengikat, threading, dan implementasi penguncian dengan antarmuka ke seluruh kerangka kerja.

Konfigurasi menggunakan Kerangka Parameter

Kode kebijakan audio diatur agar mudah dipahami dan dipelihara sekaligus mendukung kebijakan audio yang ditentukan seluruhnya oleh file konfigurasi. Desain kebijakan organisasi dan audio didasarkan pada Kerangka Parameter Intel, kerangka kerja berbasis plugin dan berbasis aturan untuk menangani parameter.

Menggunakan kebijakan audio yang dapat dikonfigurasi memungkinkan OEM vendor untuk:

  • Jelaskan struktur sistem dan parameternya dalam XML.
  • Tulis (dalam C++) atau gunakan kembali backend (plugin) untuk mengakses parameter yang dijelaskan.
  • Tetapkan (dalam XML atau dalam bahasa khusus domain) kondisi/aturan di mana parameter tertentu harus mengambil nilai tertentu.

AOSP menyertakan contoh file konfigurasi kebijakan audio yang menggunakan Kerangka Parameter di Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml . Untuk detailnya, lihat dokumentasi Intel tentang Kerangka Parameter .

Di Android 10 atau lebih rendah, kebijakan audio yang dapat dikonfigurasi dipilih menggunakan opsi build USE_CONFIGURABLE_AUDIO_POLICY . Di Android 11 atau lebih tinggi, versi mesin kebijakan audio dipilih dalam file audio_policy_configuration.xml . Untuk memilih mesin kebijakan audio yang dapat dikonfigurasi, setel nilai atribut engine_library dari elemen globalConfiguration menjadi dapat configurable seperti dalam contoh berikut:

<audioPolicyConfiguration>
    <globalConfiguration engine_library="configurable" />
...
</audioPolicyConfiguration>

API perutean kebijakan audio

Android 6.0 memperkenalkan Enumeration and Selection API publik yang berada di atas infrastruktur patch audio/port audio dan memungkinkan pengembang aplikasi untuk menunjukkan preferensi untuk output atau input perangkat tertentu untuk rekaman atau trek audio yang terhubung.

Di Android 7.0, Enumeration and Selection API diverifikasi oleh pengujian CTS dan diperluas untuk menyertakan perutean untuk aliran audio C/C++ (OpenSL ES) asli. Perutean streaming asli terus dilakukan di Java, dengan penambahan antarmuka AudioRouting yang menggantikan, menggabungkan, dan tidak lagi menggunakan metode perutean eksplisit yang khusus untuk kelas AudioTrack dan AudioRecord .

Untuk detail tentang Enumeration and Selection API, lihat antarmuka konfigurasi Android dan OpenSLES_AndroidConfiguration.h . Untuk detail tentang perutean audio, lihat AudioRouting .

Dukungan multi-saluran

Jika perangkat keras dan driver Anda mendukung audio multisaluran melalui HDMI, Anda dapat mengeluarkan aliran audio langsung ke perangkat keras audio (ini melewati mixer AudioFlinger sehingga tidak di-downmix ke dua saluran.) HAL audio harus memperlihatkan apakah profil aliran keluaran mendukung kemampuan audio multisaluran. Jika HAL memperlihatkan kemampuannya, manajer kebijakan default memungkinkan pemutaran multisaluran melalui HDMI. Untuk detail implementasi, lihat device/samsung/tuna/audio/audio_hw.c .

Untuk menentukan bahwa produk Anda berisi keluaran audio multisaluran, edit file konfigurasi kebijakan audio untuk menjelaskan keluaran multisaluran untuk produk Anda. Contoh berikut dari frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml menunjukkan penutup saluran dinamis , yang berarti bahwa pengelola kebijakan audio menanyakan penutup saluran yang didukung oleh sink HDMI setelah sambungan.

Anda juga dapat menentukan penutup saluran statis seperti AUDIO_CHANNEL_OUT_5POINT1 . Mixer AudioFlinger menurunkan konten ke stereo secara otomatis saat dikirim ke perangkat audio yang tidak mendukung audio multisaluran.

Codec media

Pastikan codec audio yang didukung oleh perangkat keras dan driver Anda dinyatakan dengan benar untuk produk Anda. Untuk detailnya, lihat Mengekspos Codec ke Framework .