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 yang memiliki 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 lama, penerapan framework audio memiliki dukungan terbatas untuk beberapa perangkat audio berjenis 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.

Dimulai dengan Android 12, batasan ini dihilangkan untuk memungkinkan kasus penggunaan baru seperti penyiaran audio, multicasting ke sekelompok headphone audio BLE, atau memilih beberapa kartu suara USB secara bersamaan. Perutean ke beberapa perangkat USB secara bersamaan tidak didukung.

Dimulai dengan Android 14, framework USB mendukung perutean ke beberapa perangkat USB asalkan perangkat USB tersebut memiliki jenis perangkat audio yang berbeda dan, terdapat 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 diterapkan oleh vendor sebagai bagian dari audio HAL, melaporkan kemampuan perangkat.

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

Tangani beberapa perangkat pilihan untuk sebuah strategi

Manajer Kebijakan Audio menawarkan API sistem untuk mendukung streaming audio dengan lebih baik 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 mendeskripsikan perangkat yang paling mungkin dipilih untuk pemutaran media. Saat perangkat yang dapat dilepas tersambung, 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 ketika aliran keluaran dibuka dalam konteks ini.

Pemilihan perangkat media aktif dapat berubah tergantung pada perangkat sebenarnya yang terhubung atau terputus. Manajer 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 terakhir yang tersambung akan dipilih.
  3. Jika tidak ada perangkat lepasan yang tersambung, aturan kebijakan audio default untuk memilih perangkat keluaran diterapkan untuk memilih perangkat aktif.

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

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

Untuk menerapkan pilihan perangkat baru, Manajer Kebijakan Audio menutup dan membuka kembali aliran keluaran saat sambungan perangkat jika aliran keluaran menganggur, atau menundanya ketika aliran keluaran ditempatkan ke dalam keadaan siaga.

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

  • setPreferredDeviceForStrategy

    Menetapkan perangkat pilihan untuk perutean audio untuk strategi tertentu. Perhatikan bahwa perangkat mungkin tidak tersedia pada saat perangkat pilihan disetel, namun digunakan setelah tersedia.

  • removePreferredDeviceForStrategy

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

  • getPreferredDeviceForStrategy

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

  • setPreferredDevicesForStrategy

    Menetapkan perangkat pilihan untuk strategi tertentu.

  • getPreferredDevicesForStrategy

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

  • OnPreferredDevicesForStrategyChangedListener

    Mendefinisikan antarmuka untuk pemberitahuan perubahan pada perangkat audio pilihan yang ditetapkan untuk strategi audio tertentu.

  • addOnPreferredDevicesForStrategyChangedListener

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

  • removeOnPreferredDevicesForStrategyChangedListener

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

Laporkan kemampuan perangkat

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 masker 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;
};

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

Metode Audio HAL

Audio Policy Manager menggunakan metode berikut untuk menanyakan kemampuan perangkat:

  • getParameters: Metode umum untuk mengambil nilai parameter spesifik vendor seperti format audio yang didukung dan laju 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, API lama versi 3.2 menambahkan struktur baru yang disebut audio_port_v7 . Lihat kode sumber untuk lebih jelasnya.

Karena penambahan audio_port_v7 , API lama versi 3.2 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 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 ketika versi API lama di bawah 3.2 dan versi HIDL HAL adalah 7 atau lebih tinggi. Dalam hal ini, semua sample rate dan channel mask yang dilaporkan dari get_audio_port diasumsikan didukung untuk semua format yang dikembalikan, sehingga 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 dibahas di bagian sebelumnya. Lihat metode ini untuk mengetahui beberapa contoh bagaimana API ini diterapkan dan digunakan.

Contoh penggunaan API setPreferredDevicesForStrategy , getPreferredDevicesForStrategy , removePreferredDeviceForStrategy dan OnPreferredDevicesForStrategyChangedListener terdapat pada metode PreferredDeviceRoutingTest yang terletak di GTS.

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

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

Validasi

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

tes CTS

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

Berikut ini adalah daftar tes Audio Manager yang tersedia:

  • AudioManagerTest#testGetDevices

    Memverifikasi kemampuan yang tepat dari perangkat audio. Hal ini juga memverifikasi bahwa profil audio yang dikembalikan dalam struktur AudioDeviceInfo mempertahankan konten dari format array yang lebih lama dan diratakan, namun berada dalam format AudioProfile baru.

  • AudioManagerTest#testPreferredDevicesForStrategy dan AudioManagerTest#testPreferredDeviceForCapturePreset

    Verifikasi bahwa perangkat pilihan untuk pengujian API terkait strategi dan pengambilan preset berhasil diselesaikan.

tes GTS

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

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