Actuellement, j'ai du code qui lit un enregistrement depuis le microphone de l'appareil en utilisant la classe AudioRecord et le joue ensuite en utilisant la classe AudioTrack.
Mon problème est que lorsqu'il est lu, cela se fait via le haut-parleur du téléphone.
Je veux qu'il soit lu via l'écouteur de l'appareil.
Voici mon code :
public class LoopProg extends Activity {
boolean isRecording; //actuellement non utilisé
AudioManager am;
int count = 0;
/** Appelé lorsque l'activité est créée. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setMicrophoneMute(true);
while(count <= 1000000){
Record record = new Record();
record.run();
count ++;
Log.d("COUNT", "Le compteur est: " + count);
}
}
public class Record extends Thread{
static final int bufferSize = 200000;
final short[] buffer = new short[bufferSize];
short[] readBuffer = new short[bufferSize];
public void run() {
isRecording = true;
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int buffersize = AudioRecord.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
AudioRecord arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize);
AudioTrack atrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize, AudioTrack.MODE_STREAM);
am.setRouting(AudioManager.MODE_NORMAL,1, AudioManager.STREAM_MUSIC);
int ok = am.getRouting(AudioManager.ROUTE_EARPIECE);
Log.d("ROUTING", "getRouting = " + ok);
setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
//am.setSpeakerphoneOn(true);
Log.d("SPEAKERPHONE", "Le haut-parleur est-il actif ? : " + am.isSpeakerphoneOn());
am.setSpeakerphoneOn(false);
Log.d("SPEAKERPHONE", "Le haut-parleur est-il actif ? : " + am.isSpeakerphoneOn());
atrack.setPlaybackRate(11025);
byte[] buffer = new byte[buffersize];
arec.startRecording();
atrack.play();
while(isRecording) {
arec.read(buffer, 0, buffersize);
atrack.write(buffer, 0, buffer.length);
}
arec.stop();
atrack.stop();
isRecording = false;
}
}
}
Comme vous pouvez le voir, j'ai essayé d'utiliser la classe AudioManager et ses méthodes, y compris la méthode setRouting dépréciée et rien ne fonctionne, la méthode setSpeakerphoneOn semble n'avoir aucun effet du tout, tout comme la méthode de routage.
Est-ce que quelqu'un a une idée de comment le faire passer par l'écouteur au lieu du haut-parleur ?