Perutean Audio

Di Android 10, car_audio_configuration.xml menggantikan car_volumes_groups.xml dan IAudioControl.getBusForContext . Di file konfigurasi baru, daftar zona ditentukan. Setiap zona memiliki satu atau lebih grup volume dengan perangkat terkaitnya, dan setiap perangkat memiliki konteks yang harus dirutekan dalam zona tersebut. Semua konteks harus terwakili dalam setiap zona.

Mengonfigurasi perutean audio

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

Mengaktifkan perutean AAOS

Untuk menggunakan perutean berbasis AAOS, Anda harus menyetel tanda audioUseDynamicRouting ke true :

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

Jika false , perutean dan sebagian besar CarAudioService akan dinonaktifkan dan OS akan kembali ke perilaku default AudioService .

Zona primer

Secara default, semua audio akan dialihkan ke zona utama. Hanya boleh ada satu zona utama, yang ditunjukkan dalam konfigurasi dengan atribut isPrimary="true" .

Konfigurasi sampel

Misalnya, kendaraan dapat memiliki dua zona — zona utama dan sistem hiburan di kursi belakang. Dengan itu, 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 pasca-pemrosesan dan pencampuran yang berbeda pada setiap keluaran perangkat menggunakan perangkat keras kendaraan. Perangkat telah disusun menjadi empat kelompok volume: media, navigasi, panggilan, dan alarm. Jika sistem dikonfigurasikan untuk useFixedVolume , maka level volume untuk setiap grup akan diteruskan ke HAL untuk diterapkan pada output perangkat ini.

Untuk zona sekunder, keluaran yang diharapkan adalah melalui satu perangkat keluaran. Dalam contoh ini, semua penggunaan dialihkan ke satu perangkat dan grup volume untuk mempermudah.

Konfigurasi audio zona penghuni

Di Android 11 car_audio_configuration.xml diperluas lebih lanjut untuk memperkenalkan dua kolom baru, audioZoneId dan occupantZoneId . Yang pertama, audioZoneId dapat digunakan untuk mengontrol manajemen zona dengan lebih baik. Di sisi lain, occupantZoneId dapat digunakan untuk mengonfigurasi perutean berbasis ID pengguna.

Untuk menggunakan kolom baru ini, diperlukan V2 dari car_audio_configuration.xml . Meninjau kembali konfigurasi audio di atas tetapi memanfaatkan bidang baru untuk pemetaan id zona penghuni dan id zona audio, konfigurasi baru tanpa definisi grup volume 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 mendefinisikan pemetaan untuk zona utama ke zona penghuni 0, dan audioZoneId 1 ke occupantZoneId 1. Secara umum, pemetaan apa pun antara zona penghuni dan zona audio dapat dikonfigurasikan tetapi pemetaannya harus satu-ke-satu. Berikut adalah aturan yang mendefinisikan dua bidang baru:

  • audioZoneId untuk zona utama selalu nol
  • nomor audioZoneId dan occupantZoneId tidak dapat diulang
  • audioZoneId dan occupantZoneId hanya dapat memiliki pemetaan satu lawan satu

Perutean melalui UID aplikasi

Serangkaian API tersembunyi diperkenalkan ke CarAudioManager pada tahun 10 untuk memungkinkan aplikasi melakukan kueri dan mengatur zona dan fokus audio.

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. Oleh karena itu, ID zona audio dan UID aplikasi juga diperlukan. Dengan informasi tersebut, perutean audio dapat disetel menggunakan CarAudioManager#setZoneIdForUid API.

Mengubah zona untuk suatu aplikasi

Secara default, semua audio dirutekan ke zona utama. Untuk memperbarui aplikasi yang akan dirutekan ke zona berbeda, 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");
}

N Catatan: Streaming dan fokus tidak dapat berpindah zona secara dinamis. Oleh karena itu, pemutaran harus dihentikan dan fokus diminta kembali untuk mengubah zona.

Perutean dengan ID Pengguna

Meskipun perutean berbasis UID aplikasi memungkinkan kontrol yang baik atas perutean audio setiap aplikasi, perutean audio untuk setiap aplikasi juga harus ditentukan sebelum aplikasi benar-benar meminta fokus audio dan memutar audio. Untuk mengurangi masalah ini dan lebih lanjut memfasilitasi aplikasi pihak ketiga untuk memutar audio tanpa modifikasi, CarAudioService menggunakan zona penumpang mobil dan pemetaan zona audio untuk menentukan perutean berbasis id pengguna. Dengan cara ini, ketika pengguna masuk ke zona penghuni, layanan audio mobil akan diberitahu. Dengan sinyal ini, manajemen fokus dan perutean audio dikonfigurasikan secara otomatis untuk semua zona audio.

Aplikasi perutean berbasis UID tetap dapat digunakan tetapi harus dilakukan secara independen dari perutean user id. Artinya, jika pemetaan zona penghuni ke zona audio mobil ditentukan, maka perutean berbasis UID dinonaktifkan dan upaya memanggil CarAudioManager#setZoneidForUid akan menimbulkan kesalahan.

Meskipun perutean audio dan manajemen fokus telah disederhanakan dengan manajemen zona penghuni, pengguna tetap harus ditetapkan ke zona penghuni. Hal ini dapat dilakukan dengan menggunakan CarOccupantZoneManager#assignProfileUserToOccupantZone . API ini memerlukan izin untuk mengelola pengguna. Harapan saat ini adalah bagi OEM untuk mengelola penetapan zona pengguna ke penghuni melalui semacam UI sistem. Setelah peluncuran aplikasi selesai, perutean audio, manajemen fokus semuanya akan dikonfigurasi secara otomatis untuk pengguna.

Perutean dengan setPreferredDevice

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

API dapat digunakan untuk menanyakan perangkat keluaran untuk zona tertentu dan penggunaan atribut audio. Dengan cara ini aplikasi pihak pertama dapat merutekan audio ke zona berbeda dengan memanfaatkan setPreferredDevice API milik pemutar. API getOutputDeviceForUsage memerlukan PERMISSION_CAR_CONTROL_AUDIO_SETTINGS dan merupakan API sistem. Di bawah ini adalah contoh menemukan perangkat media untuk zona tertentu dan merutekannya ke perangkat tersebut menggunakan setPreferredDevice API.

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