In Android 13 und niedriger wird die Audio-HAL-Schnittstelle mithilfe von HIDL in HIDL HAL-Dateien (mit der Erweiterung .hal
) und XSD-Schemas für die Konfigurationsdateien definiert, wie im Folgenden dargestellt.
Abbildung 1: Audio-HAL-Schnittstelle.
Konfigurationsdateien
XML-Konfigurationsdateien für Audiorichtlinien und Audioeffekte gelten als Teil der Audio-HIDL-HAL-Schnittstelle. Diese Dateien müssen ihren Schemas entsprechen. Die Einhaltung wird durch VTS-Tests überprüft.
Im Rahmen der Implementierung der Audio-HIDL-HAL müssen Sie eine Konfigurationsdatei für Audiorichtlinien erstellen, die die Audiotopologie beschreibt. Audio-HAL-Funktionen müssen in der Datei audio_policy_configuration.xml
deklariert werden, damit das Framework sie verwenden kann.
Audio HIDL HAL API
In diesem Abschnitt werden die Core-, Effects- und Common HAL APIs für HIDL beschrieben.
Core HAL
Einige der wichtigsten Schnittstellen der Core HAL mit HIDL sind:
IDeviceFactory.hal
ist der Einstiegspunkt in die API.IDevice.hal
undIPrimaryDevice.hal
enthalten Methoden wiesetMasterVolume
oderopenInputStream
.- Streams sind einseitig und werden von AudioFlinger verwendet, um Audio über
IStream.hal
,IStreamOut.hal
undIStreamIn.hal
an die HAL zu senden oder von ihr zu empfangen.
In der folgenden Tabelle sind die Speicherorte nützlicher Core HAL HIDL-Komponenten aufgeführt:
HAL-Kernkomponente | Standort |
---|---|
Neueste API-Version | /hardware/interfaces/audio/6.0
|
Für die neueste Core HAL API spezifische Typen | /hardware/interfaces/audio/6.0/types.hal
|
XSD-Schema der Konfigurationsdatei für Audiorichtlinien | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd
|
Die Standardimplementierung der Core HAL API (/hardware/interfaces/audio/core/all-versions/default/
) ist ein Wrapper um die HAL-Implementierung vor Treble, die alte freigegebene Bibliotheken verwendet.
Die Standardimplementierung kann auch als Referenz verwendet werden, wenn neue Versionen von Audio-HALs implementiert werden, die direkt mit Kerneltreibern interagieren.
HAL für Effekte
In der folgenden Tabelle ist der Speicherort nützlicher HAL-Komponenten für Effekte mit HIDL aufgeführt:
HAL-Komponente für Effekte | Standort |
---|---|
Neueste API-Version | /hardware/interfaces/audio/effect/6.0/
|
Effektkonfigurationsdatei XSD-Schema | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
Weitere Informationen finden Sie in der Beispielimplementierung der Effects HAL API unter /hardware/interfaces/audio/effect/all-versions/default/
und im Abschnitt Audioeffekte.
Allgemeine HAL
Die Common HAL API mit HIDL enthält Folgendes:
- Definitionen (
/hardware/interfaces/audio/common/6.0/types.hal
), die von den Core- und Effect-APIs gemeinsam verwendet werden. - Dienstprogramme (
/hardware/interfaces/audio/common/all-versions
), die beim Codieren für HIDL-APIs für Implementierungen, Clients und Tests helfen.
Aktualisierungen der Audio HAL V7
In Android 12 gibt es erhebliche Änderungen an Version 7 der Audio HAL, wie in diesem Abschnitt beschrieben. Die Audio HAL V7 bietet folgende Vorteile:
- Die Datenmodelle, die vom Framework und HAL verwendet werden, werden vereinheitlicht.
- Minimiert die Duplizierung zwischen HIDL-Datentypen (Enumerationen) und dem XML-Schema, das für die Konfiguration von Audiorichtlinien verwendet wird.
Insbesondere werden in den folgenden Bereichen von Audio HAL V7 Änderungen vorgenommen:
Diese Änderungen werden in den jeweiligen Abschnitten ausführlicher erläutert.
Aufzählungen
Ab Audio HAL V7 werden die in der Audio Policy Configuration-Datei verwendeten Aufzählungstypen nur im XSD-Schema und nicht in HIDL definiert.
In Audio HAL V6 sind Werte von Enum-Typen (z. B. AudioFormat
) in types.hal
auch im XSD-Schema der Konfigurationsdatei für Audiorichtlinien definiert, was zu einer Duplizierung führt. Um dies in Version 7 zu vermeiden, werden die Enum-Typen in string
geändert und stattdessen alle möglichen Enumerationswerte im XSD-Schema aufgeführt.
In Abbildung 2 werden einige der Änderungen am AudioFormat
-Enumtyp in Version 7 verglichen:
Abbildung 2. Vergleich einiger Änderungen am AudioFormat-Enum
In der folgenden Liste sind die Enum-Typen aufgeführt, die in string
konvertiert wurden:
AudioChannelMask
AudioContentType
AudioDevice
: Vom Anbieter erweiterbarAudioFormat
: Vom Anbieter erweiterbarAudioGainMode
AudioSource
AudioStreamType
AudioUsage
Enum-Werte von Strings übergeben
Stringwerte werden verwendet, um Informationen als Aufzählungswerte über die HAL-Schnittstellengrenze hinweg zu übertragen. Sowohl das Framework als auch der HAL-Wrapper verwenden Ganzzahl-Enum-Werte für die Implementierung der Geschäftslogik und den in Abbildung 3 dargestellten Conversion-Ansatz:
Abbildung 3 Übergeben von enum-Werten vom Typ String
So übergeben Sie beispielsweise einen Wert des Audioformattyps vom Framework an den Anbieter:
- Der enum-Wert von
AudioFormat
wird inlibaudiohal
in einen Stringwert konvertiert und an die HAL übergeben. - Auf HAL-Seite konvertiert der Standard-Wrapper den String in einen Enum-Wert, der an die bisherige HAL übergeben wird.
XML-Schemaänderungen
Vollständige Listen von Enum-Werten in der XML-Schemadefinition (XSD) ermöglichen eine bessere Validierung von XML-Dateien für die Audiorichtlinienkonfiguration durch VTS. Wir haben Änderungen an der Konfigurationsdatei für die Audiorichtlinie vorgenommen, die mit HAL V7 verwendet wird, um die XSD-Anforderungen zu erfüllen.
In Version 7 wird ein Standardzeichen ␣
(Leerzeichen) verwendet, um Wertelisten in Attributen (z. B. Abtastfrequenzen, Kanalmasken und Flags) zu trennen. In Version 6 und niedriger werden die Symbole ,
(Komma) und |
(senkrechter Strich) verwendet. Wie im folgenden Beispiel gezeigt, wird die Liste der Werte für channelMasks
durch ein Leerzeichen begrenzt:
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
Verwenden Sie zum Ändern der Symbole ein automatisches Konvertierungsskript namens update_audio_policy_config.sh
. Mit dem folgenden Befehl können Sie eine V6-Konfigurationsdatei für Audiorichtlinien in eine V7-Version für Google Pixel 5 (Redfin) konvertieren:
hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0
Datentypen
Wir haben einige Datenstrukturen in Version 7 neu definiert, um doppelte Definitionen zu minimieren. Wiederholte Tupel von Datenelementen werden in wiederverwendbaren Strukturen gruppiert. Diese Datenstrukturen nutzen die neuesten HIDL-Funktionen wie sichere Unions.
In Version 6 und niedriger wird beispielsweise häufig ein Dreier von <format, sampling rate, channel mask>
in den HIDL-Schnittstellen und ‑Typen verwendet. Um diese Redundanz zu beseitigen, werden in V7 der Datentyp AudioConfigBase
und andere Datentypen so definiert:
AudioConfigBase := <format, sampling rate, channel mask>
AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>
von
AudioConfig
,AudioOffloadInfo
,AudioPortConfig
verwendetAudioProfile := <format, {sampling rates}, {channel masks}>
ersetzt lose Sammlungen in
AudioPort/PortConfig
AudioPortExtendedInfo := device | mix | session
ersetzt Gewerkschaften in
AudioPort/PortConfig
Anbieter-Tags
Zusätzlich zu Gerätetypen und Formaten können Anbieter benutzerdefinierte Tags für Audiotrack-Metadaten hinzufügen.
Für Metadaten von Wiedergabe- und Aufzeichnungs-Tracks können Anbieter ihre eigenen Tags, mit denen Attribute zu Audio-E/A-Streams hinzugefügt werden, von den Anwendungen an den HAL übergeben.
Anbieter-Tags für Metadaten zu Wiedergabetracks werden wie im folgenden Beispiel hinzugefügt:
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
Die RecordTrackMetadata
-Struktur wird auf ähnliche Weise implementiert, indem Tags hinzugefügt werden, die für die Metadaten des Aufnahme-Tracks spezifisch sind.
Namensraum für Anbietererweiterungen
Ab HAL V7 benötigen Anbietererweiterungen ein zusätzliches {vendor}
-Präfix, das in V6 nicht erforderlich ist. Das {vendor}
-Präfix muss aus mindestens drei alphanumerischen Zeichen bestehen, um gültig zu sein.
Verwenden Sie in V7 das folgende Format:
VX_{vendor}_{letters/numbers}
Im Folgenden finden Sie einige Beispiele für gültige V7-Anbietererweiterungen:
VX_GOOGLE_VR
VX_QCI_AMBIENT_MIC
Versionsinformationen
In der folgenden Tabelle ist die HAL-Versionsnummer für jede Android-Version aufgeführt:
Android-Version | HIDL HAL-Version |
---|---|
Android 13 | 7.1 |
Android 12 | 7 |
Android 11 | 6.0 |
Android 10 | 5 |
Android 9 | 4.0 |
Android 8 | 2 |