Perutean Perangkat Audio Gabungan

Fitur perutean perangkat audio gabungan menambahkan dukungan untuk streaming audio ke beberapa perangkat audio secara bersamaan. Dengan menggunakan fitur ini, aplikasi dengan hak istimewa dapat memilih beberapa perangkat pilihan untuk strategi tertentu melalui API sistem. Aplikasi dapat menemukan kemampuan perangkat audio secara lebih tepat dengan menggunakan API publik yang disediakan oleh fitur ini. Untuk Android versi 11 dan yang lebih rendah, implementasi kerangka kerja audio memiliki dukungan terbatas untuk beberapa perangkat audio dengan jenis yang sama (misalnya, 2 headset Bluetooth A2DP) yang terhubung secara bersamaan. Aturan perutean audio default juga tidak mengizinkan pengguna untuk memilih beberapa perangkat dengan jenis yang sama untuk kasus penggunaan tertentu.

Dimulai dengan Android 12, batasan ini dihapus untuk memungkinkan kasus penggunaan baru seperti penyiaran audio, multicasting ke grup headphone audio BLE, atau menggunakan beberapa kartu suara USB secara bersamaan.

Halaman ini membahas cara menerapkan dukungan untuk streaming audio ke beberapa perangkat audio, dan cara memvalidasi penerapan fitur ini.

Mendukung streaming audio ke beberapa perangkat audio

Ada dua set API di Android 12 yang mendukung fitur ini:

  • API sistem menangani beberapa perangkat pilihan untuk suatu strategi.
  • Antarmuka HIDL, yang diimplementasikan oleh vendor sebagai bagian dari audio HAL, melaporkan kemampuan perangkat.

Bagian berikut membahas masing-masing API ini secara lebih mendetail.

Menangani beberapa perangkat pilihan untuk sebuah strategi

Audio Policy Manager menawarkan API sistem untuk lebih mendukung streaming audio ke beberapa perangkat audio secara bersamaan. API sistem ini memungkinkan pengaturan, mendapatkan, dan menghapus beberapa perangkat pilihan untuk strategi tertentu. Hingga Android 12, fitur ini hanya didukung untuk satu perangkat.

Audio Policy Manager memperkenalkan konsep perangkat media aktif untuk menjelaskan perangkat yang paling mungkin dipilih untuk pemutaran media. Saat perangkat yang dapat dilepas terhubung, aliran output audio HAL yang dapat dirutekan ke perangkat ini mungkin harus dibuka dan diperiksa untuk atribut yang didukung.

Perangkat audio harus ditentukan saat membuka aliran keluaran. Perangkat media aktif adalah perangkat yang digunakan saat aliran keluaran dibuka dalam konteks ini.

Pemilihan perangkat media aktif dapat berubah tergantung pada perangkat yang sebenarnya terhubung atau terputus. Pengelola Kebijakan Audio menggunakan rangkaian aturan berikut untuk memilih perangkat media aktif:

  1. Jika semua perangkat pilihan untuk media tersedia, semuanya dipilih sebagai perangkat aktif.
  2. Jika tidak, perangkat lepasan yang terhubung terakhir akan dipilih.
  3. Jika tidak ada perangkat yang dapat dilepas yang terhubung, aturan kebijakan audio default untuk memilih perangkat keluaran diterapkan untuk memilih perangkat yang aktif.

Aliran keluaran harus memenuhi kriteria berikut untuk dibuka kembali dan dirutekan ke perangkat aktif sehingga konfigurasi terbaik dipilih untuk pemutaran:

  • Aliran keluaran harus mendukung perangkat aktif.
  • Aliran keluaran harus mendukung profil dinamis.
  • Aliran keluaran saat ini tidak boleh dirutekan ke perangkat aktif.

Untuk menerapkan pemilihan perangkat baru, Pengelola Kebijakan Audio menutup dan membuka kembali aliran keluaran pada sambungan perangkat jika aliran keluaran menganggur, atau menundanya saat aliran keluaran ditempatkan ke siaga.

Audio Policy Manager menawarkan daftar API sistem berikut (sebagaimana didefinisikan dalam AudioManager.java ):

  • setPreferredDeviceForStrategy

    Menyetel perangkat pilihan untuk perutean audio untuk strategi tertentu. Perhatikan bahwa perangkat mungkin tidak tersedia pada saat perangkat pilihan diatur, tetapi digunakan setelah tersedia.

  • removePreferredDeviceForStrategy

    Menghapus perangkat audio pilihan yang sebelumnya disetel dengan setPreferredDeviceForStrategy atau setPreferredDevicesForStrategy .

  • getPreferredDeviceForStrategy

    Mengembalikan perangkat pilihan untuk strategi audio yang sebelumnya disetel dengan setPreferredDeviceForStrategy atau setPreferredDevicesForStrategy .

  • setPreferredDevicesForStrategy

    Menetapkan perangkat pilihan untuk strategi tertentu.

  • getPreferredDevicesForStrategy

    Mengembalikan perangkat pilihan untuk strategi audio yang sebelumnya disetel dengan setPreferredDeviceForStrategy atau setPreferredDevicesForStrategy .

  • OnPreferredDevicesForStrategyChangedListener

    Menentukan antarmuka untuk pemberitahuan perubahan pada perangkat audio pilihan yang disetel untuk strategi audio tertentu.

  • addOnPreferredDevicesForStrategyChangedListener

    Menambahkan pendengar untuk mendapatkan pemberitahuan tentang perubahan pada perangkat audio pilihan strategi.

  • removeOnPreferredDevicesForStrategyChangedListener

    Menghapus pendengar perubahan yang ditambahkan sebelumnya ke perangkat audio pilihan strategi.

Kemampuan perangkat pelaporan

Sebagai bagian dari implementasi Audio HAL, vendor mengimplementasikan API yang mendukung kemampuan perangkat pelaporan. Bagian ini menjelaskan tipe data dan metode yang digunakan untuk melaporkan kemampuan perangkat dan mencantumkan beberapa perubahan yang dibuat pada audio HIDL HAL V7 untuk mendukung beberapa perangkat.

Tipe data

Dalam audio HIDL HAL V7, kemampuan perangkat dilaporkan menggunakan struktur AudioProfile dan AudioTransport . Struktur AudioTransport menjelaskan kemampuan port audio dengan AudioProfile untuk format audio yang dikenal, atau dengan deskriptor perangkat keras mentah untuk format yang tidak diketahui oleh platform. Struktur AudioProfile berisi format audio, laju sampel yang didukung oleh profil, dan daftar topeng saluran, seperti yang ditunjukkan pada blok kode berikut dari types.hal :

/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
   AudioFormat format;
   /** List of the sample rates (in Hz) supported by the profile. */
   vec<uint32_t> sampleRates;
   /** List of channel masks supported by the profile. */
   vec<AudioChannelMask> channelMasks;
};

Dalam audio HIDL HAL V7, tipe data AudioPort didefinisikan dengan struktur AudioTransport dan AudioProfile untuk menjelaskan kemampuan perangkat.

Metode Audio HAL

Manajer Kebijakan Audio menggunakan metode berikut untuk menanyakan kemampuan perangkat:

  • getParameters: Metode umum untuk mengambil nilai parameter khusus vendor seperti format audio yang didukung dan kecepatan pengambilan sampelnya masing-masing.
  • getAudioPort: Mengembalikan daftar atribut yang didukung (seperti laju pengambilan sampel, format, masker saluran, pengontrol penguatan) untuk port audio tertentu.

Kode berikut dari IDevice.hal menunjukkan antarmuka untuk metode getAudioPort :

   /**
    * Returns the list of supported attributes for a given audio port.
    *
    * As input, 'port' contains the information (type, role, address etc...)
    * needed by the HAL to identify the port.
    *
    * As output, 'resultPort' contains possible attributes (sampling rates,
    * formats, channel masks, gain controllers...) for this port.
    *
    * @param port port identifier.
    * @return retval operation completion status.
    * @return resultPort port descriptor with all parameters filled up.
    */
   getAudioPort(AudioPort port)
           generates (Result retval, AudioPort resultPort);

Perubahan pada API lama

Untuk mendukung beberapa profil audio, versi 3.2 dari API lama menambahkan struktur baru yang disebut audio_port_v7 . Lihat kode sumber untuk lebih jelasnya.

Karena penambahan audio_port_v7 , versi 3.2 dari API lawas menambahkan API baru yang disebut get_audio_port_v7 untuk menanyakan kemampuan perangkat menggunakan struktur audio_port_v7 .

Kode berikut dari audio.h menunjukkan definisi get_audio_port_v7 API:

/**
 * Fills the list of supported attributes for a given audio port.
 * As input, "port" contains the information (type, role, address etc...)
 * needed by the HAL to identify the port.
 * As output, "port" contains possible attributes (sampling rates,
 * formats, channel masks, gain controllers...) for this port. The
 * possible attributes are saved as audio profiles, which contains audio
 * format and the supported sampling rates and channel masks.
 */
 int (*get_audio_port_v7)(struct audio_hw_device *dev,
                          struct audio_port_v7 *port);

Data dari get_audio_port API lawas harus diisi ke dalam format AudioPort baru bila versi API lawas di bawah 3.2 dan versi HIDL HAL 7 atau lebih tinggi. Dalam hal ini, semua laju sampel dan masker saluran yang dilaporkan dari get_audio_port diasumsikan didukung untuk semua format yang dikembalikan, memungkinkan pemetaan langsung dari nilai get_audio_port ke struktur AudioPort baru.

Contoh implementasi API

Bagian ini menjelaskan beberapa rangkaian pengujian yang berisi metode yang menggunakan API yang tercakup dalam bagian sebelumnya. Lihat metode ini untuk beberapa contoh bagaimana API ini diterapkan dan digunakan.

Contoh penggunaan setPreferredDevicesForStrategy , getPreferredDevicesForStrategy , removePreferredDeviceForStrategy , dan OnPreferredDevicesForStrategyChangedListener ada di metode PreferredDeviceRoutingTest , yang terletak di GTS.

Untuk melihat contoh struktur baru di AudioDeviceInfo digunakan, lihat metode AudioManagerTest#testGetDevices yang terletak di CTS.

Contoh implementasi untuk get_audio_port_v7 terletak di audio_hal.c dan menunjukkan bagaimana kemampuan ditanyakan untuk beberapa perangkat.

Validasi

Bagian ini memberikan informasi tentang validasi CTS dan GTS (Google Mobile Services Test Suite) dari Pengelola Audio.

tes CTS

Tes CTS terletak di android.media.cts.AudioManagerTest .

Berikut adalah daftar tes Audio Manager yang tersedia:

  • AudioManagerTest#testGetDevices

    Memverifikasi kemampuan yang tepat dari perangkat audio. Ini juga memverifikasi bahwa profil audio yang dikembalikan dalam struktur AudioDeviceInfo mempertahankan konten dari format array yang lebih lama dan rata, tetapi dalam format AudioProfile baru.

  • AudioManagerTest#testPreferredDevicesForStrategy dan AudioManagerTest#testPreferredDeviceForCapturePreset

    Verifikasi bahwa perangkat pilihan untuk strategi dan menangkap tes API terkait preset berhasil diselesaikan.

tes GTS

Tes GTS terletak di com.google.android.gts.audioservice.AudioServiceHostTest .

Untuk memvalidasi apakah API untuk perangkat pilihan untuk strategi dan menangkap prasetel berfungsi dengan benar, jalankan AudioServiceHostTest#testPreferredDeviceRouting dan AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset .