À 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 l'HAL audio (connexion directe entre un périphérique d'entrée et un périphérique de sortie) peuvent être contrôlés par le framework d'effets audio.
Cette fonctionnalité s'adresse principalement aux OEM automobiles, mais peut également être utilisée dans d'autres facteurs de forme Android. Par exemple, une application insère un effet d'amélioration de la voix sur la sortie du tuner FM lorsqu'il est directement connecté au haut-parleur via le DSP audio.
Prérequis
- Comme pour tout autre effet audio, l'effet doit être implémenté par une bibliothèque de fournisseurs et listé dans le fichier de configuration
audio_effects.xml
. - L'effet doit être de type "preprocessing" ou "postprocessing" (indicateur
TYPE_PRE_PROC
ouTYPE_POST_PROC
défini dansEffectDescriptor.flags
). - Si l'implémentation de l'effet est accélérée par le matériel (indicateur
HW_ACC_TUNNEL
défini dansEffectDescriptor.flags
), elle peut être associée à un chemin audio entièrement connecté sous la couche HAL (aucun flux audio de lecture ou de capture n'est ouvert au niveau de la couche HAL audio).
Créer et activer un effet d'appareil
Les effets audio spécifiques à l'appareil peuvent être instanciés à 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 récepteur 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 périphérique audio, il peut être activé ou désactivé avec les API AudioEffect existantes.
Une API est également disponible pour vérifier 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'effet audio
HAL V6.0 d'effet audio possède une nouvelle signature pour la méthode createEffect()
, ce qui permet de créer un effet associé à un appareil :
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- Le
AudioSession
spécifié doit êtreAudioSessionConsts.DEVICE
. AudioIoHandle
est ignoré sisession
estAudioSessionConsts.DEVICE
.- L'
device
est identifié par sonAudioPortHandle
unique attribué par le framework audio lorsque l'appareil est sélectionné au niveau du HAL audio avec la méthodeIDevice::createAudioPatch()
.
HAL audio
Pour prendre en charge la fonctionnalité d'effet d'appareil, l'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 renvoie 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 patch audio est créé avec la méthode IDevice::createAudioPatch()
.
Les API Audio HAL peuvent être utilisées par une implémentation si une coordination est nécessaire entre les HAL audio et d'effet lorsqu'un effet est activé ou désactivé.