Dalam audio Android, audio_devices_t
digunakan untuk merepresentasikan jenis perangkat audio. Bitfield ini
banyak digunakan dalam kode sumber audio sebagai kolom bit untuk memfilter atau memilih satu atau beberapa
perangkat tertentu. Sebelum Android 11, ada batasan 30 jenis perangkat input/output audio, dan tidak ada slot cadangan untuk menambahkan jenis perangkat audio baru. Kami telah menghapus batas jumlah jenis perangkat audio untuk memungkinkan penambahan jenis perangkat audio baru.
Untuk menghapus batas pada jumlah jenis perangkat audio, jenis perangkat audio kini merupakan nilai yang di-enum, bukan mask bit.
Semua jenis perangkat audio yang ada tetap seperti semula. AUDIO_DEVICE_BIT_IN
masih
digunakan untuk membedakan perangkat input atau output. Saat menambahkan jenis perangkat audio baru, jenis tersebut adalah nilai yang di-enum di sela-sela nilai yang ada.
OEM tidak boleh menggunakan audio_devices_t
sebagai mask bit, karena dapat menyebabkan
hasil yang tidak terduga saat jenis perangkat audio baru yang di-enum ditambahkan.
Contoh dan sumber
Sebelum Android 11, ada dua penggunaan umum jenis perangkat audio sebagai masker bit.
- Menggunakan nilai
audio_devices_t
untuk merepresentasikan beberapa perangkat audio. - Memeriksa apakah nilai
audio_devices_t
berisi jenis perangkat audio dari kategori tertentu.
Untuk merepresentasikan beberapa jenis perangkat audio, class bernama DeviceTypeSet
di
/libaudiofoundation/include/media/AudioContainers.h
digunakan, yang merupakan penampung std::set
dari audio_devices_t
. Class
dideklarasikan di library
libaudiofoundation
yang tersedia di vendor. Untuk merepresentasikan
beberapa jenis
perangkat audio dalam kode C, array atau daftar audio_devices_t
dapat digunakan.
Untuk memeriksa apakah satu jenis perangkat termasuk dalam kategori tertentu, gunakan fungsi helper
audio_is_.*_device
di
/system/media/audio/include/system/audio.h
.
Untuk kasus beberapa jenis perangkat audio, gunakan fungsi helper di libaudiofoundation
. Misalnya, gunakan
areAllOfSameDeviceType (DeviceTypeSet, std::function
di
AudioContainers.h
untuk memeriksa apakah semua jenis perangkat audio yang diberikan
memiliki jenis yang sama.
Implementasi
OEM harus menghapus representasi kolom bit jenis perangkat audio dari implementasi HAL audio.
- Menghapus semua penyimpanan perangkat di kolom bit.
audio_devices_t
tidak boleh digunakan untuk merepresentasikan beberapa jenis perangkat audio. Sebagai gantinya, gunakan daftar atau vektor. - Berhenti menggunakan operasi bit untuk perbandingan jenis perangkat.
Sebelum Android 11, jenis perangkat audio dapat digunakan sebagai bitfield. Dalam hal ini, biasanya operasi bit digunakan untuk perbandingan jenis perangkat. Saat jenis perangkat audio baru yang di-enumerasi ditambahkan, operasi bit dapat menyebabkan hasil yang tidak terduga. Sebagai gantinya, gunakan fungsi helper sebagai alternatif. Jika ada satu jenis perangkat audio, gunakan perbandingan langsung untuk membandingkan kedua nilai. Untuk memeriksa apakah jenis perangkat audio termasuk dalam kategori tertentu, gunakan fungsi helper di
/system/media/audio/include/system/audio.h
. Contohnya,audio_is_output_device(audio_devices_t device)
. - Berhenti menggunakan nilai standar untuk grup jenis perangkat audio.
Ada beberapa nilai yang telah ditentukan sebelumnya untuk grup jenis perangkat audio,
AUDIO_DEVICE_OUT_ALL
, disystem/media/audio/include/system/audio-base-utils.h
. Semua nilai ini dicadangkan, tetapi mungkin tidak digunakan lagi karena tidak akan benar saat jenis perangkat audio baru yang di-enumerasi ditambahkan. Ada grup jenis perangkat audio baru yang ditentukan dalamaudio-base-utils.h
, yang merupakan array jenis perangkat audio, sepertiAUDIO_DEVICE_OUT_ALL_ARRAY
. - Implementasikan metode
create_audio_patch()
danrelease_audio_patch()
untuk perutean, bukanset_parameters
.Metode
set_parameters
menggunakan jenis perangkat audio sebagai bitfield, sehingga dapat terjadi hasil yang tidak terduga jika jenis perangkat audio terenumerasi baru ditambahkan.Saat ini, dua jenis patch audio diperlukan:
- Patch campuran ke perangkat, untuk pemutaran
- Perangkat untuk mencampur patch, untuk merekam
Pada update berikutnya, patch tambahan mungkin diperlukan untuk perangkat ke perangkat.
Saat membuat patch audio, jika handle patch tidak ditentukan, HAL audio harus membuat handle patch unik yang dapat mengidentifikasi patch audio. Jika tidak, HAL audio harus menggunakan handle patch audio yang diberikan untuk mengupdate patch audio.
Jika menggunakan HAL audio lama dan wrapper HIDL AOSP, HAL audio lama harus menyetel versi HAL utama ke 3.0.
Untuk mengaktifkan fitur patch audio, HAL audio harus menetapkan versi HAL utama ke 3.0 atau yang lebih tinggi. Lihat
Device::supportsAudioPatches()
di implementasi HIDL default untuk mengetahui informasi selengkapnya, yang juga dapat ditemukan di HAL audio untuk Cuttlefish.
Penyesuaian
Anda tidak dapat menonaktifkan fitur ini, atau mengembalikan refaktorisasi perangkat audio di framework yang memungkinkan penambahan jenis perangkat audio.
Semua jenis perangkat audio yang ditambahkan memungkinkan representasi jenis perangkat dengan satu set bit, sehingga implementasi HAL saat ini masih berfungsi.
Jika jenis perangkat audio baru ditambahkan dan OEM ingin menggunakannya, mereka harus mengupgrade implementasi HAL audio dan beralih ke HIDL versi 6.0 atau yang lebih tinggi. Anda
harus mengupgrade versi HAL utama ke 3.0 dan menerapkan metode
create_audio_patch
dan release_audio_patch
, karena
penggunaan set_parameters
untuk merutekan stream dapat menyebabkan hasil yang tidak terduga saat
jenis perangkat audio baru ditambahkan.
Validasi
Pekerjaan yang diperlukan untuk OEM adalah mengupdate implementasi HAL mereka. VTS untuk HAL audio dapat digunakan untuk memvalidasi apakah implementasi berfungsi sebagaimana mestinya. Semua pengujian dapat ditemukan di file VTS.