/*
Records a line to a WAV file.
*/
import java.io.*;
import java.util.*;
import javaforce.*;
import javaforce.media.*;
public class Record extends Thread {
private RandomAccessFile raf;
private int length;
private byte buf8[] = new byte[882 * 2];
private static final int rate = 44100;
private AudioBuffer buffer = new AudioBuffer(44100, 1, 2);
private boolean active, done;
private Object lock = new Object();
public void open() {
try {
length = 0;
Calendar cal = Calendar.getInstance();
String fn = String.format("%s/%d-%02d-%02d %02d-%02d-%02d.wav"
, Settings.current.downloadPath
, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH)
, cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
raf = new RandomAccessFile(fn, "rw");
writeHeader();
active = true;
start();
} catch (Exception e) {
JFLog.log(e);
}
}
private void writeHeader() {
byte header[] = new byte[44];
header[0 + 0] = 'R';
header[0 + 1] = 'I';
header[0 + 2] = 'F';
header[0 + 3] = 'F';
LE.setuint32(header, 4, 36 + length*2);
header[8 + 0] = 'W';
header[8 + 1] = 'A';
header[8 + 2] = 'V';
header[8 + 3] = 'E';
header[12 + 0] = 'f';
header[12 + 1] = 'm';
header[12 + 2] = 't';
header[12 + 3] = ' ';
LE.setuint32(header, 16, 16); //chunk size
LE.setuint16(header, 20, 1); //1=PCM
LE.setuint16(header, 22, 1); //1=mono
LE.setuint32(header, 24, rate); //freq
LE.setuint32(header, 28, rate * 2); //byte rate
LE.setuint16(header, 32, 2); //block align
LE.setuint16(header, 34, 16); //bits/sample
header[36 + 0] = 'd';
header[36 + 1] = 'a';
header[36 + 2] = 't';
header[36 + 3] = 'a';
LE.setuint32(header, 40, length*2); //data size
try {
raf.seek(0);
raf.write(header);
} catch (Exception e) {
JFLog.log(e);
}
}
public void add(short buf[]) {
buffer.add(buf, 0, buf.length);
synchronized(lock) {
lock.notify();
}
}
private void write(short buf[]) {
LE.shortArray2byteArray(buf, buf8);
try {raf.write(buf8);} catch (Exception e) {JFLog.log(e);}
length += buf.length;
if (length > (12 * 60 * 60 * rate)) { //12 hrs
close();
open();
}
}
public void close() {
if (raf == null) return;
active = false;
while (!done) {
synchronized(lock) {
lock.notify();
}
JF.sleep(10);
}
//patch header (length)
writeHeader();
try {
raf.close();
} catch (Exception e) {
JFLog.log(e);
}
raf = null;
}
public void run() {
short buf[] = new short[882];
while (active) {
synchronized(lock) {
if (buffer.size() < 882) {
try { lock.wait(); } catch (Exception e) {}
}
if (buffer.size() < 882) continue;
}
buffer.get(buf, 0, 882);
write(buf);
}
done = true;
}
}