blob: 80dd25039f05c10c7bdfca18178c25e05bf08429 [file] [log] [blame]
package com.android.cts.verifier.audio;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.util.Log;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
* A wrapper on AudioRecord class.
*/
public class AudioRecordHelper {
private static final int[] SOURCE = {
MediaRecorder.AudioSource.MIC, MediaRecorder.AudioSource.VOICE_RECOGNITION};
private static final int[] SAMPLE_RATES_HZ = {
AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC), 48000, 44100};
private static final int CHANNEL = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private static final int ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private static final String TAG = "AudioRecordHelper";
private static AudioRecordHelper instance;
private final int bufferSize;
private final int sampleRate;
private final int source;
private ByteArrayOutputStream os;
private AudioRecord audioRecord;
private volatile boolean isRecording = false;
private AudioRecordHelper() {
int tmpBufferSize = 0;
int tmpSampleRate = 0;
int tmpSource = 0;
initialization:
for (int source : SOURCE) {
for (int rate : SAMPLE_RATES_HZ) {
tmpBufferSize = AudioRecord.getMinBufferSize(rate, CHANNEL, ENCODING);
AudioRecord testAudioRecord = new AudioRecord(source, rate, CHANNEL, ENCODING,
tmpBufferSize);
if (testAudioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
testAudioRecord.release();
tmpSampleRate = rate;
tmpSource = source;
break initialization;
}
}
}
if (tmpBufferSize == 0 || tmpSampleRate == 0) {
Log.e(TAG, "Failed to initialize");
}
bufferSize = tmpBufferSize;
sampleRate = tmpSampleRate;
source = tmpSource;
Log.d(TAG, "Sample rate = " + sampleRate + "Hz, Source = "
+ source + " (VOICE_RECOGNITION = 6 , MIC = 1)");
}
public static AudioRecordHelper getInstance() {
if (instance == null) {
instance = new AudioRecordHelper();
}
return instance;
}
/**
* Start recording.
*/
public void start() {
if (!isRecording) {
isRecording = true;
os = new ByteArrayOutputStream();
audioRecord = new AudioRecord(source, sampleRate, CHANNEL, ENCODING, bufferSize);
audioRecord.startRecording();
startPullingData();
}
}
/**
* Stop recording
*/
public void stop() {
if (isRecording) {
isRecording = false;
audioRecord.stop();
audioRecord.release();
audioRecord = null;
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void startPullingData() {
new Thread() {
@Override
public void run(){
byte data[] = new byte[bufferSize];
while (isRecording) {
int read = audioRecord.read(data, 0, bufferSize);
if (read > 0) {
os.write(data, 0, read);
}
if (read < 0) {
break;
}
}
}
}.start();
}
/**
* Returns the sample rate for this recorder.
*/
public int getSampleRate() {
return sampleRate;
}
/**
* Returns the audio source currently being used.
*/
public int getAudioSource() {
return source;
}
/**
* Returns true if recorder is recording; False if not.
*/
public boolean isRecording() {
return isRecording;
}
/**
* Returns the raw data.
*/
public byte[] getByte() {
return os.toByteArray();
}
}