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:
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, ...
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;
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:
Je rencontre malgré tout plusieurs problèmes:
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;
- 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);
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.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
Merci pour vos conseils.
Partager