Rilis Android 10 mencakup pemfaktoran ulang yang signifikan pada pengelola kebijakan audio untuk memberikan fleksibilitas yang lebih besar guna mendukung kasus penggunaan otomotif yang kompleks:
- Strategi pemilihan rute khusus OEM.
- Grup volume yang dapat disesuaikan untuk grup jenis streaming lama yang menggunakan kurva volume yang sama.
- Strategi pemilihan rute yang dideklarasikan oleh mesin kebijakan audio, bukan di-hard code.
- Kurva dan grup volume yang dikelola oleh mesin kebijakan audio.
- Pemfaktoran ulang internal yang mempersiapkan pemisahan di masa mendatang antara kode umum dan kode yang dapat dikonfigurasi serta menawarkan pengelolaan 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 mengharuskan penggunaan
device/<company>/<device>/audio/audio_policy.conf
untuk mendeklarasikan perangkat audio yang ada di produk Anda (Anda dapat melihat contoh
file ini untuk hardware audio Galaxy Nexus di
device/samsung/tuna/audio/audio_policy.conf
). Namun, CONF adalah
format eksklusif sederhana yang terlalu terbatas untuk mendeskripsikan topologi kompleks untuk
vertikal seperti televisi dan mobil.
Android 7.0 menghentikan audio_policy.conf
dan menambahkan dukungan
untuk menentukan topologi audio menggunakan format file XML yang lebih
mudah dibaca manusia, memiliki berbagai alat pengeditan dan penguraian, serta cukup fleksibel
untuk menggambarkan topologi audio yang kompleks. Android 7.0 menggunakan
tanda build USE_XML_AUDIO_POLICY_CONF
untuk memilih format
XML file konfigurasi.
Keunggulan format XML
Seperti pada file CONF, file XML memungkinkan penentuan jumlah dan jenis profil streaming input dan output, perangkat yang dapat digunakan untuk pemutaran dan perekaman, serta atribut audio. Selain itu, format XML menawarkan peningkatan berikut:
- Di Android 10, lebih dari satu aplikasi perekaman aktif
diizinkan secara bersamaan.
- Awal perekaman tidak pernah ditolak karena situasi serentak.
- Callback
registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb)
memberi tahu klien tentang perubahan jalur pengambilan.
- Dalam situasi berikut, klien akan mendapatkan sampel audio tanpa suara:
- Kasus penggunaan yang sensitif terhadap privasi (misalnya,
VOICE_COMMUNICATION
) aktif. - Klien tidak memiliki layanan latar depan atau UI latar depan.
- Peran khusus diakui oleh kebijakan:
- Layanan aksesibilitas: Dapat merekam meskipun kasus penggunaan yang sensitif terhadap privasi aktif.
- Asisten: Dianggap sensitif privasi jika UI berada di atas.
- Kasus penggunaan yang sensitif terhadap privasi (misalnya,
- Profil audio memiliki struktur yang mirip dengan deskripsi audio sederhana HDMI, yang memungkinkan kumpulan frekuensi sampling/mask saluran yang berbeda untuk setiap format audio.
- Ada definisi eksplisit untuk semua kemungkinan koneksi antara perangkat dan streaming. Sebelumnya, aturan implisit memungkinkan untuk menghubungkan semua perangkat yang terpasang ke modul HAL yang sama, sehingga mencegah kebijakan audio mengontrol koneksi yang diminta dengan API patch audio. Dalam format XML, deskripsi topologi mendefinisikan batasan koneksi.
- Dukungan untuk includes menghindari pengulangan definisi pengiriman A2DP, USB, atau reroute standar.
- Kurva volume dapat disesuaikan. Sebelumnya, tabel volume di-hardcode. Dalam format XML, tabel volume dijelaskan dan dapat disesuaikan.
Template di
frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml
menunjukkan banyak fitur yang sedang digunakan.
Format dan lokasi file
File konfigurasi kebijakan audio 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.
Tampilkan contoh kebijakan audio untuk Android 12
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <audioPolicyConfiguration version="7.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <globalConfiguration speaker_drc_enabled="true"/> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>Speaker</item> <item>Earpiece</item> <item>Built-In Mic</item> </attachedDevices> <defaultOutputDevice>Speaker</defaultOutputDevice> <mixPorts> <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> <mixPort name="primary input" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address=""> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> </devicePorts> <routes> <route type="mix" sink="Earpiece" sources="primary output"/> <route type="mix" sink="Speaker" sources="primary output"/> <route type="mix" sink="Wired Headset" sources="primary output"/> <route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/> </routes> </module> <xi:include href="a2dp_audio_policy_configuration.xml"/> </modules> <xi:include href="audio_policy_volumes.xml"/> <xi:include href="default_volume_tables.xml"/> </audioPolicyConfiguration>
Menampilkan contoh kebijakan audio untuk versi di bawah Android 12
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <globalConfiguration speaker_drc_enabled="true"/> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>Speaker</item> <item>Earpiece</item> <item>Built-In Mic</item> </attachedDevices> <defaultOutputDevice>Speaker</defaultOutputDevice> <mixPorts> <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> <mixPort name="primary input" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address=""> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> </devicePorts> <routes> <route type="mix" sink="Earpiece" sources="primary output"/> <route type="mix" sink="Speaker" sources="primary output"/> <route type="mix" sink="Wired Headset" sources="primary output"/> <route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/> </routes> </module> <xi:include href="a2dp_audio_policy_configuration.xml"/> </modules> <xi:include href="audio_policy_volumes.xml"/> <xi:include href="default_volume_tables.xml"/> </audioPolicyConfiguration>
Struktur tingkat teratas berisi modul yang sesuai dengan setiap modul hardware HAL audio, dengan setiap modul memiliki daftar port campuran, port perangkat, dan rute:
- Port campuran menjelaskan kemungkinan profil konfigurasi untuk streaming yang dapat dibuka di HAL audio untuk pemutaran dan perekaman.
- Port perangkat menjelaskan perangkat yang dapat dihubungkan dengan jenisnya (dan secara opsional properti alamat dan audio, jika relevan).
- Rute dipisahkan dari deskripsi port campuran, sehingga memungkinkan deskripsi rute dari perangkat ke perangkat atau streaming ke perangkat.
Tabel volume adalah daftar sederhana dari titik yang menentukan kurva yang digunakan untuk menerjemahkan dari indeks UI ke volume dalam dB. File penyertaan terpisah menyediakan kurva default, tetapi setiap kurva untuk kasus penggunaan dan kategori perangkat tertentu dapat ditimpa.
Contoh tabel volume
<?xml version="1.0" encoding="UTF-8"?> <volumes> <reference name="FULL_SCALE_VOLUME_CURVE"> <point>0,0</point> <point>100,0</point> </reference> <reference name="SILENT_VOLUME_CURVE"> <point>0,-9600</point> <point>100,-9600</point> </reference> <reference name="DEFAULT_VOLUME_CURVE"> <point>1,-4950</point> <point>33,-3350</point> <point>66,-1700</point> <point>100,0</point> </reference> </volumes>
Contoh volume yang ditampilkan
<?xml version="1.0" encoding="UTF-8"?> <volumes> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA"ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_SPEAKER"> <point>1,-5500</point> <point>20,-4300</point> <point>86,-1200</point> <point>100,0</point> </volume> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="SILENT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="SILENT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="SILENT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/> </volumes>
Penyertaan file
Metode Penyertaan XML (XInclude) dapat digunakan untuk menyertakan informasi konfigurasi kebijakan audio yang berada di file XML lainnya. Semua file yang disertakan harus mengikuti struktur yang dijelaskan di atas dengan batasan berikut:
- File hanya dapat berisi elemen tingkat teratas.
- File tidak boleh berisi elemen XInclude.
Penggunaan mencakup untuk menghindari penyalinan informasi konfigurasi modul HAL audio Android Open Source Project (AOSP) standar ke semua file konfigurasi kebijakan audio (yang rentan terhadap error). File XML konfigurasi kebijakan audio standar disediakan untuk HAL audio berikut:
- A2DP:
a2dp_audio_policy_configuration.xml
- Submix rutekan ulang:
rsubmix_audio_policy_configuration.xml
- USB:
usb_audio_policy_configuration.xml
Pengaturan kode kebijakan audio
AudioPolicyManager.cpp
dibagi menjadi beberapa modul
untuk memudahkan pemeliharaan dan konfigurasi. Pengaturan
frameworks/av/services/audiopolicy
mencakup
modul berikut.
Modul | Deskripsi |
---|---|
/managerdefault |
Mencakup antarmuka umum dan implementasi perilaku yang umum untuk semua
aplikasi. Mirip dengan AudioPolicyManager.cpp dengan fungsi
mesin dan konsep umum yang di-abstract. |
/common |
Menentukan class dasar (misalnya, struktur data untuk profil streaming
audio input output, deskripsi perangkat audio, patch audio, dan port audio). Sebelumnya, ini
ditentukan di dalam AudioPolicyManager.cpp . |
/engine |
Mengimplementasikan aturan yang menentukan perangkat dan volume mana yang harus digunakan untuk kasus penggunaan tertentu. Class ini mengimplementasikan antarmuka standar dengan bagian generik, seperti untuk mendapatkan perangkat yang sesuai untuk kasus penggunaan pemutaran atau perekaman tertentu, atau untuk menetapkan perangkat yang terhubung atau status eksternal (yaitu, status panggilan penggunaan paksa) yang dapat mengubah keputusan pemilihan rute. Tersedia dalam dua versi: dapat dikonfigurasi dan default. Untuk informasi tentang cara memilih versi, lihat Konfigurasi menggunakan Framework Parameter. |
/engineconfigurable |
Penerapan mesin kebijakan yang mengandalkan Framework Parameter (lihat di bawah). Konfigurasi didasarkan pada Framework Parameter dan tempat kebijakan ditentukan oleh file XML. |
/enginedefault |
Implementasi mesin kebijakan berdasarkan penerapan Pengelola Kebijakan Audio Android sebelumnya. Ini adalah default dan mencakup aturan hard code yang terkait dengan implementasi Nexus dan AOSP. |
/service |
Mencakup antarmuka binder, threading, dan penerapan penguncian dengan antarmuka ke framework lainnya. |
Konfigurasi menggunakan Framework Parameter
Kode kebijakan audio disusun agar mudah dipahami dan dikelola sekaligus mendukung kebijakan audio yang ditentukan sepenuhnya oleh file konfigurasi. Desain organisasi dan kebijakan audio didasarkan pada Framework Parameter Intel, framework berbasis plugin dan berbasis aturan untuk menangani parameter.
Dengan menggunakan kebijakan audio yang dapat dikonfigurasi, OEM vendor dapat:
- Jelaskan struktur sistem dan parameternya dalam XML.
- Tulis (dalam C++) atau gunakan kembali backend (plugin) untuk mengakses parameter yang dijelaskan.
- Tentukan (dalam XML atau dalam bahasa khusus domain) kondisi/aturan yang menjadi dasar parameter tertentu harus mengambil nilai tertentu.
AOSP menyertakan contoh file konfigurasi kebijakan audio yang menggunakan Framework
Parameter di Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml
. Untuk
mengetahui detailnya, lihat dokumentasi Intel tentang
Parameter Framework.
Di Android 10 atau yang lebih rendah, kebijakan audio yang dapat dikonfigurasi
dipilih menggunakan opsi build USE_CONFIGURABLE_AUDIO_POLICY
.
Di Android 11 atau yang lebih baru, versi mesin kebijakan
audio dipilih dalam file audio_policy_configuration.xml
.
Untuk memilih mesin kebijakan audio yang dapat dikonfigurasi, tetapkan nilai atribut engine_library
elemen globalConfiguration
ke configurable
seperti dalam contoh berikut:
<audioPolicyConfiguration> <globalConfiguration engine_library="configurable" /> ... </audioPolicyConfiguration>
API pemilihan rute kebijakan audio
Android 6.0 memperkenalkan Enumeration dan Selection API publik yang berada di atas infrastruktur port audio/patch audio dan memungkinkan developer 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 pemilihan rute untuk streaming audio C/C++ native (OpenSL ES).
Pemilihan rute streaming native terus dilakukan di Java, dengan penambahan
antarmuka AudioRouting
yang menggantikan, menggabungkan, dan menghentikan penggunaan
metode pemilihan rute eksplisit yang khusus untuk class AudioTrack
dan
AudioRecord
.
Untuk mengetahui detail tentang Enumeration dan Selection API, lihat
Antarmuka
konfigurasi Android dan OpenSLES_AndroidConfiguration.h
.
Untuk mengetahui detail tentang pemilihan rute audio, lihat
AudioRouting.
Dukungan multisaluran
Jika hardware dan driver Anda mendukung audio multisaluran melalui HDMI, Anda dapat
menghasilkan streaming audio langsung ke hardware audio (tindakan ini akan mengabaikan
mixer AudioFlinger sehingga tidak didownmix ke dua saluran.) HAL audio
harus mengekspos apakah profil streaming output mendukung kemampuan
audio multisaluran. Jika HAL memperlihatkan kemampuannya, pengelola kebijakan default
memungkinkan pemutaran multisaluran melalui HDMI. Untuk detail penerapan, lihat
device/samsung/tuna/audio/audio_hw.c
.
Untuk menentukan bahwa produk Anda berisi output audio multisaluran, edit
file konfigurasi kebijakan audio untuk menjelaskan output multisaluran untuk
produk Anda. Contoh berikut dari
frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml
menampilkan mask saluran dinamis, yang berarti bahwa pengelola kebijakan audio mengkueri mask saluran
yang didukung oleh sink HDMI setelah koneksi.
Menampilkan contoh konfigurasi perangkat HDMI
<module name="primary" halVersion="2.0"> <attachedDevices> <item>Speaker</item> </attachedDevices> <defaultOutputDevice>Speaker</defaultOutputDevice> <mixPorts> <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> <mixPort name="direct" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT" /> <mixPort name="tunnel" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_HW_AV_SYNC" /> </mixPorts> <devicePorts> <devicePort tagName="Speaker" type="AUDIO_DEVICE_OUT_SPEAKER" role="sink" /> <devicePort tagName="Out Aux Digital" type="AUDIO_DEVICE_OUT_AUX_DIGITAL" role="sink" encodedFormats="AUDIO_FORMAT_AC3 AUDIO_FORMAT_IEC61937" /> </devicePorts> <routes> <route type="mix" sink="Speaker" sources="primary output"/> <route type="mix" sink="Out Aux Digital" sources="primary output,direct,tunnel"/> </routes> </module>
Anda juga dapat menentukan mask saluran statis seperti
AUDIO_CHANNEL_OUT_5POINT1
. Mixer AudioFlinger melakukan downmix
konten ke stereo secara otomatis saat dikirim ke perangkat audio yang tidak
mendukung audio multisaluran.
Codec media
Pastikan codec audio yang didukung hardware dan driver Anda dideklarasikan dengan benar untuk produk Anda. Untuk mengetahui detailnya, lihat Mengekspos Codec ke Framework.