Audio-Effekte

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 oder TYPE_POST_PROC kennzeichnen festgelegt in EffectDescriptor.flags).
  • Wenn die Effektimplementierung HW-beschleunigt ist (Flag HW_ACC_TUNNEL in EffectDescriptor.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 muss AudioSessionConsts.DEVICE sein.
  • AudioIoHandle wird ignoriert, wenn session gleich AudioSessionConsts.DEVICE
  • Das device wird durch seine eindeutige AudioPortHandle identifiziert, die vom Audio-Framework zugewiesen wird, wenn das Gerät unter Audio-HAL mit der IDevice::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.