Perutean Audio

Di Android 10, car_audio_configuration.xml menggantikan car_volumes_groups.xml dan IAudioControl.getBusForContext. Dalam file konfigurasi baru, daftar zona ditentukan. Setiap zona memiliki satu atau beberapa kelompok volume dengan perangkat yang terkait, dan setiap perangkat memiliki konteks yang harus dirutekan dalam zona tersebut. Semua konteks harus diwakili dalam setiap zona.

Mengonfigurasi pemilihan rute audio

File kebijakan audio, yang biasanya berada di partisi vendor, mewakili konfigurasi perangkat keras audio pada board. Semua perangkat yang dirujuk di car_audio_configuration.xml harus ditentukan dalam audio_policy_configuration.xml.

Mengaktifkan pemilihan rute AAOS

Untuk menggunakan perutean berbasis AAOS, Anda harus menyetel audioUseDynamicRouting flag untuk true:

<resources>
    <bool name="audioUseDynamicRouting">true</bool>
</resources>

Ketika false, pemilihan rute dan sebagian besar CarAudioService akan dinonaktifkan dan OS akan kembali ke perilaku default AudioService.

Zona utama

Secara default, semua audio akan dirutekan ke zona utama. Hanya ada menjadi satu zona utama, yang ditunjukkan dalam konfigurasi oleh atribut isPrimary="true".

Contoh konfigurasi

Sebagai contoh, kendaraan dapat memiliki dua zona — zona utama dan kursi belakang hiburan. Dengan demikian, kemungkinan car_audio_configuration.xml akan didefinisikan sebagai berikut:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

Di sini, zona utama telah memisahkan konteks ke perangkat yang berbeda. Hal ini memungkinkan HAL untuk menerapkan efek pascapemrosesan dan pencampuran yang berbeda pada tiap {i>output<i} perangkat menggunakan hardware kendaraan. Perangkat ini telah diatur ke dalam empat kelompok volume: media, navigasi, panggilan, dan alarm. Jika sistem dikonfigurasi untuk useFixedVolume, maka level volume untuk setiap grup akan diteruskan ke HAL untuk diterapkan pada {i>output<i} perangkat ini.

Untuk zona sekunder, output yang diharapkan adalah melalui satu perangkat output. Dalam contoh ini, semua penggunaan dialihkan ke satu perangkat dan grup volume untuk membuat semuanya sederhana.

Konfigurasi audio zona penumpang

Di Android 11, car_audio_configuration.xml diperluas lebih lanjut menjadi memperkenalkan dua kolom baru, audioZoneId dan occupantZoneId. Yang pertama, audioZoneId dapat digunakan untuk mengontrol pengelolaan zona dengan lebih baik. Di sisi lain, occupantZoneId dapat digunakan untuk mengonfigurasi berbasis ID pengguna {i>routing<i}.

Untuk menggunakan kolom baru ini, V2 dari car_audio_configuration.xml adalah tidak diperlukan. Meninjau kembali konfigurasi audio di atas tetapi memanfaatkan bidang baru untuk pemetaan ID zona penumpang dan ID zona audio, konfigurasi baru tanpa volume definisi grup dapat diatur sebagai:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

Konfigurasi di atas menentukan pemetaan untuk zona utama ke zona penghuni 0, dan audioZoneId 1 dengan occupantZoneId 1. Secara umum, pemetaan antara zona penumpang dan zona audio dapat dikonfigurasi, tetapi pemetaannya harus satu per satu. Berikut adalah aturan yang menentukan kedua kolom baru tersebut:

  • audioZoneId untuk zona utama selalu nol
  • Nomor audioZoneId dan occupantZoneId tidak dapat diulang
  • audioZoneId dan occupantZoneId hanya dapat memiliki pemetaan one-to-one

Memilih rute melalui UID aplikasi

Serangkaian API tersembunyi diperkenalkan ke CarAudioManager dalam 10 untuk memungkinkan aplikasi untuk mengkueri dan mengatur zona audio dan fokus.

int[] getAudioZoneIds();
int getZoneIdForUid(int uid);
boolean setZoneIdForUid(int zoneId, int uid);
boolean clearZoneIdForUid(int uid);

API di atas memungkinkan aplikasi pihak pertama mengelola perutean audio berdasarkan UID aplikasi. Dengan demikian, ID zona audio dan UID aplikasi juga dibutuhkan. Dengan informasi tersebut, {i>routing<i} audio dapat diatur dengan menggunakan API CarAudioManager#setZoneIdForUid.

Mengubah zona untuk aplikasi

Secara default, semua rute audio ke zona utama. Untuk memperbarui aplikasi menjadi dirutekan ke zona lain, gunakan CarAudioManager#setZoneIdForUid:

// Find zone to play
int zoneId = ...

// Find application's uid
Int uid = mContext.getPackageManager()
        .getApplicationInfo(mContext.getPackageName(), 0)
        .uid;

if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) {
    Log.d(TAG, "Zone successfully updated");
} else {
    Log.d(TAG, "Failed to change zone");
}

T Catatan: Streaming dan fokus tidak dapat beralih zona secara dinamis. Oleh karena itu, pemutaran harus dihentikan dan fokus diminta ulang untuk mengubah zona.

Memilih Rute dengan ID Pengguna

Meskipun perutean berbasis UID aplikasi memungkinkan kontrol yang baik atas setiap perutean audio, hal itu juga mengharuskan {i>routing<i} audio untuk setiap aplikasi ditentukan sebelumnya ke aplikasi yang benar-benar meminta fokus audio dan memutar audio. Untuk memitigasi hal ini dan lebih memfasilitasi aplikasi pihak ketiga untuk memutar audio tanpa modifikasi, CarAudioService menggunakan zona penumpang mobil dan pemetaan zona audio untuk menentukan {i>routing<i} berbasis ID pengguna. Dengan cara ini, saat pengguna masuk ke zona penumpang, layanan akan diberi tahu. Dengan sinyal ini, pengelolaan fokus audio dan perutean secara otomatis dikonfigurasi untuk semua zona audio.

Perutean berbasis UID aplikasi tetap dapat digunakan tetapi harus dilakukan secara independen dari pemilihan rute ID pengguna. Artinya, jika pemetaan zona penumpang ke zona audio mobil ditetapkan, maka perutean berbasis UID akan dinonaktifkan dan mencoba memanggil CarAudioManager#setZoneidForUid akan menampilkan error.

Meskipun perutean audio dan pengelolaan fokus telah disederhanakan dengan zona penumpang khusus, pengguna tetap harus ditetapkan ke zona penghuni. Hal ini dapat dilakukan dengan menggunakan CarOccupantZoneManager#assignProfileUserToOccupantZone. Ini API memerlukan izin untuk mengelola pengguna. Saat ini, yang diharapkan adalah OEM mengelola pengguna ke penetapan zona penduduk melalui beberapa jenis UI sistem. Setelah selesai peluncuran, perutean audio, pengelolaan fokus, semuanya akan dikonfigurasi secara otomatis untuk pengguna.

Merutekan dengan setPreferredDevice

Seiring dengan perubahan di atas, Android 11 juga memiliki API baru untuk mengkueri perangkat output yang dikaitkan dengan setiap zona, CarAudioManager#getOutputDeviceForUsage(int zoneId, int usage).

API ini dapat digunakan untuk membuat kueri perangkat output untuk zona dan atribut audio tertentu tingkat penggunaan. Dengan cara ini, aplikasi pihak pertama dapat merutekan audio ke zona berbeda dengan menggunakan setPreferredDevice API pemain. Tujuan getOutputDeviceForUsage API memerlukan PERMISSION_CAR_CONTROL_AUDIO_SETTINGS dan merupakan API sistem. Berikut adalah contoh pencarian perangkat media untuk zona tertentu dan pemilihan rute ke perangkat tersebut menggunakan setPreferredDevice API.

audioZoneId = ... ;
mediaDeviceInfo = mCarAudioManager
            .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA);
…
mPlayer.setPreferredDevice(mediaDeviceInfo);