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 hauptsächlich auf OEMs aus der Automobilbranche ausgerichtet, kann aber auch in anderen Android-Apps eingesetzt werden. Formfaktoren. Eine Beispiel-App fügt einen Stimmverbesserungseffekt auf den FM-Tuner ein die Ausgabe, wenn sie direkt über den Audio-DSP 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
Diese Methode ermöglicht die statische Erstellung eines Audioeffekts, der systematisch verknüpft wird. und für jeden Audiopfad aktiviert, der ein bestimmtes Gerät als Senke oder Quelle auswählt.
Dazu wird im audio_effects.xml
ein bestimmter Abschnitt hinzugefügt.
wie folgt:
<deviceEffects> <devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom"> <apply effect="agc"/> </devicePort> </deviceEffects>
System-API verwenden
Ein neuer @SystemApi-Konstruktor wurde dem Objekt
<ph type="x-smartling-placeholder"></ph>
android.media.audiofx.AudioEffect
, 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
Audioeffekt HAL
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
Zur Unterstützung der Geräteeffektfunktion muss der Audio-HAL Audio-Routing implementieren
mit der IDevice::createAudioPatch()
API steuern. 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 verwendet wird, wenn eine Audiospur
Patch wird mit der Methode IDevice::createAudioPatch()
erstellt.
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.