Ab Android 11 können 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 besteht darin, dass Audioeffekte, die in einen Audiopfad eingefügt werden, der vollständig unterhalb des Audio-HAL implementiert ist (direkte Verbindung zwischen einem Eingabe- und einem Ausgabegerät), vom Audioeffekt-Framework gesteuert werden können.
Diese Funktion ist in erster Linie für Automobil-OEMs gedacht, kann aber auch in anderen Android-Formfaktoren verwendet werden. Eine Beispiel-App fügt dem FM-Tuner-Ausgang einen Sprachverbesserungseffekt hinzu, wenn er über den Audio-DSP direkt mit dem Lautsprecher verbunden ist.
Voraussetzungen
- Wie bei jedem anderen Audioeffekt muss der Effekt von einer Anbieterbibliothek implementiert und in der Konfigurationsdatei
audio_effects.xml
aufgeführt werden. - Der Effekt muss vom Typ „Preprocessing“ oder „Postprocessing“ sein (Flag
TYPE_PRE_PROC
oderTYPE_POST_PROC
inEffectDescriptor.flags
festgelegt). - Wenn die Effektimplementierung hardwarebeschleunigt ist (das Flag
HW_ACC_TUNNEL
ist inEffectDescriptor.flags
festgelegt), kann sie an einen Audiopfad angehängt werden, der vollständig unterhalb 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 kann ein Audioeffekt statisch erstellt werden, der systematisch an jeden Audiopfad angehängt und für jeden Audiopfad aktiviert wird, bei dem ein bestimmtes Gerät als Senke oder Quelle ausgewählt wird.
Fügen Sie dazu einen bestimmten Abschnitt in die Datei audio_effects.xml
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ätedeskriptors erstellt wurde, kann er mit vorhandenen AudioEffect-APIs aktiviert oder deaktiviert werden.
Es ist auch eine API verfügbar, mit der abgefragt werden kann, ob eine Implementierung eine bestimmte Geräte-/Effektkombination unterstützt.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Neue HAL-APIs
HAL für Audioeffekte
Das Audio-Effekt-HAL V6.0 hat eine neue Signatur für die Methode createEffect()
, 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.- Das
device
wird durch seine eindeutigeAudioPortHandle
identifiziert, die vom Audio-Framework zugewiesen wird, wenn das Gerät im Audio-HAL mit der MethodeIDevice::createAudioPatch()
ausgewählt wird.
Audio-HAL
Damit die Geräteeffektfunktion unterstützt wird, muss die Audio-HAL die Audio-Routing-Steuerung über die 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 mit der Methode IDevice::createAudioPatch()
ein Audio-Patch erstellt 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.