package com.integreight.onesheeld.shields.controller.utils;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Environment;
import com.integreight.onesheeld.utils.Log;
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class MicSoundMeter {
// static final private double EMA_FILTER = 0.6;
static final private double POWER_REFERENCE = 0.00002;
private static MicSoundMeter thisInstance;
boolean isCanceled = false;
boolean isRecording = false;
boolean initialStart = true;
private MediaRecorder mRecorder = null;
private double mEMA = 0.0;
private File folder = null;
private MicSoundMeter() {
// TODO Auto-generated constructor stub
}
public static MicSoundMeter getInstance() {
if (thisInstance == null)
thisInstance = new MicSoundMeter();
return thisInstance;
}
public boolean start(boolean record) {
return start(record, null);
}
public boolean start(boolean record, String fileName) {
if (isCanceled | initialStart) {
initialStart = false;
isCanceled = false;
isRecording = false;
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
mRecorder.setAudioEncodingBitRate(128);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD_MR1)
mRecorder.setAudioSamplingRate(44100);
else
mRecorder.setAudioSamplingRate(8000);
if (record) {
File folder = new File(
Environment.getExternalStorageDirectory()
+ "/OneSheeld");
if (!folder.exists()) {
folder.mkdirs();
}
folder = new File(
Environment.getExternalStorageDirectory()
+ "/OneSheeld/Mic");
if (!folder.exists()) {
folder.mkdirs();
}
mRecorder.setOutputFile(Environment
.getExternalStorageDirectory()
+ "/OneSheeld/Mic/" + ((fileName != null) ? (fileName): ("Mic_" + String.valueOf(new Date().getTime()))) + ".mp3/");
} else
mRecorder.setOutputFile("/dev/null");
try {
isRecording = true;
mRecorder.prepare();
mRecorder.start();
mEMA = 0.0;
return true;
} catch (IllegalStateException e) {
return false;
} catch (IOException e) {
return false;
}
} else {
Log.d("Mic", "Not Started");
return false;
}
}
public void stop() {
if (mRecorder != null) {
if (isRecording) {
isRecording = false;
isCanceled = true;
try {
mRecorder.stop();
mRecorder.reset();
mRecorder.release();
} catch (Exception e) {
Log.e("TAG", "stop MRecorder::Mic", e);
}
mRecorder = null;
}
}
}
public double getAmplitude() {
if (mRecorder != null) {
double maxAmp = 0;
try {
maxAmp = mRecorder.getMaxAmplitude();
} catch (Exception e) {
}
return maxAmp;
} else
return 0;
}
// db= 20* log10(amplitude/baseline_amplitude);
public double getAmplitudeEMA() {
double amp = getAmplitude();
if (amp == 0)
return 0;
mEMA = (20.0 * Math.log10(amp / POWER_REFERENCE));
return (mEMA - 100.0);
}
}