|
|
|
@ -1,5 +1,6 @@
|
|
|
|
|
package com.todoroo.aacenc;
|
|
|
|
|
|
|
|
|
|
import java.io.ByteArrayOutputStream;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
@ -7,7 +8,7 @@ import android.media.AudioFormat;
|
|
|
|
|
import android.media.AudioRecord;
|
|
|
|
|
import android.media.MediaRecorder.AudioSource;
|
|
|
|
|
|
|
|
|
|
public class AACRecorder implements AudioRecord.OnRecordPositionUpdateListener {
|
|
|
|
|
public class AACRecorder {
|
|
|
|
|
|
|
|
|
|
private AudioRecord audioRecord;
|
|
|
|
|
private AACEncoder encoder;
|
|
|
|
@ -16,13 +17,32 @@ public class AACRecorder implements AudioRecord.OnRecordPositionUpdateListener {
|
|
|
|
|
|
|
|
|
|
private boolean recording;
|
|
|
|
|
|
|
|
|
|
private static final int SAMPLE_RATE = 16000;
|
|
|
|
|
private static final int SAMPLE_RATE = 8000;
|
|
|
|
|
private static final int NOTIFICATION_PERIOD = 160;
|
|
|
|
|
private static final int MIN_BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE,
|
|
|
|
|
AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT) * 3;
|
|
|
|
|
AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT) * 10;
|
|
|
|
|
|
|
|
|
|
private byte[] buffer = new byte[NOTIFICATION_PERIOD * 2];
|
|
|
|
|
|
|
|
|
|
private Thread readerThread = new Thread() {
|
|
|
|
|
private byte[] readBuffer = new byte[NOTIFICATION_PERIOD * 2];
|
|
|
|
|
public void run() {
|
|
|
|
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
|
|
|
|
while(recording) {
|
|
|
|
|
int bytesRead = audioRecord.read(readBuffer, 0, readBuffer.length);
|
|
|
|
|
System.err.println("Bytes read: " + bytesRead);
|
|
|
|
|
try {
|
|
|
|
|
baos.write(readBuffer);
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
//
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
encoder.encode(baos.toByteArray());
|
|
|
|
|
baos.reset();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public AACRecorder(Context context) {
|
|
|
|
|
encoder = new AACEncoder();
|
|
|
|
|
}
|
|
|
|
@ -35,12 +55,14 @@ public class AACRecorder implements AudioRecord.OnRecordPositionUpdateListener {
|
|
|
|
|
audioRecord = new AudioRecord(AudioSource.MIC, SAMPLE_RATE, AudioFormat.CHANNEL_CONFIGURATION_MONO,
|
|
|
|
|
AudioFormat.ENCODING_PCM_16BIT, MIN_BUFFER_SIZE);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
audioRecord.setPositionNotificationPeriod(NOTIFICATION_PERIOD);
|
|
|
|
|
audioRecord.setRecordPositionUpdateListener(this);
|
|
|
|
|
|
|
|
|
|
encoder.init(64000, 1, SAMPLE_RATE, 16, tempFile);
|
|
|
|
|
|
|
|
|
|
recording = true;
|
|
|
|
|
readerThread.start();
|
|
|
|
|
|
|
|
|
|
audioRecord.startRecording();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -48,9 +70,10 @@ public class AACRecorder implements AudioRecord.OnRecordPositionUpdateListener {
|
|
|
|
|
if (!recording)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
recording = false;
|
|
|
|
|
audioRecord.stop();
|
|
|
|
|
audioRecord.release();
|
|
|
|
|
recording = false;
|
|
|
|
|
System.err.println("Uninit");
|
|
|
|
|
encoder.uninit();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -67,21 +90,4 @@ public class AACRecorder implements AudioRecord.OnRecordPositionUpdateListener {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onMarkerReached(AudioRecord recorder) {
|
|
|
|
|
//
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onPeriodicNotification(AudioRecord recorder) {
|
|
|
|
|
int bytesRead = recorder.read(buffer, 0, buffer.length);
|
|
|
|
|
if (bytesRead < 0) {
|
|
|
|
|
System.err.println("ERROR " + bytesRead);
|
|
|
|
|
stopRecording();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
encoder.encode(buffer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|