Batas jenis perangkat

Di audio Android, audio_devices_t digunakan untuk mewakili jenis perangkat audio. Ini banyak digunakan dalam kode sumber audio sebagai bidang bit untuk memfilter atau memilih satu atau lebih perangkat tertentu. Sebelum Android 11, terdapat batasan 30 jenis perangkat input/output audio, dan tidak ada slot cadangan untuk menambahkan jenis perangkat audio baru. Kami telah menghapus batasan jumlah jenis perangkat audio untuk memungkinkan penambahan jenis perangkat audio baru.

Untuk menghapus batasan jumlah jenis perangkat audio, jenis perangkat audio kini menjadi nilai yang disebutkan, bukan masker bit.

Semua jenis perangkat audio yang ada dipertahankan apa adanya. AUDIO_DEVICE_BIT_IN masih digunakan untuk membedakan perangkat input dan output. Saat menambahkan jenis perangkat audio baru, nilai tersebut dihitung dalam kesenjangan antara nilai yang ada.

OEM tidak boleh menggunakan audio_devices_t sebagai bit mask, karena hal itu dapat menyebabkan hasil yang tidak diharapkan ketika jenis perangkat audio baru yang disebutkan ditambahkan.

Contoh dan sumber

Sebelum Android 11, ada dua penggunaan umum jenis perangkat audio sebagai bit mask.

  • Menggunakan nilai audio_devices_t untuk mewakili beberapa perangkat audio.
  • Memeriksa apakah nilai audio_devices_t berisi jenis perangkat audio dari kategori tertentu.

Untuk mewakili beberapa tipe perangkat audio, kelas bernama DeviceTypeSet di /libaudiofoundation/include/media/AudioContainers.h digunakan, yang merupakan std::set container dari audio_devices_t . Kelas dideklarasikan di perpustakaan libaudiofoundation yang tersedia vendor. Untuk mewakili 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 pembantu audio_is_.*_device di /system/media/audio/include/system/audio.h . Untuk beberapa jenis perangkat audio, gunakan fungsi pembantu di libaudiofoundation . Misalnya, gunakan areAllOfSameDeviceType (DeviceTypeSet, std::function ) areAllOfSameDeviceType (DeviceTypeSet, std::function ) di AudioContainers.h untuk memeriksa apakah semua tipe perangkat audio yang diberikan memiliki tipe yang sama.

Penerapan

OEM perlu menghapus representasi bidang bit jenis perangkat audio dari implementasi audio HAL.

  1. Hapus semua penyimpanan perangkat di bidang bit.

    audio_devices_t tidak boleh digunakan untuk mewakili beberapa jenis perangkat audio. Sebagai gantinya, gunakan daftar atau vektor.

  2. Berhenti menggunakan operasi bit untuk perbandingan jenis perangkat.

    Sebelum Android 11, jenis perangkat audio dapat digunakan sebagai bitfield. Dalam hal ini, operasi bit biasanya digunakan untuk perbandingan jenis perangkat. Ketika jenis perangkat audio baru yang disebutkan ditambahkan, operasi bit dapat menyebabkan hasil yang tidak diharapkan. Sebaliknya, gunakan fungsi pembantu sebagai alternatif. Jika hanya ada satu jenis perangkat audio, gunakan perbandingan langsung untuk membandingkan kedua nilai tersebut. Untuk memeriksa apakah jenis perangkat audio termasuk dalam kategori tertentu, gunakan fungsi pembantu di /system/media/audio/include/system/audio.h . Misalnya, audio_is_output_device(audio_devices_t device) .

  3. Berhenti menggunakan nilai yang telah ditentukan sebelumnya untuk grup jenis perangkat audio.

    Ada beberapa nilai yang telah ditentukan sebelumnya untuk grup jenis perangkat audio, AUDIO_DEVICE_OUT_ALL , di system/media/audio/include/system/audio-base-utils.h . Semua nilai ini sudah dicadangkan namun mungkin tidak digunakan lagi karena tidak akan benar bila jenis perangkat audio baru yang disebutkan ditambahkan. Ada grup tipe perangkat audio baru yang ditentukan dalam audio-base-utils.h , yang merupakan array tipe perangkat audio, seperti AUDIO_DEVICE_OUT_ALL_ARRAY .

  4. Terapkan metode create_audio_patch() dan release_audio_patch() untuk perutean, bukan set_parameters .

    Metode set_parameters menggunakan tipe perangkat audio sebagai bitfield, sehingga mungkin ada hasil yang tidak diharapkan jika tipe perangkat audio baru yang disebutkan ditambahkan.

    Saat ini, diperlukan dua jenis patch audio:

    • Campurkan ke patch perangkat, untuk diputar
    • Perangkat untuk mencampur patch, untuk merekam

    Dalam pembaruan berikutnya, patch tambahan mungkin diperlukan untuk perangkat ke perangkat.

    Saat membuat patch audio, jika handle patch tidak ditentukan, HAL audio diperlukan untuk menghasilkan handle patch unik yang dapat mengidentifikasi patch audio. Jika tidak, audio HAL harus menggunakan pegangan patch audio yang diberikan untuk memperbarui patch audio.

    Jika menggunakan HAL audio lama dan pembungkus AOSP HIDL, HAL audio lama harus menyetel versi HAL utama ke 3.0.

    Untuk mengaktifkan fitur patch audio, audio HAL harus mengatur versi HAL utama ke 3.0 atau lebih tinggi. Lihat Device::supportsAudioPatches() dalam implementasi HIDL default untuk informasi lebih lanjut, yang juga dapat ditemukan di audio HAL untuk Cuttlefish.

Kustomisasi

Tidak mungkin untuk mematikan fitur ini, atau mengembalikan pemfaktoran ulang perangkat audio dalam kerangka kerja yang memungkinkan penambahan jenis perangkat audio.

Semua tipe perangkat audio yang ditambahkan memungkinkan representasi tipe perangkat dengan satu set bit, sehingga implementasi HAL saat ini masih berfungsi.

Jika jenis perangkat audio baru ditambahkan dan OEM ingin menggunakannya, mereka harus meningkatkan implementasi audio HAL dan beralih ke HIDL versi 6.0 atau lebih tinggi. Wajib untuk mengupgrade versi HAL utama ke 3.0 dan mengimplementasikan metode create_audio_patch dan release_audio_patch , karena menggunakan set_parameters untuk merutekan streaming dapat menyebabkan hasil yang tidak diharapkan ketika jenis perangkat audio baru ditambahkan.

Validasi

Pekerjaan yang diperlukan bagi OEM adalah memperbarui implementasi HAL mereka. VTS untuk audio HAL dapat digunakan untuk memvalidasi apakah implementasinya berfungsi sebagaimana mestinya. Semua tes dapat ditemukan di file VTS .