Ab Android 11 haben Gerätehersteller die Möglichkeit, bestimmte Audioeffekte automatisch anzuhängen und zu aktivieren, wenn ein bestimmtes Audiogerät für die Audioaufnahme oder -wiedergabe ausgewählt wird. Eine wesentliche Verbesserung besteht darin, dass Audioeffekte, die auf einem Audiopfad eingefügt werden, der vollständig unterhalb der Audio-HAL (direkte Verbindung zwischen einem Eingabegerät und einem Ausgabegerät) implementiert ist, vom Audioeffekt-Framework gesteuert werden können.
Diese Funktion richtet sich in erster Linie an Automobil-OEMs, kann aber auch in anderen Android-Formfaktoren verwendet werden. Eine Beispiel-App fügt einen Sprachverbesserungseffekt in den FM-Tuner-Ausgang ein, wenn er über den Audio-DSP direkt mit dem Lautsprecher verbunden ist.
Voraussetzungen
- Wie jeder andere Audioeffekt muss der Effekt von einer Anbieterbibliothek implementiert und in der Konfigurationsdatei
audio_effects.xml
aufgeführt werden. - Der Effekt muss vom Typ Vorverarbeitung oder Nachverarbeitung sein (Flag
TYPE_PRE_PROC
oderTYPE_POST_PROC
inEffectDescriptor.flags
gesetzt). - Wenn die Effektimplementierung HW-beschleunigt ist (Flag
HW_ACC_TUNNEL
inEffectDescriptor.flags
gesetzt), kann sie an einen Audiopfad angehängt werden, der vollständig unterhalb des HAL verbunden ist (kein Wiedergabe- oder Aufnahme-Audiostream am Audio-HAL geöffnet).
Erstellen und aktivieren Sie einen Geräteeffekt
Gerätespezifische Audioeffekte können mit einer der beiden folgenden Methoden instanziiert werden.
Verwenden Sie eine Audioeffekt-Konfigurationsdatei
Diese Methode ermöglicht die statische Erstellung eines Audioeffekts, der systematisch an jeden Audiopfad angehängt und aktiviert wird, indem ein bestimmtes Gerät als Senke oder Quelle ausgewählt wird.
Dies geschieht durch das Hinzufügen eines bestimmten Abschnitts in der Datei audio_effects.xml
wie folgt:
<deviceEffects> <devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom"> <apply effect="agc"/> </devicePort> </deviceEffects>
Verwenden Sie eine System-API
Der Klasse android.media.audiofx.AudioEffect
wurde ein neuer @SystemApi-Konstruktor hinzugefügt, um einen Geräteeffekt zu erstellen und zu aktivieren:
AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Nachdem der Effekt durch Angabe der eindeutigen Audioeffekt-ID und des Audiogerätedeskriptors erstellt wurde, kann er mit vorhandenen AudioEffect-APIs aktiviert oder deaktiviert werden.
Es steht auch eine API zur Abfrage zur Verfügung, ob eine Implementierung eine bestimmte Kombination aus Gerät und Effekt unterstützt.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Neue HAL-APIs
Audioeffekt HAL
Der Audioeffekt HAL V6.0 verfügt über eine neue Signatur für die Methode createEffect()
die die Erstellung eines an ein Gerät angeschlossenen Effekts ermöglicht:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- Die angegebene
AudioSession
mussAudioSessionConsts.DEVICE
sein. -
AudioIoHandle
wird ignoriert, wenn diesession
AudioSessionConsts.DEVICE
ist. - Das
device
wird durch sein eindeutigesAudioPortHandle
identifiziert, das vom Audio-Framework zugewiesen wird, wenn das Gerät im Audio-HAL mit der MethodeIDevice::createAudioPatch()
ausgewählt wird.
Audio-HAL
Um die Geräteeffektfunktion zu unterstützen, muss die Audio-HAL die Audio-Routing-Steuerung mithilfe der IDevice::createAudioPatch()
-API implementieren. Dies wird durch die IDevice::supportsAudioPatches()
Methode angezeigt, die true
meldet.
Zwei neue API-Methoden, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
und IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
teilen der HAL-Implementierung mit, dass ein Geräteeffekt auf einem bestimmten Gerät aktiviert oder deaktiviert wurde.
Das Gerät wird durch seine AudioPortHandle
ID identifiziert, die verwendet wird, wenn ein Audio-Patch mit der Methode IDevice::createAudioPatch()
erstellt wird.
Die Audio-HAL-APIs können von einer Implementierung verwendet werden, wenn beim Aktivieren oder Deaktivieren eines Effekts eine Koordination zwischen den Audio- und Effekt-HALs erforderlich ist.