Batas jenis perangkat

Dalam audio Android, audio_devices_t digunakan untuk mewakili jenis perangkat audio. Ini secara luas digunakan dalam kode sumber audio sebagai kolom bit untuk memfilter atau memilih satu atau beberapa perangkat yang ditentukan. Sebelum Android 11, ada batas 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 jenis perangkat audio baru ditambahkan.

Untuk menghapus batas jumlah jenis perangkat audio, jenis perangkat audio kini menjadi nilai yang dihitung, bukan mask bit.

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

OEM tidak boleh menggunakan audio_devices_t sebagai bit mask, karena hal itu dapat menyebabkan hasil yang tidak terduga saat jenis perangkat audio yang dihitung baru 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 yang ditentukan.

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 untuk vendor. Untuk mewakili beberapa jenis perangkat audio dalam kode C, array atau daftar audio_devices_t dapat digunakan.

Untuk memeriksa apakah satu jenis perangkat berasal dari kategori yang ditentukan, gunakan fungsi bantuan audio_is_.*_device di /system/media/audio/include/system/audio.h. Untuk kasus beberapa jenis perangkat audio, gunakan fungsi bantuan 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 perlu menghapus representasi kolom bit jenis perangkat audio dari implementasi HAL audio.

  1. 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.

  2. 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 dihitung ditambahkan, operasi bit dapat menyebabkan hasil yang tidak terduga. Sebagai gantinya, gunakan fungsi bantuan sebagai alternatif. Jika ada satu jenis perangkat audio, gunakan perbandingan langsung untuk membandingkan kedua nilai tersebut. Untuk memeriksa apakah jenis perangkat audio berasal dari kategori yang ditentukan, gunakan fungsi bantuan di /system/media/audio/include/system/audio.h. Contohnya, audio_is_output_device(audio_devices_t device).

  3. Berhenti menggunakan nilai standar untuk grup jenis perangkat audio.

    Ada beberapa nilai standar untuk grup jenis perangkat audio, AUDIO_DEVICE_OUT_ALL, di system/media/audio/include/system/audio-base-utils.h. Semua nilai ini disediakan, tetapi mungkin tidak digunakan lagi karena tidak akan benar saat jenis perangkat audio yang dihitung baru ditambahkan. Ada grup jenis perangkat audio baru yang ditentukan di audio-base-utils.h, yang merupakan array jenis perangkat audio, seperti AUDIO_DEVICE_OUT_ALL_ARRAY.

  4. Implementasikan metode create_audio_patch() dan release_audio_patch() untuk pemilihan rute, bukan set_parameters.

    Metode set_parameters menggunakan jenis perangkat audio sebagai bitfield, sehingga dapat ada hasil yang tidak terduga jika jenis perangkat audio yang dihitung baru ditambahkan.

    Saat ini, dua jenis patch audio diperlukan:

    • Campuran ke patch perangkat, untuk pemutaran
    • Perangkat untuk mencampur patch, untuk perekaman

    Dalam update 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, 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 menetapkan 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 penerapan HIDL default untuk mengetahui informasi selengkapnya, yang juga dapat ditemukan di HAL audio untuk Cuttlefish.

Penyesuaian

Anda tidak dapat menonaktifkan fitur ini, atau mengembalikan pemfaktoran ulang perangkat audio dalam 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 menggunakan set_parameters untuk merutekan streaming 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 penerapan berfungsi sebagaimana mestinya. Semua pengujian dapat ditemukan di file VTS.