package cri.sanity.util;
import java.io.IOException;
import android.media.MediaRecorder;
import android.media.MediaRecorder.*;
import android.text.format.DateFormat;
import cri.sanity.*;
public class Rec
{
public static final int DEF_SRC = AudioSource.MIC;
public static final int DEF_FMT = OutputFormat.THREE_GPP;
private static final String DEF_PREFIX = Conf.REC_PREFIX;
private static final String DEF_SUFFIX = "";
private static final String FILE_PATTERN = Conf.REC_DATE_PATTERN+Conf.REC_SEP+Conf.REC_TIME_PATTERN;
public int src, fmt;
public String prefix, suffix, fn;
private boolean started = false;
private boolean vanilla = true;
private MediaRecorder mediaRec;
//---- public api
public Rec() { setup(DEF_SRC, DEF_FMT, DEF_PREFIX, DEF_SUFFIX); }
public Rec(int src, int fmt) { setup(src , fmt , DEF_PREFIX, DEF_SUFFIX); }
public Rec(int src, int fmt, String suffix) { setup(src , fmt , DEF_PREFIX, suffix ); }
public Rec(int src, int fmt, String prefix, String suffix) { setup(src , fmt , prefix , suffix ); }
public void setup(int src, int fmt, String prefix, String suffix)
{
if(src >= 0 ) this.src = src;
if(fmt >= 0 ) this.fmt = fmt;
if(prefix != null) this.prefix = prefix;
if(suffix != null) this.suffix = suffix;
//A.logd("rec { src="+this.src+", fmt="+this.fmt+", prefix=\""+this.prefix+"\", suffix=\""+this.suffix+"\" }");
}
public final String fn() { return fn; }
public final boolean isStarted() { return started; }
public final boolean isVanilla() { return vanilla; }
// FIX: remove synchronized in start(), stop(), release()???
public final synchronized void start()
{
try {
if(started || !init()) return;
mediaRec.prepare();
mediaRec.start();
started = true;
vanilla = false;
A.audioMan().setMicrophoneMute(false); // FIX: remove???
//A.logd("rec started");
} catch(Exception e) {
A.notify(A.s(R.string.err_rec));
started = true;
stop();
//A.logd(e);
}
}
public final synchronized void stop()
{
if(!started) return;
started = false;
if(mediaRec == null) return;
try {
mediaRec.stop();
mediaRec.reset();
} catch(Exception e) {}
//A.logd("rec stopped");
}
public final synchronized void release()
{
stop();
if(mediaRec == null) return;
try { if(!vanilla) mediaRec.release(); } catch(Exception e) {}
mediaRec = null;
vanilla = true;
}
//---- private api
private boolean init()
{
A.audioMan().setMicrophoneMute(false);
System.gc();
if(mediaRec == null) mediaRec = new MediaRecorder();
mediaRec.setAudioSource(src);
mediaRec.setOutputFormat(fmt);
mediaRec.setAudioEncoder(AudioEncoder.AMR_NB);
try {
mediaRec.setOutputFile(fn = getAudioFn());
return true;
} catch(IOException e) {
fn = null;
return false;
}
}
private String getAudioFn() throws IOException
{
String fn = A.sdcardDir();
if(fn == null) {
A.notify(A.s(R.string.err_dir));
throw new IOException();
}
fn += '/' + prefix + DateFormat.format(FILE_PATTERN, A.time()) + suffix;
switch(fmt) {
case OutputFormat.THREE_GPP: fn += ".3gp"; break;
case OutputFormat.MPEG_4 : fn += ".m4a"; break;
case OutputFormat.RAW_AMR : fn += ".amr"; break;
}
return fn;
}
}