Interfejs HAL do sterowania dźwiękiem został wprowadzony w Androidzie 9 obsługiwać przypadki użycia audio w branży motoryzacyjnej. Od Androida 14. HAL do sterowania dźwiękiem obsługuje:
- Zanikanie i balans
- Żądanie aktywności HAL audio
- Wyciszanie i wyciszanie urządzeń
- Zmiany wzmocnienia urządzenia audio
- Zmiany w konfiguracji portu audio
Rys. 1 przedstawia ogólny przegląd architektury samochodowej usługi audio który łączy usługę audio w samochodzie z HAL do sterowania dźwiękiem.
Rysunek 1. Skonfiguruj wielostrefowy dźwięk.
Zanikanie i balans dźwięku
Wprowadzono obsługę dźwięku HAL HIDL w wersji 1 na Androida
9 – obsługa zanikania i balansu dźwięku w samochodach
przypadków. Jest on niezależny od ogólnych efektów dźwiękowych dostępnych już na Androidzie,
umożliwia aplikacjom systemowym ustawianie balansu dźwięku i wyciszanie
CarAudioManager
interfejsów 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);
}
Po wywołaniu tych interfejsów API odpowiednie interfejsy API sterowania dźwiękiem są wywoływane. w samochodowej usłudze audio:
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);
}
Interfejs API jest dostępny we wszystkich wersjach interfejsu HAL do sterowania dźwiękiem, w tym Interfejs AIDL HAL.
Żądanie zaznaczenia dźwięku od HAL
Podobnie jak w przypadku Androida AAOS bazuje na aktywnym uczestnictwie w aplikacjach dźwiękowych. aby zarządzać odtwarzaniem dźwięku w samochodach. Informacje o skupieniu służą do zarządzania które mają sterować głośnością i wyciszaniem tła. W związku z tym, aby rozszerzyć dźwięku i zapewni lepszą integrację dźwięków charakterystycznych dla samochodu, na Androidzie, wprowadziliśmy te atrybuty audio Android 11:
EMERGENCY
SAFETY
VEHICLE_STATUS
ANNOUNCEMENT
Oprócz tej zmiany dodaliśmy też mechanizm dla dźwięków pochodzących z aplikacji spoza Androida. Dlatego też dźwięk HIDL wprowadzono większą kontrolę HAL w wersji 2, aby umożliwić obsługę żądań uwagi, które pochodzą spoza Androida:
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);
}
Gdzie IFocusListener
jest zdefiniowana jako:
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);
}
Za pomocą powyższych interfejsów API można żądać i rezygnować z odtwarzania dźwięku z HAL,
. W odpowiedzi usługa audio w samochodzie analizuje dźwięk
i asynchronicznie przekazuje wyniki do funkcji
Metoda IAudioControl#onAudioFocusChange
.
Ten interfejs API może też służyć do monitorowania zmian w żądaniu skupienia na dźwięku, które pochodzi z panelu HAL do sterowania dźwiękiem. Ogólnie dowolny skupienie dźwięku stojącego żądanie z HAL jest uznawane za aktywne, czyli inaczej niż skupienie dźwięku. żądania z Androida, gdzie tylko odpowiednia aktywna ścieżka audio jest odtwarzana jest uznawane za aktywne.
Przejście z HIDL do sterowania dźwiękiem w AIDL
Wraz z pojawieniem się AIDL i wymaganą migracją na Androidzie 12 (aby dowiedzieć się więcej, zobacz AIDL dla HAL), taki HAL był przeniesione do AIDL. W przypadku istniejących interfejsów API sterowania dźwiękiem HIDL w wersji 2, migracja wymagane drobne aktualizacje istniejących metod:
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);
}
A odpowiednik 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);
}
Wyciszanie grupy głośności
W Androidzie 12 wprowadzono wyciszanie grup głośności, aby umożliwić: bardziej kompleksowa opcja wyciszania podczas interakcji użytkownika z dźwiękiem. Ten umożliwia urządzeniu HAL do sterowania dźwiękiem odbieranie zdarzeń wyciszenia przechwyconych przez samochód usłudze audio.
Aby włączyć tę funkcję, producenci OEM muszą ustawić konfigurację audioUseCarVolumeGroupMuting
na true
w usłudze samochodowej config.xml
:
<!-- 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>
Przed Androidem 13 trzeba było zastąpić konfigurację
z nakładką zasobów środowiska wykonawczego dla
packages/services/Car/service/res/values/config.xml
(aby dowiedzieć się więcej, zobacz
Dostosowywanie kompilacji za pomocą zasobów
nakładki). Na urządzeniu z Androidem
13, możesz użyć nakładek zasobów środowiska wykonawczego, aby zmienić
konfiguracji. Więcej informacji znajdziesz w sekcji Zmienianie wartości zasobów aplikacji
w czasie działania.
Aplikacje systemowe mogą sprawdzić, czy funkcja jest włączona, używając
Interfejs API CarAudioManager#isAudioFeatureEnabled
. Przesłany parametr musi być
Stała wartość CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING
. Metoda zwraca
true
, jeśli funkcja jest włączona na urządzeniu. W przeciwnym razie false
.
Oprócz włączenia funkcji audioUseCarVolumeGroupMuting
interfejs AIDL
HAL sterowania dźwiękiem musi zaimplementować mechanizm wyciszania grupy głośności:
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);
}
Gdzie informacje o wyciszeniu zawierają istotne informacje dotyczące wyciszenia systemu 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 ma 2 różne mechanizmy wyciszania w zależności od:
Kluczowe zdarzenia za pomocą dźwięku KEYCODE_VOLUME_MUTE
bezpośrednie wywołania usługi audio w samochodzie za pomocą interfejsu API wyciszenia w samochodzie.
CarAudioManager#setVolumeGroupMute
Gdy ta opcja jest włączona, oba mechanizmy uruchamiają wyciszenie połączenia dla interfejsu HAL sterującego dźwiękiem.
Wyciszanie tła w samochodzie
W Androidzie 12 wprowadzono wyciszanie dźwięku w samochodzie, aby zoptymalizować kontrolę nad odtwarzania strumieni audio. Dzięki temu OEM może wdrożyć własne wyciszanie tła. działanie na podstawie fizycznej konfiguracji dźwięku w samochodzie oraz aktualnego odtwarzania zgodnie z wymaganiami systemowej usługi audio w samochodzie.
Mechanizm wyciszania tła opiera się na zmianach stosu ostrości dźwięku. Za każdym razem, gdy
zmiana ostrości (czy to żądanie, czy też porzucenie), dźwięk
wyświetlany jest komunikat HAL. Podobnie jak w przypadku grupy głośności w samochodzie,
wyciszanie tła można włączyć za pomocą flagi konfiguracji 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>
Aby można było włączyć tę funkcję, interfejs HAL do sterowania dźwiękiem AIDL musi zaimplementować odpowiednie logika z sygnałem odebranym z samochodowej usługi audio:
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);
}
Wyciszanie tła zawiera odpowiednie informacje o systemie audio. informacje:
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;
}
Oprócz informacji o konfiguracji audio w samochodzie zawartych w adresach urządzeń do (un)duck; informacje o wyciszaniu zawierają też informacje o tym, który dźwięk atrybucje atrybutów utrzymują fokus. Dane te mają na celu informowanie system audio, w którym aktywne atrybuty audio są aktywne.
Jest to wymagane, ponieważ w konfiguracji systemu audio w samochodzie atrybutów można przypisać do jednego urządzenia i bez dodatkowych nie jest jasne, które przypadki użycia są aktywne.
Sterowanie dźwiękiem AIDL HAL 2.0
W celu aktualizacji interfejsów API i usprawniania nowych funkcji interfejs HAL AIDL do sterowania dźwiękiem została zaktualizowana do wersji 2.0 w Androidzie 13:
- Aktywność audio –
PlaybackTrackMetadata
- Dźwięk zyskuje na wywołaniu zwrotnym
Metadane odtwarzania są zdefiniowane w android.hardware.audio.common
w ten sposób:
parcelable PlaybackTrackMetadata {
AudioUsage usage = INVALID;
AudioContentType contentType = UNKNOWN;
float gain;
AudioChannelLayout channelMask;
AudioDevice sourceDevice;
String[] tags;
}
Wszystkie pozostałe funkcje sterowania dźwiękiem AIDL w wersji 1.0 pozostają niezmienione . Wyjątek dotyczy metody zmiany ostrości dźwięku, jak opisano w Metoda zmiany ostrości w trybie audio.
Sterowanie dźwiękiem z metadanymi ścieżki dźwiękowej
Aby udostępnić więcej informacji dla systemu audio poniżej HAL, aktualizacje ujawniają
PlaybackTrackMetadata
Do interfejsu HAL do sterowania dźwiękiem dodano rozszerzenie
nowa metoda:
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);
}
Podobna zmiana zostanie zastosowana w elemencie 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);
}
Metoda zmiany ostrości po włączeniu dźwięku
Powyższe operacje zaznaczania przebiegają tak samo jak opisane w sekcji Dźwięk prośby o koncentrację od HAL. Tylko metadane ścieżki dźwiękowej mają więcej wraz z informacjami o zastosowaniach atrybutów audio. Ogólnie, o ile dodatkowe potrzebnych informacji pochodzących z metadanych ścieżki odtwarzania, zaktualizowany Android do sterowania HAL można nadal używać poprzednich metod.
Jeśli deweloperzy HAL nie obsługują
IAudioControl#onAudioFocusChangeWithMetaData
, metoda powinna zwrócić wyniki
z błędem UNKNOWN_TRANSACTION
zgodnie z opisem Używanie wersji interfejsu
Metody.
Usługa audio najpierw zadzwoni pod numery onAudioFocusChangeWithMetaData
i
a następnie ponawia próbę z metodą onAudioFocusChange
, jeśli UNKNOWN_TRANSACTION
niepowodzenie.
Wyciszanie dźwięku w samochodzie z metadanymi ścieżki odtwarzania
W wersji 2.0 do sterowania dźwiękiem AIDL dodano metadane ścieżki odtwarzania do informacje o wyciszaniu tła:
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;
}
Interfejs usagesHoldingFocus
został wycofany. Deweloperzy powinni teraz używać funkcji
playbackMetaDataHoldingFocus
, aby określić użycie atrybutu audio oraz inne
informacje o dźwięku. Jednak parametr usagesHoldingFocus
nadal zawiera ciąg
wymagane informacje do czasu formalnego usunięcia tej opcji.
Wywołanie zwrotne wzmocnienia dźwięku
Aby zmiany dotyczące dźwięku pod zawartością HAL były bardziej widoczne dla systemu AAOS na Androidzie 13, dodaliśmy mechanizm umożliwiający komunikację dźwięk zmienia się z samochodowego systemu audio na system audio w samochodzie. mechanizm ujawnia zmiany wskaźnika wzmocnienia dźwięku wraz z odpowiednią przyczyną zmienił się zysk:
- Zablokowane lub ignorowane ograniczenia
- Ograniczenia
- Ograniczenia powiadomień
Zmiany te narażają te ograniczenia poniżej HAL na usłudze audio w samochodzie, a także aplikacji interfejsu systemowego, która informuje użytkownika. Druga część, czyli prezentowanie możliwego interfejsu użytkownika, rozwinęła się w Android 14 umożliwia aplikacjom interfejsu systemowym łatwiejsze odczytanie tych informacji za pomocą mechanizmu wywołania zwrotnego informacji o grupie woluminów.
Interfejs HAL API do sterowania dźwiękiem rejestruje wywołanie zwrotne wzmocnienia w następujący sposób:
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
jest zdefiniowany w ten sposób:
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);
}
Jak zaznaczono w dokumentacji interfejsu API, wywołanie zwrotne wzmocnienia jest rejestrowane przez z usługi audio w samochodzie do HAL sterowania dźwiękiem. Gdy interfejs API jest wywoływany z sterowania dźwiękiem HAL, system audio w samochodzie reaguje na odpowiednie działanie (takich jak blokowanie, ograniczanie lub zmniejszanie wskaźnika wzmocnienia) .
HAL określa, kiedy interfejs API jest wywoływany, głównie w celu raportowania zmian uzyskać stan indeksu. System audio w samochodzie zgodny z wymaganiami prawnymi powinien podjąć wymagane działania i użyć wywołania zwrotnego do przesłania informacji umożliwia korzystanie z usługi audio w samochodzie. Na przykład, aby pokazać interfejs, po stronie użytkownika.
Sterowanie dźwiękiem AIDL HAL 3.0
Wersja HAL sterowania dźwiękiem AIDL w Androidzie 14 to
Zaktualizowaliśmy do wersji 3.0, aby zaktualizować interfejsy API i zapewnić większe wzmocnienie dźwięku.
funkcji indeksowania. Interfejs HAL API do sterowania dźwiękiem umożliwia usłudze audio
ustaw i anuluj ustawienie: 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
jest zarejestrowany przez system audio w samochodzie, gdy
po uruchomieniu usługi lub podczas przywracania działania po wystąpieniu błędu. Na przykład element sterujący dźwiękiem
Powiadomienie HAL dotyczące śmierci twórcy w systemie audio w samochodzie. Dźwięk
kontrola implementacji HAL powinna zastąpić obecne wywołanie zwrotne zmiany modułu
przy wywołaniu interfejsu API.
W przypadku interfejsu API clearModuleChangeCallback
implementacja powinna wyczyścić
oddzwonienie lub nie wykonać żadnych działań, jeśli takie wywołanie nie istnieje. To dobra metoda, gdy:
wdrożenie sterowania dźwiękiem w celu zarejestrowania osoby obserwującej śmierć na wywołanie zwrotne.
a następnie usunąć wywołanie zwrotne, jeśli nastąpi śmierć po obudowie.
IModuleChangeCallback
jest zdefiniowany w ten sposób:
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);
}
Gdy usługa audio w samochodzie zostanie zarejestrowana dla zmiany modułu,
gotowe do odbierania zmian portu audio za pomocą interfejsu API onAudioPortChanged
.
Interfejs API może być używany do inicjowania wzmocnienia głośności w systemie audio, gdy tylko
. W przypadku innych zmian wzmocnienia dynamicznego interfejs API może być wywoływany
w każdej chwili. Zastosowano odpowiednie zmiany, a usługa audio w samochodzie została zaktualizowana
odpowiednio się zmienia.