Pemilihan rute perangkat audio gabungan

Fitur perutean perangkat audio gabungan menambahkan dukungan untuk streaming audio ke beberapa perangkat audio secara bersamaan. Dengan fitur ini, aplikasi istimewa dapat memilih beberapa perangkat pilihan untuk strategi tertentu melalui API sistem. Aplikasi dapat menemukan kemampuan perangkat audio secara lebih akurat dengan menggunakan API publik yang disediakan oleh fitur ini. Untuk Android versi 11 dan yang lebih lama, penerapan framework 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 memilih beberapa perangkat dengan jenis yang sama untuk kasus penggunaan tertentu.

Mulai Android 12, batasan ini dihapus untuk memungkinkan kasus penggunaan baru seperti penyiaran audio, multi-casting ke grup headphone audio BLE, atau memilih beberapa kartu suara USB secara bersamaan. Perutean ke beberapa perangkat USB secara bersamaan tidak didukung.

Mulai Android 14, framework USB mendukung perutean ke beberapa perangkat USB asalkan perangkat USB tersebut memiliki jenis perangkat audio yang berbeda dan ada dukungan kernel dan vendor untuk menghubungkan beberapa perangkat 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 HAL audio, melaporkan kemampuan perangkat.

Bagian berikut membahas setiap API ini secara lebih mendetail.

Menangani beberapa perangkat pilihan untuk strategi

Audio Policy Manager menawarkan API sistem untuk mendukung streaming audio ke beberapa perangkat audio secara bersamaan dengan lebih baik. API sistem ini memungkinkan penyetelan, pengambilan dan penghapusan 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 mendeskripsikan perangkat yang kemungkinan besar dipilih untuk pemutaran media. Saat perangkat yang dapat dilepas terhubung, output streaming HAL audio yang dapat dirutekan ke perangkat ini mungkin harus dibuka dan diperiksa atribut yang didukungnya.

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

Pilihan perangkat media aktif dapat berubah bergantung pada perangkat yang terhubung atau terputus sambungannya. Audio Policy Manager menggunakan serangkaian aturan berikut untuk memilih perangkat media aktif:

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

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

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

Untuk menerapkan pilihan perangkat baru, Audio Policy Manager menutup dan membuka kembali aliran output saat koneksi perangkat jika aliran output tidak ada aktivitas, atau menundanya saat aliran output dalam mode standby.

Audio Policy Manager menawarkan daftar API sistem berikut(seperti yang ditentukan dalam AudioManager.java):

  • setPreferredDeviceForStrategy

    Menetapkan perangkat pilihan untuk perutean audio untuk strategi tertentu. Perhatikan bahwa perangkat mungkin tidak tersedia pada saat perangkat pilihan ditetapkan, tetapi akan digunakan setelah tersedia.

  • removePreferredDeviceForStrategy

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

  • getPreferredDeviceForStrategy

    Menampilkan perangkat pilihan untuk strategi audio yang sebelumnya ditetapkan dengan setPreferredDeviceForStrategy atau setPreferredDevicesForStrategy.

  • setPreferredDevicesForStrategy

    Menetapkan perangkat pilihan untuk strategi tertentu.

  • getPreferredDevicesForStrategy

    Menampilkan perangkat pilihan untuk strategi audio yang sebelumnya ditetapkan dengan setPreferredDeviceForStrategy atau setPreferredDevicesForStrategy.

  • OnPreferredDevicesForStrategyChangedListener

    Menentukan antarmuka untuk notifikasi perubahan pada perangkat audio pilihan yang ditetapkan untuk strategi audio tertentu.

  • addOnPreferredDevicesForStrategyChangedListener

    Menambahkan pemroses untuk mendapatkan notifikasi tentang perubahan pada perangkat audio pilihan strategi.

  • removeOnPreferredDevicesForStrategyChangedListener

    Menghapus pendengar perubahan yang sebelumnya ditambahkan ke perangkat audio yang lebih disukai strategi.

Melaporkan kemampuan perangkat

Sebagai bagian dari penerapan HAL Audio, vendor menerapkan API yang mendukung pelaporan kemampuan perangkat. Bagian ini menjelaskan jenis data dan metode yang digunakan untuk melaporkan kemampuan perangkat dan mencantumkan beberapa perubahan yang dilakukan di audio HIDL HAL V7 untuk mendukung beberapa perangkat.

Jenis data

Di audio HIDL HAL V7, kemampuan perangkat dilaporkan menggunakan struktur AudioProfile dan AudioTransport. Struktur AudioTransport menjelaskan kemampuan port audio dengan AudioProfile untuk format audio yang diketahui, atau dengan deskriptor hardware mentah untuk format yang tidak diketahui oleh platform. Struktur AudioProfile berisi format audio, frekuensi sampling yang didukung oleh profil, dan daftar mask saluran, seperti yang ditunjukkan dalam 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;
};

Di audio HIDL HAL V7, jenis data AudioPort ditentukan dengan struktur AudioTransport danAudioProfile untuk mendeskripsikan kemampuan perangkat.

Metode HAL audio

Audio Policy Manager menggunakan metode berikut untuk mengkueri kemampuan perangkat:

  • getParameters:Metode generik untuk mengambil nilai parameter khusus vendor seperti format audio yang didukung dan frekuensi samplingnya masing-masing.
  • getAudioPort:Menampilkan daftar atribut yang didukung (seperti laju pengambilan sampel, format, mask saluran, pengontrol gain) 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 API lama menambahkan struktur baru yang disebut audio_port_v7. Lihat kode sumber untuk mengetahui detail selengkapnya.

Karena penambahan audio_port_v7, API lama versi 3.2 menambahkan API baru yang disebut get_audio_port_v7 untuk mengkueri kemampuan perangkat menggunakan struktur audio_port_v7.

Kode berikut dari audio.h menunjukkan definisi API get_audio_port_v7:

/**
 * 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 lama harus diisi ke dalam format AudioPort baru jika versi API lama di bawah 3.2 dan versi HIDL HAL adalah 7 atau yang lebih tinggi. Dalam hal ini, semua frekuensi sampel dan mask saluran yang dilaporkan dari get_audio_port diasumsikan didukung untuk semua format yang ditampilkan, sehingga memungkinkan pemetaan langsung dari nilai get_audio_port ke struktur AudioPort baru.

Contoh penerapan API

Bagian ini menjelaskan beberapa rangkaian pengujian yang berisi metode yang menggunakan API yang dibahas di bagian sebelumnya. Lihat metode ini untuk beberapa contoh cara API ini diterapkan dan digunakan.

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

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

Contoh penerapan untuk get_audio_port_v7 terletak di audio_hal.c dan menunjukkan cara kemampuan dikueri untuk beberapa perangkat.

Validasi

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

Pengujian CTS

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

Berikut adalah daftar pengujian Audio Manager yang tersedia:

  • AudioManagerTest#testGetDevices

    Memverifikasi kemampuan presisi perangkat audio. Hal ini juga memverifikasi bahwa profil audio yang ditampilkan dalam struktur AudioDeviceInfo mempertahankan konten dari format array lama yang diratakan, tetapi dalam format AudioProfile baru.

  • AudioManagerTest#testPreferredDevicesForStrategy dan AudioManagerTest#testPreferredDeviceForCapturePreset

    Pastikan pengujian API terkait preset strategi dan pengambilan gambar untuk perangkat pilihan berhasil diselesaikan.

Pengujian GTS

Pengujian GTS berada di com.google.android.gts.audioservice.AudioServiceHostTest.

Untuk memvalidasi apakah API untuk perangkat pilihan untuk strategi dan preset pengambilan berfungsi dengan benar, jalankan pengujian AudioServiceHostTest#testPreferredDeviceRouting dan AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset.