Ses kontrolü HAL, otomotivle ilgili ses kullanım alanlarını desteklemek için Android 9'da kullanıma sunulmuştur. Android 14'ten itibaren Ses denetimi HAL'i şunları destekler:
- Karartma ve denge
- HAL ses odağı isteği
- Cihazın sesini kapatma ve azaltma
- Ses cihazı kazancı değişiklikleri
- Ses bağlantı noktası yapılandırma değişiklikleri
Şekil 1'de, araç ses hizmetinin ses denetimi HAL ile iletişim kurduğu araç ses hizmeti mimarisinin üst düzey bir görünümü gösterilmektedir.
Şekil 1. Çok bölgeli sesi yapılandırın.
Ses fade'i ve dengesi
HIDL ses denetimi HAL sürüm 1, otomotiv kullanım alanlarında ses fade'ini ve dengesini desteklemek için Android 9'da kullanıma sunulmuştur. Android'de halihazırda sağlanan genel ses efektlerinden ayrı olarak bu mekanizma, sistem uygulamalarının ses dengesini ayarlamasına ve CarAudioManager
API'leri aracılığıyla sesin yavaşça azalmasına olanak tanır:
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);
}
Bu API'ler çağrıldıktan sonra, araç ses hizmetinden ilgili ses denetimi HAL API'leri çağrılır:
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, yeni AIDL HAL arayüzü de dahil olmak üzere ses denetimi HAL'inin tüm sürümlerinde kullanılabilir.
HAL'den ses odağı isteği
Android'e benzer şekilde AAOS da arabalarda ses oynatmayı yönetmek için ses odaklı uygulamalardan etkin katılım bekler. Odak bilgileri, ses seviyesi ve ses azaltma için hangi akışların kontrol edileceğini yönetmek amacıyla kullanılır. Bu nedenle, ses odağını daha da genişletmek ve araca özgü seslerin Android deneyimine daha iyi entegre edilmesini sağlamak için Android 11'de aşağıdaki ses özellikleri kullanıma sunuldu:
EMERGENCY
SAFETY
VEHICLE_STATUS
ANNOUNCEMENT
Bu değişikliğe ek olarak, Android dışından gelen seslerin ses odak isteklerine katılması için bir mekanizma eklendi. Bu nedenle, Android dışından gelen odaklanma isteklerine izin vermek için HIDL ses denetimi HAL sürüm 2 kullanıma sunulmuştur:
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);
}
Burada IFocusListener
şu şekilde tanımlanır:
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);
}
Yukarıdaki API'ler sırasıyla HAL'den ses odağını istemek ve ses odağını bırakmak için kullanılabilir. Araba ses hizmeti, yanıt olarak ses odak isteğini dikkate alır ve sonuçları IAudioControl#onAudioFocusChange
yöntemine eşzamansız olarak iletir.
Bu API, ses kontrolü HAL'inden gelen ses odak isteğinde yapılan değişiklikleri izlemek için de kullanılabilir. Genel olarak, HAL'den gelen tüm ses odak istekleri etkin olarak kabul edilir. Bu, Android'den gelen ses odak isteklerinden farklıdır. Android'de yalnızca ilgili etkin ses parçası oynatımı etkin olarak kabul edilir.
HIDL'yi AIDL ses denetimi HAL'ine taşıma
AIDL'nin kullanıma sunulması ve Android 12'de gerekli taşıma işlemiyle (daha fazla bilgi için HAL'ler için AIDL başlıklı makaleyi inceleyin) ses denetimi HAL'i AIDL'ye taşındı. Mevcut HIDL ses kontrolü 2. sürüm API'leri için taşıma işlemi, mevcut yöntemlerde küçük güncellemeler yapılmasını gerektirdi:
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);
}
Ve karşılık gelen IFocusListener
:
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);
}
Ses grubunu kapatma
Android 12, kullanıcının sesli etkileşimleri sırasında daha kapsamlı bir sessize alma kontrolü sunmak için ses grubu sessize alma özelliğini kullanıma sundu. Bu, ses denetimi HAL'inin, araç ses hizmeti tarafından yakalanan sessize alma etkinliklerini almasına olanak tanır.
OEM'lerin bu özelliği etkinleştirmesi için config.xml
araç hizmetinde audioUseCarVolumeGroupMuting
yapılandırmasını true
olarak ayarlamaları gerekir:
<!-- 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>
Android 13'ten önce, yapılandırma için packages/services/Car/service/res/values/config.xml
'ün çalışma zamanında kaynak yer paylaşımıyla üzerine yazılması gerekiyordu (daha fazla bilgi için Derlemeyi kaynak yer paylaşımlarıyla özelleştirme başlıklı makaleyi inceleyin). Android 13'ten itibaren, yapılandırma değerini değiştirmek için çalışma zamanı kaynak yer paylaşımlarını kullanabilirsiniz. Daha fazla bilgi için Uygulama kaynaklarının değerini çalışma zamanında değiştirme başlıklı makaleyi inceleyin.
Sistem uygulamaları, CarAudioManager#isAudioFeatureEnabled
API'yi kullanarak özelliğin etkin olup olmadığını belirleyebilir. İletilen parametre CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING
sabiti olmalıdır. Yöntem, özellik cihazda etkinse true
, aksi takdirde false
değerini döndürür.
AIDL ses kontrolü HAL'i, audioUseCarVolumeGroupMuting
özelliğini etkinleştirmenin yanı sıra ses grubu sessize alma mekanizmasını uygulamalıdır:
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);
}
Sessize alma bilgileri, ses sistemiyle ilgili sessize alma bilgilerini içerir:
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'ta sessize alma işlemi için aşağıdakilere göre iki farklı mekanizma vardır:
KEYCODE_VOLUME_MUTE ses kodunu kullanan önemli etkinlikler.
Araç ses yöneticisi sessize alma API'sini (
CarAudioManager#setVolumeGroupMute
) kullanarak araç ses hizmetine doğrudan çağrılar.
Her iki mekanizma da etkinleştirildiğinde ses kontrol HAL'inde aramanın sessize alınmasını tetikler.
Araç ses sisteminin sesini kısma
Android 12, ses akışlarının eşzamanlı oynatılmasının kontrolünü optimize etmek için araç seslerini azaltma özelliğini kullanıma sundu. Bu sayede OEM'ler, araba ses hizmeti tarafından belirlenen arabanın fiziksel ses yapılandırmasına ve mevcut oynatma durumuna göre kendi ses azaltma davranışlarını uygulayabilir.
Ses kısma mekanizması, ses odak yığınındaki değişikliklere dayanır. Odak değişikliği olduğunda (odak isteği veya odak bırakma) ses kontrolü HAL'i bilgilendirilir. Araç ses grubu sessize alma desteğine benzer şekilde, araç ses seviyesi azaltma özelliği audioUseHalDuckingSignals
yapılandırma işaretiyle etkinleştirilebilir:
<!-- 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>
Özelliği etkinleştirmek için AIDL ses kontrol HAL'i, araba ses hizmetinden alınan sinyal ile ilgili mantığı uygulamalıdır:
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);
}
İlgili ses sistemi bilgileri, ses azaltma bilgilerinde yer alır:
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;
}
Ses azaltma/artırma işlemi için cihaz adreslerinde bulunan araç ses yapılandırma bilgilerinin yanı sıra ses azaltma bilgileri, hangi ses özelliği kullanımlarının odakta tutulduğuyla ilgili bilgileri de içerir. Bu verilerin amacı, ses sistemini hangi ses özelliklerinin etkin olduğunu bilgilendirmektir.
Araç ses yapılandırmasında tek bir cihaza birden fazla ses özelliği atanabileceği ve ek bilgiler olmadan hangi kullanımların etkin olduğu net olmadığı için bu gereklidir.
AIDL ses denetimi HAL 2.0
API'leri güncellemek ve yeni işlevleri kolaylaştırmak için Android 13'te AIDL ses denetimi HAL'i 2.0 sürümüne güncellendi:
PlaybackTrackMetadata
ile ses odağı- Ses kazançları geri araması
Oynatma meta verileri android.hardware.audio.common
'te aşağıdaki gibi tanımlanır:
parcelable PlaybackTrackMetadata {
AudioUsage usage = INVALID;
AudioContentType contentType = UNKNOWN;
float gain;
AudioChannelLayout channelMask;
AudioDevice sourceDevice;
String[] tags;
}
AIDL ses kontrolü 1.0 sürümünün diğer tüm işlevleri korundu ve kullanılabilir. Ses odak değiştirme yöntemi bölümünde açıklandığı üzere, ses odak değiştirme yöntemiyle ilgili bir istisna vardır.
Oynatma parçası meta verileriyle ses kontrol odağını belirleme
HAL'ın altındaki ses sistemine daha fazla bilgi göstermek için güncellemeler artık PlaybackTrackMetadata
değerini gösteriyor. Özellikle ses kontrolü HAL'i yeni bir yöntemle genişletildi:
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);
}
IFocusListener
için de benzer bir değişiklik yapılır:
/**
* 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);
}
Ses odağı değiştirme yöntemi
Yukarıdaki odaklama işlemleri, HAL'den gelen ses odak isteği bölümünde açıklananlarla aynı şekilde çalışır. Yalnızca oynatma parçası meta verilerinde, ses özelliklerinin kullanımlarıyla ilgili daha fazla bilgi bulunur. Genel olarak, oynatma parçası meta verileri tarafından sağlanan ek bilgilere ihtiyaç duyulmadığı sürece güncellenmiş android kontrol HAL'i önceki yöntemleri kullanmaya devam edebilir.
HAL geliştiricileri IAudioControl#onAudioFocusChangeWithMetaData
'ü desteklememeye karar verirse yöntem, Sürümlü Arayüz Yöntemlerini Kullanma bölümünde açıklandığı gibi UNKNOWN_TRANSACTION
hatasıyla sonuç döndürmelidir.
Ses hizmeti, önce onAudioFocusChangeWithMetaData
'ü çağırır ve ardından UNKNOWN_TRANSACTION
hatası oluşursa onAudioFocusChange
yöntemiyle yeniden dener.
Oynatma parçası meta verileriyle araç ses düzeyini azaltma
AIDL ses denetimi HAL'inin 2.0 sürümünde, ses azaltma bilgilerine oynatma parçası meta verileri eklendi:
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
desteği sonlandırıldı. Geliştiriciler artık ses özelliğinin kullanımını ve diğer ses bilgilerini belirlemek için playbackMetaDataHoldingFocus
öğesini kullanmalıdır. Bununla birlikte, bu seçenek resmi olarak kaldırılana kadar usagesHoldingFocus
parametresi gerekli bilgileri içermeye devam eder.
Ses kazancı geri çağırma işlevi
Android 13'te HAL'nin altındaki ses değişikliklerinin AAOS tarafından daha görünür hale getirilmesi için aracın ses sisteminden araç ses hizmetine ses kazanç değişikliklerini iletmek üzere kullanabileceğiniz bir mekanizma ekledik. Bu mekanizma, ses kazancı ses seviyesi dizini değişikliklerini ve kazancın değiştirilme nedenini gösterir:
- Engellenen veya sessize alınan kısıtlamalar
- Sınırlamalar ve kısıtlamalar
- Zayıflama kısıtlamaları
Bu değişiklikler, HAL'den araba ses hizmetine ve son olarak da kullanıcıyı bilgilendirmek için bir sistem kullanıcı arayüzü uygulamasına bu kısıtlamaları gösterir. Olası bir sistem kullanıcı arayüzüne maruz kalmayla ilgili ikinci kısım, Android 14'te daha da genişletilerek sistem kullanıcı arayüzü uygulamalarının bir ses grubu bilgileri geri çağırma mekanizması aracılığıyla bu bilgileri daha kolay almasına olanak tanındı.
Ses kontrolü HAL API'si, kazanç geri çağırma işlevini aşağıdaki gibi kaydeder:
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
aşağıdaki şekilde tanımlanır:
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);
}
API dokümanlarında belirtildiği gibi, kazanç geri çağırma işlevi, araç ses hizmeti tarafından ses kontrol HAL'ine kaydedilir. API, ses kontrolü HAL'den çağrıldığında araç ses hizmeti, karşılık gelen bir işlemle (ör. engelleme, sınırlama veya kazanç indeksini azaltma) yanıt verir.
HAL, API'nin ne zaman çağrılacağını belirler. Bu, temel olarak kazanç dizini durumundaki değişiklikleri bildirmek için yapılır. Düzenleme şartlarına göre, aracın ses sistemi gerekli işlemi yapmalı ve kullanıcının kullanımına izin vermek için geri aramayı kullanarak bilgileri araç ses hizmetine bildirmelidir. Örneğin, kullanıcıya bir kullanıcı arayüzü göstermek için.
AIDL ses denetimi HAL 3.0
Android 14 AIDL ses kontrolü HAL sürümü, API'leri daha güçlü ses kazancı dizini işlevi sağlayacak şekilde güncellemek için 3.0 sürümüne güncellendi. Ses denetimi HAL API'si, ses hizmetinin IModuleChangeCallback
ayarlarını yapıp kaldırmasına olanak tanır:
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
, hizmet başladığında veya bir hatadan kurtarıldığında araç ses sistemi hizmeti tarafından kaydedilir. Örneğin, araç ses hizmeti tarafından alınan bir ses kontrolü HAL bağlayıcısı sonlandırma bildirimi. Ses denetimi HAL uygulaması, API çağrıldığında mevcut tüm modül değişikliği geri çağırma işlevini değiştirmelidir.
clearModuleChangeCallback
API için uygulama, mevcut geri çağırmayı temizlemelidir veya mevcut değilse hiçbir şey yapmamalıdır. Ses denetimi uygulamasının, geri çağırma için bir sonlandırma gözlemcisi kaydettirmesi ve ardından bağlayıcı üzerinde sonlandırma tetiklenirse geri çağırmayı temizlemesi iyi bir uygulamadır.
IModuleChangeCallback
aşağıdaki şekilde tanımlanır:
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);
}
Modül değişikliği geri çağırma işlevi araç ses hizmeti tarafından kaydedildiğinde, onAudioPortChanged
API üzerinden ses bağlantı noktası değişikliklerini almaya hazır olur. API, geri çağırma işlevi kaydedildikten sonra ses sistemi için ses kazançlarını başlatmak amacıyla kullanılabilir. Diğer dinamik kazanç değişiklikleri için API dilediğiniz zaman çağrılabilir. İlgili değişiklikler uygulanır ve araç ses hizmeti buna göre güncellenir.