À partir d'Android 11, les fabricants d'appareils ont la possibilité d'attacher et d'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 la 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 cadre des effets audio.
Cette fonctionnalité est principalement destinée aux équipementiers automobiles, mais peut également être utilisée dans d'autres facteurs de forme Android. Un exemple d'application consiste à insérer 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.
Conditions préalables
- Comme pour tout autre effet audio, l'effet doit être implémenté par une bibliothèque de fournisseur et répertorié dans le fichier de configuration
audio_effects.xml
. - L'effet doit être de type prétraitement ou post-traitement (flag
TYPE_PRE_PROC
ouTYPE_POST_PROC
défini dansEffectDescriptor.flags
). - Si l'implémentation de l'effet est accélérée matériellement (indicateur
HW_ACC_TUNNEL
défini dansEffectDescriptor.flags
), il peut être attaché à un chemin audio entièrement connecté sous le HAL (pas de flux audio de lecture ou de capture ouvert au niveau du HAL audio).
Création et activation d'un effet de périphérique
Les effets audio spécifiques à l'appareil peuvent être instanciés à l'aide de l'une des deux méthodes ci-dessous.
Utilisation d'un fichier de configuration d'effets audio
Cette méthode permet la création statique d'un effet audio qui est systématiquement attaché et activé à n'importe quel chemin audio en sélectionnant un appareil spécifié comme récepteur ou source.
Cela se fait en ajoutant 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>
Utilisation d'une API système
Un nouveau constructeur @SystemApi a été ajouté à la classe android.media.audiofx.AudioEffect
pour créer et activer un effet de périphérique :
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 demander si une implémentation prend en charge une combinaison périphérique/effet donnée.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Nouvelles API HAL
Effet audio HAL
L'effet audio HAL V6.0 a une nouvelle signature pour la méthode createEffect()
permettant la création d'un effet attaché à un périphérique :
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- L'
AudioSession
spécifié doit êtreAudioSessionConsts.DEVICE
. -
AudioIoHandle
est ignoré si lasession
estAudioSessionConsts.DEVICE
. - Le
device
est identifié par sonAudioPortHandle
unique attribué par le framework audio lorsque le périphérique est sélectionné dans la couche HAL audio avecIDevice::createAudioPatch()
.
HAL audio
Pour prendre en charge la fonctionnalité d'effet de périphérique, la couche HAL audio doit implémenter le contrôle de routage audio à l'aide de l' IDevice::createAudioPatch()
. Ceci est indiqué par la IDevice::supportsAudioPatches()
rapportant true
.
Deux nouvelles méthodes API, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
et IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
indiquent à l'implémentation HAL qu'un effet de périphérique a été activé ou désactivé sur un périphérique donné.
Le périphérique est identifié par son ID AudioPortHandle
, qui est utilisé lorsqu'un patch audio est créé avec la 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é.