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 grup volume dengan perangkat terkaitnya, dan setiap perangkat memiliki konteks yang harus dirutekan dalam zona tersebut. Ini diperlukan bahwa semua konteks diwakili dalam setiap zona.

Mengonfigurasi perutean audio

File kebijakan audio, yang biasanya berada di partisi vendor, mewakili konfigurasi perangkat keras audio papan. Semua perangkat yang dirujuk 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 utama

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

Sebagai contoh, sebuah kendaraan dapat memiliki dua zona — zona utama dan sistem hiburan 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 yang berbeda dan pencampuran pada setiap output perangkat menggunakan perangkat keras kendaraan. Perangkat telah diatur ke dalam empat kelompok volume: media, navigasi, panggilan, dan alarm. Jika sistem dikonfigurasi untuk useFixedVolume , maka tingkat volume untuk setiap grup akan diteruskan ke HAL untuk diterapkan ke output perangkat ini.

Untuk zona sekunder, keluaran yang diharapkan adalah melalui perangkat keluaran tunggal. Dalam contoh ini, semua penggunaan dirutekan ke satu perangkat dan grup volume agar semuanya tetap sederhana.

Konfigurasi audio zona penghuni

Di Android 11 car_audio_configuraton.xml diperluas lebih lanjut untuk memperkenalkan dua bidang 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 bidang baru ini, V2 dari car_audio_configuration.xml diperlukan. Meninjau kembali konfigurasi audio di atas tetapi menggunakan bidang baru untuk id zona penghuni dan pemetaan 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 menentukan pemetaan untuk zona utama ke zona penghuni 0, dan audioZoneId 1 ke occupantZoneId 1. Secara umum, pemetaan antara zona penghuni dan zona audio dapat dikonfigurasi tetapi pemetaan 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 aplikasi UID

Serangkaian API tersembunyi diperkenalkan ke CarAudioManager di 10 untuk memungkinkan aplikasi melakukan kueri dan menyetel 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. Dengan demikian, ID zona audio dan UID aplikasi juga diperlukan. Dengan informasi tersebut, perutean audio dapat diatur dengan menggunakan CarAudioManager#setZoneIdForUid API.

Mengubah zona untuk aplikasi

Secara default, semua rute audio ke zona utama. Untuk memperbarui aplikasi yang akan dirutekan ke zona yang 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: Aliran 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

Sementara 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 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 audio dan perutean dikonfigurasi secara otomatis untuk semua zona audio.

Aplikasi perutean berbasis UID masih dapat digunakan tetapi harus dilakukan secara independen dari perutean id pengguna. Ini berarti bahwa jika pemetaan zona penghuni ke zona audio mobil ditentukan, maka perutean berbasis UID dinonaktifkan dan mencoba memanggil CarAudioManager#setZoneidForUid akan menimbulkan kesalahan.

Sementara perutean audio dan manajemen fokus telah disederhanakan dengan manajemen zona penghuni, pengguna masih harus ditetapkan ke zona penghuni. 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 beberapa jenis UI sistem. Setelah peluncuran aplikasi, perutean audio, manajemen fokus selesai, semuanya akan dikonfigurasikan secara otomatis untuk pengguna.

Perutean dengan setPreferredDevice

Bersamaan dengan perubahan di atas, Android 11 juga memiliki API baru untuk mengkueri perangkat keluaran 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 yang berbeda dengan memanfaatkan setPreferredDevice API 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 merutekan ke perangkat tersebut menggunakan setPreferredDevice API.

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