Ab Android 11 können die Gerätehersteller bestimmte Audioeffekte automatisch anhängen und aktivieren, wenn ein bestimmtes Audiogerät für die Audioaufnahme oder ‑wiedergabe ausgewählt wird. Eine wichtige Verbesserung ist, dass Audioeffekte, die in einen Audiopfad eingefügt werden, der vollständig unter der Audio-HAL implementiert ist (direkte Verbindung zwischen einem Eingabegerät und einem Ausgabegerät), über das Audioeffekt-Framework gesteuert werden können.
Diese Funktion richtet sich in erster Linie an OEMs aus der Automobilbranche, kann aber auch in anderen Android-Formfaktoren verwendet werden. Eine Beispiel-App fügt dem FM-Tuner-Ausgang einen Sprachverbesserungseffekt hinzu, wenn er direkt über den Audio-DSP mit dem Lautsprecher verbunden ist.
Voraussetzungen
- Wie bei allen anderen Audioeffekten muss der Effekt von einer Anbieterbibliothek implementiert und in der
audio_effects.xml
-Konfigurationsdatei aufgeführt werden. - Der Effekt muss vom Typ „Vorverarbeitung“ oder „Nachverarbeitung“ sein (
TYPE_PRE_PROC
oderTYPE_POST_PROC
inEffectDescriptor.flags
festgelegt). - Wenn die Effektimplementierung hardwarebeschleunigt ist (Flag
HW_ACC_TUNNEL
inEffectDescriptor.flags
festgelegt), kann sie an einen Audiopfad angehängt werden, der vollständig unter der HAL verbunden ist (kein Wiedergabe- oder Aufnahme-Audiostream, der in der Audio-HAL geöffnet wird).
Geräteeffekt erstellen und aktivieren
Gerätespezifische Audioeffekte können mit einer der beiden folgenden Methoden instanziiert werden.
Konfigurationsdatei für Audioeffekte verwenden
Mit dieser Methode können Sie einen Audioeffekt statisch erstellen, der systematisch an einen beliebigen Audiopfad angehängt und aktiviert wird. Dabei wird ein bestimmtes Gerät als Ziel oder Quelle ausgewählt.
Fügen Sie dazu einen bestimmten Abschnitt in die audio_effects.xml
-Datei ein:
<deviceEffects> <devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom"> <apply effect="agc"/> </devicePort> </deviceEffects>
System-API verwenden
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äte-Descriptors erstellt wurde, kann er mithilfe vorhandener AudioEffect APIs aktiviert oder deaktiviert werden.
Über eine API kann auch abgefragt werden, ob eine Implementierung eine bestimmte Geräte-/Effektkombination unterstützt.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Neue HAL-APIs
Audioeffekt HAL
Die Audioeffekt-HAL V6.0 hat eine neue Signatur für die createEffect()
-Methode, mit der ein Effekt erstellt werden kann, der an ein Gerät angehängt ist:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- Der angegebene
AudioSession
mussAudioSessionConsts.DEVICE
lauten. AudioIoHandle
wird ignoriert, wennsession
=AudioSessionConsts.DEVICE
ist.- Die
device
wird durch ihre eindeutigeAudioPortHandle
identifiziert, die ihr vom Audio-Framework zugewiesen wird, wenn das Gerät in der Audio-HAL mit derIDevice::createAudioPatch()
-Methode ausgewählt wird.
Audio HAL
Um die Funktion für Geräteeffekte zu unterstützen, muss die Audio-HAL die Audio-Routingsteuerung mithilfe der IDevice::createAudioPatch()
API implementieren. Dies wird durch die IDevice::supportsAudioPatches()
-Methode mit dem Wert true
angezeigt.
Mit zwei neuen API-Methoden, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
und IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
, wird der HAL-Implementierung mitgeteilt, dass ein Geräteeffekt auf einem bestimmten Gerät aktiviert oder deaktiviert wurde.
Das Gerät wird anhand seiner AudioPortHandle
-ID identifiziert, die beim Erstellen eines Audio-Patches mit der Methode IDevice::createAudioPatch()
verwendet wird.
Die Audio HAL APIs können von einer Implementierung verwendet werden, wenn eine Koordination zwischen den Audio- und Effekt-HALs erforderlich ist, wenn ein Effekt aktiviert oder deaktiviert wird.