Bonjour,

Sous Delphi 11 FMX, je développe une application d'enregistrement audio. Durant l'acquisition, je traite le signal reçu.
Ci-dessous le code de la définition de la tâche d'acquisition:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  FChannelConfig:= TJAudioFormat.JavaClass.CHANNEL_IN_STEREO;
  FAudioFormat  := TJAudioFormat.JavaClass.ENCODING_PCM_16BIT;
  FTailleBufferBytes := TJAudioRecord.JavaClass.getMinBufferSize(FSampleRate, FChannelConfig, FAudioFormat); 
 
  // VOICE_RECOGNITION
  AUDIO_SOURCE:= TJMediaRecorder_AudioSource.JavaClass.VOICE_RECOGNITION ;
 
  //UNPROCESSED Added in API 24
  if (TJBuild_VERSION.JavaClass.SDK_INT >= 24) then
  begin
    FAudioManager:= TJAudioManager.Wrap((TAndroidHelper.Activity.getSystemService(TJContext.JavaClass.AUDIO_SERVICE) as ILocalObject).GetObjectID);
    AudioMngrProp:= FAudioManager.getProperty(TJAudioManager.JavaClass.PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED) ;
    if (Boolean.Parse(JStringToString(AudioMngrProp))) then
    begin
      AUDIO_SOURCE:= TJMediaRecorder_AudioSource.JavaClass.UNPROCESSED ;
    end;
  end;
 
  // Init FAudioRecord
  FAudioRecord := TJAudioRecord.JavaClass.init(AUDIO_SOURCE, FSampleRate, FChannelConfig, FAudioFormat, FTailleBufferBytes);
 
  // Start recording
  (FAudioRecord As JAudioRecord).StartRecording;
Sur certains appareils je rencontre des problèmes de niveaux par rapport à des niveaux connus: atténuation en basses fréquences, niveau x10, niveau divisé par 4, ...

Je pensais avoir résolu ce problème en mettant la source du signal comme UNPROCESSED mais le problème est toujours présent.

Ce que je souhaite maintenant c'est de pouvoir modifier des paramètres de ma tâche acquisition: gain, reverb, equalizer, ...
Android propose pour cela la classe AudioEffect.

J'arrive à désactiver (lorsque disponible) TJAutomaticGainControl, TJNoiseSuppressor et TJAcousticEchoCanceler:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
  sessionID:= FAudioRecord.getAudioSessionId() ;
  if TJAutomaticGainControl.JavaClass.isAvailable then
  begin
    FAutoGainCtrl := TJAutomaticGainControl.JavaClass.create(sessionID) ;
    FAutoGainCtrl.setEnabled(False) ;
  end;
Je rencontre malgré tout plusieurs problèmes:
  • lorsque j'active/désactive ces options, les niveaux sont identiques. Je me dis que ma désactivation ne fonctionne pas.
  • la classe DynamicsProcessing n'est pas disponible dans FMX.
  • l'instanciation d'un TJEqualizer plante avec l'erreur ci-dessous;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FEqualizer := TJEqualizer.JavaClass.init(0, sessionID);


Le projet a déclenché la classe d'exception EJNIException avec le message 'java.lang.RuntimeException: Cannot initialize effect engine for type: 0bed4300-ddd6-11db-8f34-0002a5d5c51b Error: -3
J'ai vérifié que sessionID n'est pas null et rajouté MODIFY_AUDIO_SETTINGS dans les permissions de mon application. Ce dernier problème persiste.

Merci pour vos conseils.