Ab Android 11 können Gerätehersteller bestimmte Audioeffekte automatisch hinzufügen und aktivieren, wenn ein Audiogerät für die Audioaufnahme oder -wiedergabe ausgewählt. Eine große Verbesserung ist, dass Audioeffekte auf einem Audiopfad, der vollständig unterhalb des Audio-HAL (direkte Verbindung zwischen einem Eingang Gerät und Ausgabegerät) durch das Framework für Audioeffekte gesteuert werden.
Diese Funktion ist in erster Linie auf OEMs aus der Automobilbranche ausgerichtet, kann aber auch für andere Android-Apps eingesetzt werden. Formfaktoren. Eine Beispiel-App fügt einen Stimmverbesserungseffekt auf den FM-Tuner ein die Ausgabe, wenn sie über den Audio-DSP direkt mit dem Lautsprecher verbunden ist.
Voraussetzungen
- Wie bei allen anderen Audioeffekten muss der Effekt von einer Anbieterbibliothek implementiert und aufgeführt werden.
in der Konfigurationsdatei
audio_effects.xml
. - Der Effekt muss der Typvorverarbeitung oder Nachbearbeitung sein
(
TYPE_PRE_PROC
oderTYPE_POST_PROC
kennzeichnen festgelegt inEffectDescriptor.flags
). - Wenn die Effektimplementierung HW-beschleunigt ist
(Flag
HW_ACC_TUNNEL
inEffectDescriptor.flags
festgelegt), Es kann an einen Audiopfad angehängt werden, der vollständig unterhalb des HAL verbunden ist (keine Wiedergabe oder den am Audio-HAL geöffneten Audiostream aufnehmen).
Geräteeffekt erstellen und aktivieren
Gerätespezifische Audioeffekte können mit einer der 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-Deskriptors erstellt wurde, Er kann mit vorhandenen AudioEffect APIs aktiviert oder deaktiviert werden.
Eine API kann auch abgefragt werden, wenn eine Implementierung eine bestimmte Kombination aus Gerät und Effekt unterstützt.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Neue HAL-APIs
HAL für Audioeffekte
Der Audio-Effekt HAL V6.0 hat eine neue Signatur für die Methode createEffect()
ermöglicht die Erstellung eines Effekts, der an ein Gerät angehängt ist:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- Die angegebene
AudioSession
mussAudioSessionConsts.DEVICE
sein. AudioIoHandle
wird ignoriert, wennsession
gleichAudioSessionConsts.DEVICE
- Das
device
wird durch seine eindeutigeAudioPortHandle
identifiziert, die vom Audio-Framework zugewiesen wird, wenn das Gerät unter Audio-HAL mit derIDevice::createAudioPatch()
-Methode.
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()
-Berichtsmethode true
.
Zwei neue API-Methoden,
IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
und
IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
der HAL-Implementierung mitteilen, dass ein Geräteeffekt auf
auf einem bestimmten Gerät.
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 beim Aktivieren oder Deaktivieren eines Effekts.