package my.app.Library; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import android.content.Context; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.AudioRecord.OnRecordPositionUpdateListener; import android.util.Log; public class AudioStreamer { public final String TAG = "AudioStreamer"; public boolean stop = false; public BlockingQueue<byte[]> bbq = new LinkedBlockingQueue<byte[]>(); int frequency = 11025; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; int bufferSizeRecorder; //int bufferSizePlayer; byte[] buffer; byte[] buff; // pour le methode directe AudioRecord audioRecord; //AudioTrack audioTrack; Thread threcord; Context ctx; int chan ; public AudioStreamer(OnRecordPositionUpdateListener c, int source, int chan) { this.chan = chan ; bufferSizeRecorder = AudioRecord.getMinBufferSize(frequency, channelConfiguration, audioEncoding); audioRecord = new AudioRecord(source, frequency, channelConfiguration, audioEncoding, bufferSizeRecorder); //audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, audioEncoding, bufferSizeRecorder); audioRecord.setPositionNotificationPeriod(512); audioRecord.setRecordPositionUpdateListener(c); //bufferSizePlayer = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding); //audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,frequency, channelConfiguration, audioEncoding, bufferSizePlayer, AudioTrack.MODE_STREAM); threcord = new Thread( new Runnable() { public void run() { record(); } }); } public void run() { Log.i(TAG, "Launch record thread"); stop = false; threcord.start(); } public void record() { try { if (audioRecord.getState() == AudioRecord.STATE_UNINITIALIZED) { Log.e(TAG, "Initialisation failed !"); audioRecord.release(); audioRecord = null; return; } buffer = new byte[bufferSizeRecorder]; audioRecord.startRecording(); while (!stop) { int bufferReadResult = audioRecord.read(buffer, 0, bufferSizeRecorder); // soit bbq byte[] tmp = new byte[bufferReadResult]; System.arraycopy(buffer, 0, tmp, 0, bufferReadResult); bbq.add(tmp); // soit direct //buff = new byte[bufferReadResult]; //System.arraycopy(buffer, 0, buff, 0, bufferReadResult); } audioRecord.stop(); } catch (Throwable t) { Log.e("AudioRecord", "Recording Failed"); } } public byte[] getData() { //return buff; //ou try { if(!bbq.isEmpty()) { return bbq.take(); } } catch (InterruptedException e) { } return null; } public void stop() { stop = true; } public int getChannel() { return chan; } }