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 folgt.
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 Schemata entsprechen und die Konformität wird durch VTS-Tests überprüft.
Im Rahmen der Implementierung des Audio-HIDL-HAL müssen Sie eine Audiorichtlinien-Konfigurationsdatei 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.
Kern-HAL
Einige der wichtigsten Schnittstellen von Core HAL, die HIDL verwenden, sind wie folgt:
-
IDeviceFactory.hal
ist der Einstiegspunkt in die API. -
IDevice.hal
undIPrimaryDevice.hal
enthalten Methoden wiesetMasterVolume
oderopenInputStream
. - Streams sind unidirektional und werden von AudioFlinger verwendet, um Audio über
IStream.hal
,IStreamOut.hal
undIStreamIn.hal
an und von der HAL zu senden oder zu empfangen.
Die folgende Tabelle listet die Position nützlicher Core HAL HIDL-Komponenten auf:
Kern-HAL-Komponente | Standort |
---|---|
Neueste Version der API | /hardware/interfaces/audio/6.0 |
Spezifische Typen für die neueste Core-HAL-API | /hardware/interfaces/audio/6.0/types.hal |
XSD-Schema der Audiorichtlinien-Konfigurationsdatei | /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 unter Verwendung älterer gemeinsam genutzter Bibliotheken . Die Standardimplementierung kann auch als Referenz bei der Implementierung neuer Versionen von Audio-HALs betrachtet werden, die direkt mit Kernel-Treibern interagieren.
Effekte HAL
Die folgende Tabelle listet die Position nützlicher Effects HAL-Komponenten mit HIDL auf:
Effekte HAL-Komponente | Standort |
---|---|
Neueste Version der API | /hardware/interfaces/audio/effect/6.0/ |
XSD-Schema der Effektkonfigurationsdatei | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd |
Weitere Informationen finden Sie in einer Beispielimplementierung der Effects HAL API unter /hardware/interfaces/audio/effect/all-versions/default/
und im Abschnitt „Audioeffekte“ .
Gemeinsames 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 genutzt werden. - Dienstprogramme (
/hardware/interfaces/audio/common/all-versions
), die zur Codierung anhand von HIDL-APIs für Implementierungen, Clients und Tests verwendet werden.
Updates für Audio HAL V7
Wie in diesem Abschnitt beschrieben, gibt es in Android 12 wesentliche Änderungen an Version 7 des Audio-HAL. Der Audio HAL V7 macht Folgendes:
- Vereinheitlicht die vom Framework und HAL verwendeten Datenmodelle.
- Minimiert die Duplizierung zwischen HIDL-Datentypen (Enums) und dem XML-Schema, das für die Audiorichtlinienkonfiguration verwendet wird.
Konkret werden in Audio HAL V7 Änderungen in folgenden Bereichen vorgenommen:
Diese Änderungen werden in den jeweiligen Abschnitten ausführlicher erläutert.
Aufzählungen
Ab Audio HAL V7 werden in der Audio-Richtlinienkonfigurationsdatei verwendete Aufzählungstypen nur im XSD-Schema und nicht im HIDL definiert.
In Audio HAL V6 werden Werte von Aufzählungstypen (wie AudioFormat
) in types.hal
auch im XSD-Schema der Audiorichtlinienkonfigurationsdatei definiert, wodurch eine Duplizierung entsteht. Um dies in V7 zu vermeiden, werden die Aufzählungstypen in string
geändert und stattdessen alle möglichen Aufzählungswerte im XSD-Schema aufgelistet.
Abbildung 2 vergleicht einige der Änderungen am AudioFormat
Enumerationstyp in V7:
Abbildung 2. Vergleich einiger Änderungen an der AudioFormat-Enumeration.
In der folgenden Liste finden Sie die Enum-Typen, die in string
konvertiert wurden:
-
AudioChannelMask
-
AudioContentType
-
AudioDevice
: Vom Anbieter erweiterbar -
AudioFormat
: Vom Anbieter erweiterbar -
AudioGainMode
-
AudioSource
-
AudioStreamType
-
AudioUsage
Übergeben Sie String-Enum-Werte
String-Werte werden zur Übertragung von Informationen als Aufzählungswerte über die HAL-Schnittstellengrenze hinweg verwendet. Sowohl das Framework als auch der HAL-Wrapper verwenden ganzzahlige Enum-Werte zur Implementierung der Geschäftslogik und verwenden den in Abbildung 3 dargestellten Konvertierungsansatz:
Abbildung 3. Übergabe von String-Enum-Werten.
So übergeben Sie beispielsweise einen Wert des Audioformattyps vom Framework an den Anbieter:
- Der Enum-Wert von
AudioFormat
wird inlibaudiohal
in einen String-Wert konvertiert und an die HAL übergeben. - Auf der HAL-Seite konvertiert der Standard-Wrapper die Zeichenfolge in einen Enum-Wert, der an die Legacy-HAL übergeben wird.
XML-Schemaänderungen
Das Vorhandensein vollständiger Listen von Enum-Werten in der XML-Schemadefinition (XSD) ermöglicht eine bessere XML-Dateivalidierung der Audiorichtlinienkonfiguration durch VTS. Wir haben Änderungen an der mit HAL V7 verwendeten Audiorichtlinien-Konfigurationsdatei vorgenommen, um XSD zu entsprechen.
In V7 wird anstelle von , (Komma) und |
ein Standardzeichen ␣
( ,
) verwendet, um Wertelisten in Attributen (wie Abtastraten, Kanalmasken und Flags) zu begrenzen (vertikaler Balken) Symbole, die in V6 und niedriger verwendet werden. Wie im folgenden Beispiel zu sehen ist, wird ein Leerzeichen verwendet, um die Werteliste für channelMasks
zu begrenzen:
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
Um die Symboländerungen vorzunehmen, verwenden Sie ein automatisches Konvertierungsskript namens update_audio_policy_config.sh
. Sehen Sie sich den folgenden Befehl an, um eine V6-Audiorichtlinien-Konfigurationsdatei in eine V7-Version für das Pixel 5 (Redfin)-Gerät zu 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 in V7 einige Datenstrukturen neu definiert, um doppelte Definitionen zu minimieren. Wiederholte Tupel von Datenelementen werden zu wiederverwendbaren Strukturen gruppiert. Diese Datenstrukturen nutzen die neuesten HIDL-Funktionen wie sichere Vereinigungen.
Beispielsweise wird in V6 und darunter häufig ein Dreifach aus <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 wie folgt definiert:
AudioConfigBase := <format, sampling rate, channel mask>
AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>
Wird von
AudioConfig
,AudioOffloadInfo
undAudioPortConfig
verwendetAudioProfile := <format, {sampling rates}, {channel masks}>
ersetzt lose Sammlungen in
AudioPort/PortConfig
AudioPortExtendedInfo := device | mix | session
ersetzt Unions in
AudioPort/PortConfig
Anbieter-Tags
Zusätzlich zu den Gerätetypen und -formaten können Anbieter benutzerdefinierte Tags für Audiospur-Metadaten hinzufügen.
Für Wiedergabe- und Aufzeichnungsspur-Metadaten können Anbieter ihre eigenen Tags, die zum Hinzufügen von Attributen zu Audio-I/O-Streams verwendet werden, von den Apps an den HAL übergeben.
Anbieter-Tags für Metadaten des Wiedergabetitels werden hinzugefügt, wie im folgenden Beispiel dargestellt:
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 der Aufnahmespur spezifisch sind.
Namensraum für Anbietererweiterungen
Ab HAL V7 erfordern Anbietererweiterungen ein zusätzliches {vendor}
-Präfix, das in V6 nicht erforderlich ist. Damit das Präfix {vendor}
gültig ist, muss es aus drei oder mehr alphanumerischen Zeichen bestehen.
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
Versionsinformation
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,0 |
Android 11 | 6,0 |
Android 10 | 5,0 |
Android 9 | 4,0 |
Android 8 | 2,0 |