package ibe.libs.visualizer;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.media.MediaRecorder.AudioSource;
import android.util.Log;
import anywheresoftware.b4a.BA;
import java.util.Timer;
import java.util.TimerTask;
public class RecordingSampler {
private static final int RECORDING_SAMPLE_RATE = 44100;
private AudioRecord mAudioRecord;
private boolean mIsRecording;
private int mBufSize;
private CalculateVolumeListener mVolumeListener;
private int mSamplingInterval = 100;
private Timer mTimer;
public int d;
private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 };
public AudioRecord findAudioRecord() {
BA.Log( "sdfsdf.sdfsdfsdfsdfsdfsdfsdf");
for (int rate : mSampleRates) {
BA.Log( "a");
for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT }) {
BA.Log( "b");
for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO }) {
BA.Log( "c");
try {
BA.Log("Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: "
+ channelConfig);
int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
// check if we can instantiate and have a success
AudioRecord recorder = new AudioRecord(AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize);
if (recorder.getState() == AudioRecord.STATE_INITIALIZED) {
BA.Log( "asdasd.");
return recorder;
}else{
BA.Log( "d");
}
}else{
BA.Log( "kjlmt");
}
} catch (Exception e) {
BA.Log( rate + "Exception, keep trying.");
}
}
}
}
BA.Log( "sdfsdf.");
return null;
}
public RecordingSampler() {
// init();
mAudioRecord = findAudioRecord();
mAudioRecord.release();
}
public void init()
{
//initAudioRecord();
mAudioRecord = findAudioRecord();
mAudioRecord.release();
}
/**
* setter of CalculateVolumeListener
*
* @param volumeListener CalculateVolumeListener
*/
public void setVolumeListener(CalculateVolumeListener volumeListener) {
mVolumeListener = volumeListener;
}
/**
* setter of samplingInterval
*
* @param samplingInterval interval volume sampling
*/
public void setSamplingInterval(int samplingInterval) {
mSamplingInterval = samplingInterval;
}
/**
* getter isRecording
*
* @return true:recording, false:not recording
*/
public boolean isRecording() {
return mIsRecording;
}
private void initAudioRecord() {
int bufferSize = AudioRecord.getMinBufferSize(
RECORDING_SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT
);
mAudioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC,
RECORDING_SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize
);
if (mAudioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
mBufSize = bufferSize;
}
}
/**
* start AudioRecord.read
*/
public void startRecording() {
mTimer = new Timer();
mAudioRecord.startRecording();
mIsRecording = true;
runRecording();
}
/**
* stop AudioRecord.read
*/
public void stopRecording() {
mIsRecording = false;
mTimer.cancel();
}
private void runRecording() {
final byte buf[] = new byte[mBufSize];
mTimer.schedule(new TimerTask() {
@Override
public void run() {
// stop recording
if (!mIsRecording) {
mAudioRecord.stop();
return;
}
mAudioRecord.read(buf, 0, mBufSize);
int decibel = calculateDecibel(buf);
d = decibel;
// callback for return input value
if (mVolumeListener != null) {
mVolumeListener.onCalculateVolume(decibel);
}
}
}, 0, mSamplingInterval);
}
private int calculateDecibel(byte[] buf) {
int sum = 0;
for (int i = 0; i < mBufSize; i++) {
sum += Math.abs(buf[i]);
}
// avg 10-50
return sum / mBufSize;
}
/**
* release member object
*/
public void release() {
stopRecording();
mAudioRecord.release();
mAudioRecord = null;
mTimer = null;
}
public interface CalculateVolumeListener {
/**
* calculate input volume
*
* @param volume mic-input volume
*/
void onCalculateVolume(int volume);
}
}