Effets audio

À partir d'Android 11, les fabricants d'appareils peuvent associer et activer automatiquement des effets audio spécifiques lorsqu'un appareil audio donné est sélectionné pour la capture ou la lecture audio. Une amélioration majeure est que les effets audio insérés sur un chemin audio entièrement implémenté sous le HAL audio (connexion directe entre un appareil d'entrée et un appareil de sortie) peuvent être contrôlés par le framework d'effets audio.

Cette fonctionnalité est principalement destinée aux OEM automobiles, mais elle peut également être utilisée dans d'autres facteurs de forme Android. Par exemple, une application insère un effet de renforcement de la voix sur la sortie du tuner FM lorsqu'elle est connectée directement à l'enceinte via le DSP audio.

Prérequis

  • Comme pour tout autre effet audio, l'effet doit être implémenté par une bibliothèque du fournisseur et répertorié dans le fichier de configuration audio_effects.xml.
  • L'effet doit être de type prétraitement ou posttraitement (indicateur TYPE_PRE_PROC ou TYPE_POST_PROC défini dans EffectDescriptor.flags).
  • Si l'implémentation de l'effet est accélérée par le matériel (option HW_ACC_TUNNEL définie dans EffectDescriptor.flags), elle peut être associée à un chemin audio entièrement connecté sous le HAL (pas de flux audio de lecture ou de capture ouvert au niveau de l'HAL audio).

Créer et activer un effet d'appareil

Vous pouvez instancier des effets audio spécifiques à l'appareil à l'aide de l'une des deux méthodes ci-dessous.

Utiliser un fichier de configuration des effets audio

Cette méthode permet de créer de manière statique un effet audio qui est systématiquement associé et activé pour tout chemin audio sélectionnant un appareil spécifié comme destination ou source.

Pour ce faire, ajoutez une section spécifique dans le fichier audio_effects.xml, comme suit:

<deviceEffects>
<devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom">
      	<apply effect="agc"/>
      </devicePort>
  </deviceEffects>
  

Utiliser une API système

Un nouveau constructeur @SystemApi a été ajouté à la classe android.media.audiofx.AudioEffect pour créer et activer un effet d'appareil:

AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

Une fois l'effet créé en spécifiant l'ID d'effet audio unique et le descripteur de l'appareil audio, il peut être activé ou désactivé avec les API AudioEffect existantes.

Une API est également disponible pour déterminer si une implémentation est compatible avec une combinaison appareil/effet donnée.

static boolean isEffectSupportedForDevice(
            @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

Nouvelles API HAL

HAL d'effets audio

La version 6.0 du HAL d'effets audio comporte une nouvelle signature pour la méthode createEffect(), qui permet de créer un effet associé à un appareil:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • La valeur AudioSession spécifiée doit être AudioSessionConsts.DEVICE.
  • AudioIoHandle est ignoré si session est AudioSessionConsts.DEVICE.
  • Le device est identifié par son AudioPortHandle unique attribué par le framework audio lorsque l'appareil est sélectionné dans la HAL audio avec la méthode IDevice::createAudioPatch().

Audio HAL

Pour prendre en charge la fonctionnalité d'effets de l'appareil, le HAL audio doit implémenter le contrôle du routage audio à l'aide de l'API IDevice::createAudioPatch(). Cela est indiqué par la méthode IDevice::supportsAudioPatches() qui signale true.

Deux nouvelles méthodes d'API, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) et IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId), indiquent à l'implémentation HAL qu'un effet d'appareil a été activé ou désactivé sur un appareil donné.

L'appareil est identifié par son ID AudioPortHandle, qui est utilisé lorsqu'un correctif audio est créé avec la méthode IDevice::createAudioPatch().

Les API HAL audio peuvent être utilisées par une implémentation si une coordination est nécessaire entre les HAL audio et d'effets lorsqu'un effet est activé ou désactivé.