HAL kontrol audio diperkenalkan di Android 9 untuk mendukung kasus penggunaan audio yang relevan dengan otomotif. Mulai Android 14, HAL kontrol Audio mendukung:
- Pudar dan seimbangkan
- Permintaan fokus audio HAL
- Membisukan dan meredam suara perangkat
- Perubahan perolehan perangkat audio
- Perubahan konfigurasi port audio
Gambar 1 menunjukkan ringkasan tingkat tinggi arsitektur layanan audio mobil, yang layanan audio mobilnya berkomunikasi dengan HAL kontrol audio.
Gambar 1. Mengonfigurasi audio multi-zona.
Audio memudar dan keseimbangan
HIDL audio control HAL versi 1 diperkenalkan di Android 9 untuk mendukung fade dan keseimbangan audio dalam kasus penggunaan otomotif. Terpisah dari efek audio generik yang sudah disediakan di Android, mekanisme ini memungkinkan aplikasi sistem menyetel keseimbangan dan fade audio melalui CarAudioManager
API:
class CarAudioManager {
/**
* Adjust the relative volume in the front vs back of the vehicle cabin.
*
* @param value in the range -1.0 to 1.0 for fully toward the back through
* fully toward the front. 0.0 means evenly balanced.
*/
@SystemApi
@RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
public void setFadeTowardFront(float value);
/**
* Adjust the relative volume on the left vs right side of the vehicle cabin.
*
* @param value in the range -1.0 to 1.0 for fully toward the left through
* fully toward the right. 0.0 means evenly balanced.
*/
@SystemApi
@RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
public void setBalanceTowardRight(float value);
}
Setelah API ini dipanggil, API HAL kontrol audio masing-masing dipanggil dari layanan audio mobil:
interface IAudioControl {
/**
* Control the right/left balance setting of the car speakers.
*/
oneway setBalanceTowardRight(float value);
/**
* Control the fore/aft fade setting of the car speakers.
*/
oneway setFadeTowardFront(float value);
}
API ini tersedia di semua versi HAL kontrol audio, termasuk antarmuka HAL AIDL baru.
Permintaan fokus audio dari HAL
AAOS, seperti Android, mengandalkan partisipasi aktif aplikasi pada fokus audio untuk mengelola pemutaran audio di mobil. Informasi fokus digunakan untuk mengelola aliran mana yang akan dikontrol untuk volume dan peredaman. Oleh karena itu, untuk memperluas fokus audio dan memberikan integrasi suara khusus mobil yang lebih baik ke dalam pengalaman Android, atribut audio berikut diperkenalkan di Android 11:
EMERGENCY
SAFETY
VEHICLE_STATUS
ANNOUNCEMENT
Selain perubahan ini, mekanisme telah ditambahkan untuk suara yang berasal dari luar Android untuk berpartisipasi dalam permintaan fokus audio. Oleh karena itu, HIDL audio HAL versi 2 diperkenalkan untuk mengizinkan permintaan fokus yang berasal dari luar Android:
interface IAudioControl {
/**
* Registers focus listener to be used by HAL for requesting and
* abandoning audio focus.
* @param listener the listener interface
* @return closeHandle A handle to unregister observer.
*/
registerFocusListener(IFocusListener listener)
generates (ICloseHandle closeHandle);
/**
* Notifies HAL of changes in audio focus status for focuses requested
* or abandoned by the HAL.
*
* @param usage The audio usage associated with the focus change
* @param zoneId The identifier for the audio zone that the HAL is
* playing the stream in
* @param focusChange the AudioFocusChange that has occurred
*/
oneway onAudioFocusChange(bitfield<AudioUsage> usage, int32_t zoneId,
bitfield<AudioFocusChange> focusChange);
}
Dengan IFocusListener
ditentukan sebagai:
interface IFocusListener {
/**
* Called whenever HAL is requesting focus as it is starting to play
* audio of a given usage in a specified zone.
*
* @param usage The audio usage associated with the focus request
* {@code AttributeUsage}
* @param zoneId The identifier for the audio zone where the HAL is
* requesting focus
* @param focusGain The AudioFocusChange associated with this request.
*/
oneway requestAudioFocus(bitfield<AudioUsage> usage,
int32_t zoneId, bitfield<AudioFocusChange> focusGain);
/**
* Called whenever HAL is abandoning focus as it is finished playing audio
* of a given usage in a specific zone.
*
* @param usage The audio usage for which the HAL is abandoning focus
* {@code AttributeUsage}
* @param zoneId The identifier for the audio zone that the HAL
* abandoning focus
*/
oneway abandonAudioFocus(bitfield<AudioUsage> usage, int32_t zoneId);
}
API di atas dapat digunakan untuk meminta dan melepaskan fokus audio dari HAL. Sebagai respons, layanan audio mobil mempertimbangkan permintaan fokus audio dan meneruskan hasilnya secara asinkron ke metode IAudioControl#onAudioFocusChange
.
API ini juga dapat digunakan untuk memantau perubahan untuk permintaan fokus audio yang berasal dari HAL kontrol audio. Secara umum, setiap permintaan fokus audio yang sedang berlangsung dari HAL dianggap aktif, yang berbeda dengan permintaan fokus audio dari Android, yang hanya menganggap pemutaran trek audio aktif yang sesuai sebagai aktif.
Memigrasikan HIDL ke HAL kontrol audio AIDL
Dengan munculnya AIDL dan migrasi yang diperlukan di Android 12 (untuk mempelajari lebih lanjut, lihat AIDL untuk HAL), HAL kontrol audio dimigrasikan ke AIDL. Untuk API kontrol audio HIDL versi 2 yang ada, migrasi memerlukan update kecil pada metode yang ada:
interface IAudioControl {
/**
* Notifies HAL of changes in audio focus status for focuses requested
* or abandoned by the HAL.
*
* @param usage The audio usage associated with the focus change
* {@code AttributeUsage}. See {@code audioUsage} in
* audio_policy_configuration.xsd for the list of allowed values.
* @param zoneId The identifier for the audio zone that the HAL is
* playing the stream in
* @param focusChange the AudioFocusChange that has occurred.
*/
oneway void onAudioFocusChange(in String usage, in int zoneId,
in AudioFocusChange focusChange);
/**
* Registers focus listener to be used by HAL for requesting and
* abandoning audio focus.
* @param listener the listener interface.
*/
oneway void registerFocusListener(in IFocusListener listener);
/**
* Control the right/left balance setting of the car speakers.
*/
oneway void setBalanceTowardRight(in float value);
/**
* Control the fore/aft fade setting of the car speakers.
*/
oneway void setFadeTowardFront(in float value);
}
Dan IFocusListener
yang sesuai:
interface IFocusListener {
/**
* Called whenever HAL is abandoning focus as it is finished playing audio
* of a given usage in a specific zone.
*
* @param usage The audio usage for which the HAL is abandoning focus
* {@code AttributeUsage}. See {@code audioUsage} in
* audio_policy_configuration.xsd for the list of allowed values.
* @param zoneId The identifier for the audio zone that the HAL
* abandoning focus
*/
oneway void abandonAudioFocus(in String usage, in int zoneId);
/**
* Called whenever HAL is requesting focus as it is starting to play audio
* of a given usage in a specified zone.
*
* @param usage The audio usage associated with the focus request
* {@code AttributeUsage}. See {@code audioUsage} in
* audio_policy_configuration.xsd for the list of allowed values.
* @param zoneId The identifier for the audio zone where the HAL is
* requesting focus
* @param focusGain The AudioFocusChange associated with this request.
*/
oneway void requestAudioFocus(in String usage, in int zoneId,
in AudioFocusChange focusGain);
}
Membisukan grup volume
Android 12 memperkenalkan pembisuan grup volume untuk memungkinkan kontrol pembisuan yang lebih komprehensif selama interaksi audio pengguna. Hal ini memungkinkan HAL kontrol audio menerima peristiwa membisukan yang dicegat oleh layanan audio mobil.
Untuk mengaktifkan fitur ini, OEM harus menyetel konfigurasi audioUseCarVolumeGroupMuting
ke true
di config.xml
layanan mobil:
<!-- Configuration to enable muting of individual volume groups.
If this is set to false, muting of individual volume groups is disabled,
instead muting will toggle master mute. If this is set to true, car volume
group muting is enabled and each individual volume group can be muted separately. -->
<bool name="audioUseCarVolumeGroupMuting">true</bool>
Sebelum Android 13, konfigurasi harus diganti
dengan overlay resource runtime untuk
packages/services/Car/service/res/values/config.xml
(untuk mempelajari lebih lanjut, lihat
Menyesuaikan build dengan overlay
resource). Mulai Android 13, Anda dapat menggunakan overlay resource runtime untuk mengubah nilai konfigurasi. Untuk mempelajari lebih lanjut, lihat Mengubah nilai resource aplikasi saat runtime.
Aplikasi sistem dapat menentukan apakah fitur diaktifkan dengan menggunakan
CarAudioManager#isAudioFeatureEnabled
API. Parameter yang diteruskan harus berupa
konstanta CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING
. Metode ini menampilkan
true
jika fitur diaktifkan di perangkat, atau false
jika tidak.
Selain mengaktifkan fitur audioUseCarVolumeGroupMuting
, HAL kontrol audio AIDL harus menerapkan mekanisme pembisuan grup volume:
interface IAudioControl {
/**
* Notifies HAL of changes in output devices that the HAL should apply
* muting to.
*
* This will be called in response to changes in audio mute state for each
* volume group and will include a {@link MutingInfo} object per audio
* zone that experienced a mute state event.
*
* @param mutingInfos an array of {@link MutingInfo} objects for the audio
* zones where audio mute state has changed.
*/
oneway void onDevicesToMuteChange(in MutingInfo[] mutingInfos);
}
Jika info pembisuan berisi informasi pembisuan yang relevan untuk sistem audio:
parcelable MutingInfo {
/**
* ID of the associated audio zone
*/
int zoneId;
/**
* List of addresses for audio output devices that should be muted.
*/
String[] deviceAddressesToMute;
/**
* List of addresses for audio output devices that were previously be
* muted and should now be unmuted.
*/
String[] deviceAddressesToUnmute;
}
AAOS memiliki dua mekanisme berbeda untuk membisukan audio, berdasarkan:
Peristiwa utama menggunakan audio KEYCODE_VOLUME_MUTE.
Panggilan langsung ke layanan audio mobil menggunakan API mute pengelola audio mobil,
CarAudioManager#setVolumeGroupMute
.
Jika diaktifkan, kedua mekanisme akan memicu pembisuan panggilan ke HAL kontrol audio.
Pengecilan volume audio mobil
Android 12 memperkenalkan peredaman audio mobil untuk mengoptimalkan kontrol pemutaran serentak aliran audio. Hal ini memungkinkan OEM menerapkan perilaku peredaman mereka sendiri berdasarkan konfigurasi audio fisik mobil dan status pemutaran saat ini, sebagaimana ditentukan oleh layanan audio mobil.
Mekanisme pengecilan volume didasarkan pada perubahan stack fokus audio. Setiap kali
perubahan fokus terjadi (baik permintaan fokus atau pelepasan fokus), HAL kontrol
audio akan diberi tahu. Serupa dengan dukungan membisukan grup volume mobil, peredaman audio mobil dapat diaktifkan dengan tanda konfigurasi audioUseHalDuckingSignals
:
<!-- Configuration to enable IAudioControl#onDevicesToDuckChange API to
inform HAL when to duck. If this is set to true, the API will receive signals
indicating which output devices to duck as well as what usages are currently
holding focus. If set to false, the API will not be called. -->
<bool name="audioUseHalDuckingSignals">true</bool>
Untuk mengaktifkan fitur ini, HAL kontrol audio AIDL harus menerapkan logika yang relevan dengan sinyal yang diterima dari layanan audio mobil:
interface IAudioControl {
/**
* Notifies HAL of changes in output devices that the HAL should apply
* ducking to.
*
* This will be called in response to changes in audio focus, and will
* include a {@link DuckingInfo} object per audio zone that experienced
* a change in audo focus.
*
* @param duckingInfos an array of {@link DuckingInfo} objects for the
* audio zones where audio focus has changed.
*/
oneway void onDevicesToDuckChange(in DuckingInfo[] duckingInfos);
}
Informasi sistem audio yang relevan terdapat dalam informasi peredaman audio:
parcelable DuckingInfo {
/**
* ID of the associated audio zone
*/
int zoneId;
/**
* List of addresses for audio output devices that should be ducked.
*/
String[] deviceAddressesToDuck;
/**
* List of addresses for audio output devices that were previously be
* ducked and should now be unducked.
*/
String[] deviceAddressesToUnduck;
/**
* List of usages currently holding focus for this audio zone.
*/
String[] usagesHoldingFocus;
}
Selain informasi konfigurasi audio mobil yang terdapat di alamat perangkat untuk (tidak) meredam, informasi peredaman juga berisi informasi tentang penggunaan atribut audio mana yang mempertahankan fokus. Tujuan data ini adalah untuk memberi tahu sistem audio penggunaan atribut audio mana yang aktif.
Hal ini diperlukan karena, dalam konfigurasi audio mobil, beberapa atribut audio dapat ditetapkan ke satu perangkat dan, tanpa informasi tambahan, tidak jelas penggunaan mana yang aktif.
HAL kontrol audio AIDL 2.0
Untuk memperbarui API dan memfasilitasi fungsi baru, HAL kontrol audio AIDL telah diupdate ke versi 2.0 di Android 13:
- Fokus audio dengan
PlaybackTrackMetadata
- Panggilan balik perolehan audio
Metadata pemutaran ditentukan di android.hardware.audio.common
sebagai berikut:
parcelable PlaybackTrackMetadata {
AudioUsage usage = INVALID;
AudioContentType contentType = UNKNOWN;
float gain;
AudioChannelLayout channelMask;
AudioDevice sourceDevice;
String[] tags;
}
Semua fungsi lain dari kontrol audio AIDL versi 1.0 tetap ada dan dapat digunakan. Pengecualian berlaku untuk metode perubahan fokus audio, seperti yang dijelaskan dalam Metode perubahan fokus audio.
Fokus kontrol audio dengan metadata trek pemutaran
Untuk mengekspos lebih banyak informasi ke sistem audio di bawah HAL, update kini mengekspos
PlaybackTrackMetadata
. Secara khusus, HAL kontrol audio diperluas dengan metode baru:
interface IAudioControl {
/**
* Notifies HAL of changes in audio focus status for focuses requested
* or abandoned by the HAL.
*
* The HAL is not required to wait for a callback of AUDIOFOCUS_GAIN
* before playing audio, nor is it required to stop playing audio in the
* event of a AUDIOFOCUS_LOSS callback is received.
*
* @param playbackMetaData The output stream metadata associated with
* the focus request
* @param zoneId The identifier for the audio zone that the HAL is
* playing the stream in
* @param focusChange the AudioFocusChange that has occurred.
*/
oneway void onAudioFocusChangeWithMetaData(
in PlaybackTrackMetadata playbackMetaData, in int zoneId,
in AudioFocusChange focusChange);
}
Perubahan serupa dan sesuai dilakukan pada IFocusListener
:
/**
* Called to indicate that the audio output stream associated with
* {@link android.hardware.audio.common.PlaybackTrackMetadata} is
* abandoning focus as playback has stopped.
*
* @param playbackMetaData The output stream metadata associated with
* the focus request
* @param zoneId The identifier for the audio zone that the HAL
* abandoning focus
*/
oneway void abandonAudioFocusWithMetaData(
in PlaybackTrackMetadata playbackMetaData, in int zoneId);
/**
* Called to indicate that the audio output stream associated with
* {@link android.hardware.audio.common.PlaybackTrackMetadata} has taken
* the focus as playback is starting for the corresponding stream.
*
* @param playbackMetaData The output stream metadata associated with
* the focus request
* @param zoneId The identifier for the audio zone that the HAL
* abandoning focus
* @param focusGain The focus type requested.
*/
oneway void requestAudioFocusWithMetaData(
in PlaybackTrackMetadata playbackMetaData, in int zoneId,
in AudioFocusChange focusGain);
}
Metode perubahan fokus audio
Operasi fokus di atas dilakukan dengan cara yang sama seperti yang dijelaskan dalam Permintaan fokus audio dari HAL. Hanya metadata trek pemutaran yang memiliki lebih banyak informasi bersama dengan penggunaan atribut audio. Secara umum, kecuali jika informasi tambahan yang diberikan oleh metadata trek pemutaran diperlukan, HAL kontrol Android yang diperbarui dapat terus menggunakan metode sebelumnya.
Jika developer HAL memutuskan untuk tidak mendukung IAudioControl#onAudioFocusChangeWithMetaData
, metode ini harus menampilkan hasil dengan error UNKNOWN_TRANSACTION
seperti yang dijelaskan dalam Menggunakan Metode Antarmuka Berversi.
Layanan audio terlebih dahulu memanggil onAudioFocusChangeWithMetaData
dan
kemudian mencoba lagi dengan metode onAudioFocusChange
jika terjadi kegagalan UNKNOWN_TRANSACTION
.
Perendahan volume audio mobil dengan metadata trek pemutaran
HAL kontrol audio AIDL versi 2.0 menambahkan metadata trek pemutaran ke info peredaman audio:
parcelable DuckingInfo {
/**
* ID of the associated audio zone
*/
int zoneId;
/**
* List of addresses for audio output devices that should be ducked.
*/
String[] deviceAddressesToDuck;
/**
* List of addresses for audio output devices that were previously be
* ducked and should now be unducked.
*/
String[] deviceAddressesToUnduck;
/**
* List of usages currently holding focus for this audio zone.
*/
String[] usagesHoldingFocus;
/**
* List of output stream metadata associated with the current focus
* holder for this audio zone
*/
@nullable PlaybackTrackMetadata[] playbackMetaDataHoldingFocus;
}
usagesHoldingFocus
tidak digunakan lagi. Developer kini harus menggunakan
playbackMetaDataHoldingFocus
untuk menentukan penggunaan atribut audio dan informasi
audio lainnya. Namun, parameter usagesHoldingFocus
masih berisi
informasi yang diperlukan hingga opsi ini dihapus secara resmi.
Panggilan balik perolehan audio
Untuk membuat perubahan audio di bawah HAL lebih terlihat oleh AAOS di Android 13, kami menambahkan mekanisme yang dapat Anda gunakan untuk mengomunikasikan perubahan perolehan audio dari sistem audio mobil ke layanan audio mobil. Mekanisme ini mengekspos perubahan indeks volume gain audio dengan alasan masing-masing mengapa gain diubah:
- Batasan yang diblokir atau disenyapkan
- Batasan pembatasan
- Batasan atenuasi
Perubahan ini mengekspos batasan ini dari bawah HAL ke layanan audio mobil dan, akhirnya, ke aplikasi UI sistem untuk memberi tahu pengguna. Bagian terakhir, eksposur ke kemungkinan UI sistem, diperluas lebih lanjut di Android 14 untuk memungkinkan aplikasi UI sistem mendapatkan informasi ini dengan lebih mudah melalui mekanisme callback informasi grup volume.
API HAL kontrol audio mendaftarkan callback perolehan sebagai berikut:
interface IAudioControl {
/**
* Registers callback to be used by HAL for reporting unexpected gain(s)
* changed and the reason(s) why.
*
* @param callback The {@link IAudioGainCallback}.
*/
oneway void registerGainCallback(in IAudioGainCallback callback);
}
IAudioGainCallback
didefinisikan sebagai berikut:
interface IAudioGainCallback {
/**
* Used to indicate that one or more audio device port gains have changed,
* i.e. initiated by HAL, not by CarAudioService.
* This is the counter part of the
* {@link onDevicesToDuckChange}, {@link onDevicesToMuteChange} and,
* {@link setAudioDeviceGainsChanged} APIs.
*
* @param reasons List of reasons that triggered the given gains changed.
* @param gains List of gains affected by the change.
*/
void onAudioDeviceGainsChanged(in Reasons[] reasons,
in AudioGainConfigInfo[] gains);
}
Seperti yang diuraikan dalam dokumentasi API, callback gain didaftarkan oleh layanan audio mobil ke HAL kontrol audio. Saat API dipanggil dari HAL kontrol audio, layanan audio mobil merespons dengan tindakan yang sesuai (seperti memblokir, membatasi, atau mengurangi indeks gain) .
HAL menentukan kapan API dipanggil, terutama untuk melaporkan perubahan pada status indeks perolehan. Khusus untuk persyaratan peraturan, sistem audio mobil harus mengambil tindakan yang diperlukan dan menggunakan callback untuk melaporkan informasi ke layanan audio mobil agar dapat digunakan oleh pengguna. Misalnya, untuk menampilkan UI kepada pengguna.
HAL kontrol audio AIDL 3.0
Versi HAL kontrol audio AIDL Android 14 diupdate ke versi 3.0 untuk mengupdate API guna menyediakan fungsi indeks perolehan audio yang lebih andal. Audio Control HAL API memungkinkan layanan audio untuk
menetapkan dan membatalkan IModuleChangeCallback
:
interface IAudioControl {
/**
* Sets callback with HAL for notifying changes to hardware module
* (that is: {@link android.hardware.audio.core.IModule}) configurations.
*
* @param callback The {@link IModuleChangeCallback} interface to use
* use when new updates are available for
*/
void setModuleChangeCallback(in IModuleChangeCallback callback);
/**
* Clears module change callback
*/
void clearModuleChangeCallback();
}
setModuleChangeCallback
didaftarkan oleh layanan audio mobil saat
layanan dimulai atau saat memulihkan dari error. Misalnya, notifikasi kematian binder HAL kontrol audio yang diterima oleh layanan audio mobil. Implementasi HAL kontrol audio harus menggantikan callback perubahan modul yang ada saat API dipanggil.
Untuk API clearModuleChangeCallback
, implementasi harus menghapus
callback yang ada atau tidak melakukan apa pun jika tidak ada callback. Praktik yang baik untuk
penerapan kontrol audio adalah mendaftarkan pengamat penghentian untuk callback
dan kemudian menghapus callback jika penghentian binder dipicu.
IModuleChangeCallback
didefinisikan sebagai berikut:
oneway interface IModuleChangeCallback {
/**
* Used to indicate that one or more {@link AudioPort} configs have
* changed. Implementations MUST return at least one AudioPort.
*
* @param audioPorts list of {@link AudioPort} that are updated
*/
void onAudioPortsChanged(in AudioPort[] audioPorts);
}
Saat callback perubahan modul didaftarkan oleh layanan audio mobil, callback tersebut siap menerima perubahan port audio melalui onAudioPortChanged
API. API
dapat digunakan untuk menginisialisasi perolehan volume untuk sistem audio segera setelah
callback didaftarkan. Untuk perubahan perolehan dinamis lainnya, API dapat dipanggil kapan saja. Perubahan yang sesuai diterapkan dan layanan audio mobil diperbarui sebagaimana mestinya.