Android 9'da, otomotivle ilgili ses kullanım alanlarını desteklemek için ses kontrolü HAL'i kullanıma sunuldu. Android 14'ten itibaren ses kontrolü HAL'ı şunları destekler:
- Solma ve denge
- HAL ses odağı isteği
- Cihazın sesini kapatma ve ses kısma
- Ses cihazı kazancındaki değişiklikler
- Ses bağlantı noktası yapılandırma değişiklikleri
Şekil 1'de, araç ses hizmetinin ses kontrolü HAL ile iletişim kurduğu araç ses hizmeti mimarisine ilişkin üst düzey bir genel bakış gösterilmektedir.
1. şekil. Çok bölgeli sesi yapılandırın.
Ses geçişi ve dengesi
HIDL ses kontrolü HAL sürüm 1, Android 9'da otomotiv kullanım alanlarında ses geçişini ve dengeyi desteklemek için kullanıma sunuldu. Android'de zaten sağlanan genel ses efektlerinden ayrı olarak bu mekanizma, sistem uygulamalarının CarAudioManager
API'leri aracılığıyla ses dengesini ve geçişini ayarlaması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, ilgili ses kontrolü HAL API'leri araç ses hizmetinden ç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'nin tüm sürümlerinde kullanılabilir.
HAL'den ses odağı isteği
Android'e benzer şekilde AAOS, arabalarda ses oynatmayı yönetmek için ses odağındaki uygulamaların etkin katılımına dayanır. Odak bilgileri, ses seviyesi ve ses kısma 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 arabaya özgü seslerin Android deneyimine daha iyi entegrasyonunu 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'in dışından gelen seslerin ses odağı isteklerine katılması için bir mekanizma eklendi. Bu nedenle, Android'in dışından gelen odak isteklerine izin vermek için HIDL ses kontrolü HAL sürüm 2 kullanıma sunuldu:
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ğı istemek ve ses odağını bırakmak için kullanılabilir. Buna karşılık, araç ses hizmeti ses odağı isteğini dikkate alır ve sonuçları eşzamansız olarak IAudioControl#onAudioFocusChange
yöntemine iletir.
Bu API, ses kontrolü HAL'sinden kaynaklanan ses odağı isteğindeki değişiklikleri izlemek için de kullanılabilir. Genel olarak, HAL'den gelen tüm mevcut ses odağı istekleri etkin olarak kabul edilir. Bu durum, Android'den gelen ses odağı isteklerinden farklıdır. Android'den gelen ses odağı isteklerinde yalnızca karşılık gelen etkin ses parçası oynatma etkin olarak kabul edilir.
HIDL'yi AIDL ses kontrolü HAL'sine taşıma
Android 12'de AIDL'nin kullanıma sunulması ve gerekli taşıma işlemiyle (daha fazla bilgi için HAL'ler için AIDL başlıklı makaleyi inceleyin) birlikte ses kontrolü HAL'si AIDL'ye taşındı. Mevcut HIDL ses kontrolü sürüm 2 API'leri için taşıma işlemi, mevcut yöntemlerde küçük güncellemeler yapılmasını gerektiriyordu:
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);
}
Ayrıca ilgili 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 grubu sessize alma
Android 12, kullanıcıların ses etkileşimleri sırasında daha kapsamlı bir sessize alma kontrolü sağlamak için ses grubu sessize alma özelliğini kullanıma sundu. Bu, ses kontrolü HAL'inin, araba ses hizmeti tarafından yakalanan sessize alma etkinliklerini almasına olanak tanır.
Özelliği etkinleştirmek için OEM'lerin araba hizmeti config.xml
içinde audioUseCarVolumeGroupMuting
yapılandırmasını true
olarak ayarlaması 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ırmanın packages/services/Car/service/res/values/config.xml
için çalışma zamanı kaynak yerleşimiyle üzerine yazılması gerekiyordu (daha fazla bilgi için Kaynak yerleşimleriyle derlemeyi özelleştirme başlıklı makaleye bakın). Android 13'ten itibaren, yapılandırma değerini değiştirmek için çalışma zamanı kaynak kaplamalarını kullanabilirsiniz. Daha fazla bilgi için Bir uygulamanın kaynaklarının değerini çalışma zamanında değiştirme başlıklı makaleyi inceleyin.
Sistem uygulamaları, CarAudioManager#isAudioFeatureEnabled
API'sini kullanarak özelliğin etkin olup olmadığını belirleyebilir. İletilen parametre, CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING
sabiti olmalıdır. Özellik cihazda etkinse yöntem true
, aksi takdirde false
değerini döndürür.
audioUseCarVolumeGroupMuting
özelliğini etkinleştirmenin yanı sıra AIDL
ses kontrolü HAL'i, 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);
}
Sesi kapatma bilgileri, ses sistemiyle ilgili sesi kapatma 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, aşağıdakilere bağlı olarak iki farklı sessize alma mekanizması bulunur:
Ses KEYCODE_VOLUME_MUTE kullanılarak tetiklenen önemli etkinlikler.
Araba ses yöneticisi sessize alma API'si kullanılarak araba ses hizmetine doğrudan yapılan çağrılar,
CarAudioManager#setVolumeGroupMute
.
Etkinleştirildiğinde her iki mekanizma da ses kontrolü HAL'sinde çağrı sessize alma işlemini tetikler.
Araç sesini kısma
Android 12, ses akışlarının eşzamanlı oynatılmasının kontrolünü optimize etmek için araç sesinde ducking özelliğini kullanıma sundu. Bu sayede OEM'ler, arabanın fiziksel ses yapılandırmasına ve araba ses hizmeti tarafından belirlenen mevcut oynatma durumuna göre kendi ses kısma davranışlarını uygulayabilir.
Sesi kısma mekanizması, ses odağı yığını değişikliklerine dayanır. Odaklanma isteği veya odaklanmayı bırakma gibi bir odaklanma değişikliği olduğunda ses kontrolü HAL'i bilgilendirilir. Araba ses seviyesi grubu sessize alma desteğine benzer şekilde, araba sesini kısma ö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'sinin, araç ses hizmetinden alınan sinyalle ilgili mantığı uygulaması gerekir:
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;
}
Cihaz adreslerinde bulunan araç ses yapılandırma bilgilerinin yanı sıra, ducking bilgileri hangi ses özelliği kullanımlarının odaklandığı hakkında da bilgi içerir. Bu verilerin amacı, ses sistemine hangi ses özelliği kullanımlarının etkin olduğunu bildirmektir.
Araba ses sistemi yapılandırmasında tek bir cihaza birden fazla ses özelliği atanabildiğinden ve ek bilgiler olmadan hangi kullanımların etkin olduğu net olarak anlaşılamadığından bu gereklidir.
AIDL ses kontrolü HAL 2.0
API'leri güncellemek ve yeni işlevleri kolaylaştırmak için AIDL ses kontrolü HAL'si, Android 13'te 2.0 sürümüne güncellendi:
PlaybackTrackMetadata
ile ses odağı- Ses kazançları geri araması
Oynatma meta verileri, android.hardware.audio.common
içinde şu şekilde tanımlanır:
parcelable PlaybackTrackMetadata {
AudioUsage usage = INVALID;
AudioContentType contentType = UNKNOWN;
float gain;
AudioChannelLayout channelMask;
AudioDevice sourceDevice;
String[] tags;
}
AIDL ses kontrolü sürüm 1.0'daki diğer tüm işlevler korunmuş ve kullanılabilir. Ses odağı değiştirme yöntemi hakkında bölümünde açıklandığı gibi, ses odağı değiştirme yöntemiyle ilgili bir istisna vardır.
Oynatma parçası meta verileriyle ses kontrolü odağı
HAL'in altındaki ses sistemine daha fazla bilgi sunmak için güncellemeler artık PlaybackTrackMetadata
'yı kullanıyor. Özellikle, ses kontrolü HAL'ı 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);
}
On audio focus change method
Yukarıdaki odak 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 verileri, ses özelliği kullanımlarıyla birlikte daha fazla bilgi içerir. Genel olarak, oynatma parçası meta verileri tarafından sağlanan ek bilgiler gerekmedikçe güncellenen android kontrol HAL'si önceki yöntemleri kullanmaya devam edebilir.
HAL geliştiricileri IAudioControl#onAudioFocusChangeWithMetaData
'yı desteklememeye karar verirse yöntem, Using Versioned Interface Methods (Sürüm Oluşturulmuş Arayüz Yöntemlerini Kullanma) bölümünde açıklandığı gibi UNKNOWN_TRANSACTION
hatasıyla sonuç döndürmelidir.
Ses hizmeti önce onAudioFocusChangeWithMetaData
yöntemini çağırır ve UNKNOWN_TRANSACTION
hatası oluşursa onAudioFocusChange
yöntemiyle yeniden dener.
Çalma parçası meta verileriyle araba sesini kısma
AIDL ses kontrolü HAL'nin 2.0 sürümünde, oynatma parçası meta verileri ses kısma bilgilerine 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ği kullanımını ve diğer ses bilgilerini belirlemek için playbackMetaDataHoldingFocus
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 araması
Android 13'te HAL'in altındaki ses değişikliklerini AAOS için daha görünür hale getirmek amacıyla, aracın ses sisteminden araç ses hizmetine ses kazancı değişikliklerini iletmek için kullanabileceğiniz bir mekanizma ekledik. Mekanizma, ses kazancı birimi değişikliklerini, kazancın neden değiştirildiğine dair ilgili bir gerekçeyle birlikte gösterir:
- Engellenmiş veya sessize alınmış kısıtlamalar
- Sınırlamalar ve kısıtlamalar
- Zayıflama kısıtlamaları
Bu değişiklikler, bu kısıtlamaları HAL'in altından araç ses hizmetine ve nihayetinde kullanıcıyı bilgilendirmek için bir sistem kullanıcı arayüzü uygulamasına sunar. Olası bir sistem kullanıcı arayüzüne maruz kalma ile ilgili ikinci kısım, Android 14'te daha da genişletilerek sistem kullanıcı arayüzü uygulamalarının bu bilgiyi bir ses grubu bilgisi geri çağırma mekanizması aracılığıyla daha kolay almasına olanak tanındı.
Ses kontrolü HAL API'si, kazanç geri çağırmasını 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
şu ş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 belgelerinde belirtildiği gibi, kazanç geri çağırması araç ses hizmeti tarafından ses kontrolü HAL'ına kaydedilir. API, ses kontrolü HAL'den çağrıldığında araç ses hizmeti, karşılık gelen bir işlemle (ör. kazanç dizinini engelleme, sınırlama veya zayıflatma) yanıt verir.
HAL, öncelikle kazanç dizini durumundaki değişiklikleri bildirmek için API'nin ne zaman çağrılacağını belirler. Yönetmelik şartlarına özel olarak, arabanın ses sistemi gerekli işlemi yapmalı ve geri aramayı kullanarak bilgileri araba ses hizmetine bildirmelidir. Böylece kullanıcılar bu bilgileri kullanabilir. Örneğin, kullanıcıya bir kullanıcı arayüzü göstermek için.
AIDL ses kontrolü HAL 3.0
Android 14 AIDL ses kontrolü HAL sürümü, API'leri daha sağlam bir ses kazancı dizini işlevi sağlayacak şekilde güncellemek için 3.0 sürümüne güncellendi. Ses kontrolü HAL API, ses hizmetinin IModuleChangeCallback
ayarlamasına ve ayarını 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 kurtulurken araç ses hizmeti tarafından kaydedilir. Örneğin, araba ses hizmeti tarafından alınan bir ses kontrolü HAL bağlayıcı ölüm bildirimi. Ses kontrolü HAL uygulaması, API çağrıldığında mevcut tüm modül değişikliği geri çağırmalarını değiştirmelidir.
clearModuleChangeCallback
API'si için mevcut geri çağırma temizlenmeli veya geri çağırma yoksa hiçbir işlem yapılmamalıdır. Geri çağırma için bir ölüm gözlemcisi kaydetmek ve bağlayıcı ölümü tetiklenirse geri çağırmayı temizlemek, ses kontrolü uygulaması için iyi bir uygulamadır.
IModuleChangeCallback
şu ş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 aracılığıyla ses bağlantı noktası değişikliklerini almaya hazır olur. API, geri çağırma kaydedilir kaydedilmez ses sisteminin ses kazançlarını başlatmak için kullanılabilir. Diğer dinamik kazanç değişiklikleri için API istediğiniz zaman çağrılabilir. İlgili değişiklikler uygulanır ve araç ses hizmeti buna göre güncellenir.