Skip to content

Commit

Permalink
Renamed BiquadFilter
Browse files Browse the repository at this point in the history
  • Loading branch information
bencall committed May 10, 2011
1 parent 1a02aae commit f9596e0
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 27 deletions.
74 changes: 74 additions & 0 deletions src/BiquadFilter.java
@@ -0,0 +1,74 @@
/**
* Implementation of the biquad filter. Not sure it is correct
* @author bencall
*
*/
public class BiquadFilter {
double bf_playback_rate = 1.0;
double bf_est_drift = 0.0; // local clock is slower by
biquad_t bf_drift_lpf;
double bf_est_err = 0.0, bf_last_err;
biquad_t bf_err_lpf, bf_err_deriv_lpf;
double desired_fill;
int fill_count;
int sampling_rate;
int frame_size;

private static final double CONTROL_A = (1e-4);
private static final double CONTROL_B = (1e-1);

public BiquadFilter(int sampling_rate, int frame_size){
this.sampling_rate = sampling_rate;
this.frame_size = frame_size;
bf_drift_lpf = biquad_lpf(1.0/180.0, 0.3);
bf_err_lpf = biquad_lpf(1.0/10.0, 0.25);
bf_err_deriv_lpf = biquad_lpf(1.0/2.0, 0.2);
fill_count = 0;
bf_playback_rate = 1.0;
bf_est_err = 0;
bf_last_err = 0;
desired_fill = 0;
fill_count = 0;
}

private biquad_t biquad_lpf(double freq, double Q) {
biquad_t ret = new biquad_t();

double w0 = 2*Math.PI*freq/((float)sampling_rate/(float)frame_size);
double alpha = Math.sin(w0)/(2.0*Q);

double a_0 = 1.0 + alpha;
ret.b[0] = (1.0-Math.cos(w0))/(2.0*a_0);
ret.b[1] = (1.0-Math.cos(w0))/a_0;
ret.b[2] = ret.b[0];
ret.a[0] = -2.0*Math.cos(w0)/a_0;
ret.a[1] = (1-alpha)/a_0;

return ret;
}

public void update(int fill){
if (fill_count < 1000) {
desired_fill += (double)fill/1000.0;
fill_count++;
return;
}

double buf_delta = fill - desired_fill;
bf_est_err = filter(bf_err_lpf, buf_delta);
double err_deriv = filter(bf_err_deriv_lpf, bf_est_err - bf_last_err);

bf_est_drift = filter(bf_drift_lpf, CONTROL_B*(bf_est_err*CONTROL_A + err_deriv) + bf_est_drift);

bf_playback_rate = 1.0 + CONTROL_A*bf_est_err + bf_est_drift;
bf_last_err = bf_est_err;
}

private double filter(biquad_t bq, double in) {
double w = in - bq.a[0]*bq.hist[0] - bq.a[1]*bq.hist[1];
// double out = bq.b[1]*bq.hist[0] + bq.b[2]*bq.hist[1] + bq.b[0]*w;
bq.hist[1] = bq.hist[0];
bq.hist[0] = w;
return w;
}
}
3 changes: 2 additions & 1 deletion src/LaunchThread.java
Expand Up @@ -27,7 +27,7 @@ public LaunchThread(String name){


public void run(){ public void run(){
int port = 5000; int port = 5000;
byte[] hwAddr = null;; byte[] hwAddr = null;


InetAddress local; InetAddress local;
try { try {
Expand All @@ -41,6 +41,7 @@ public void run(){
} catch (SocketException e) { } catch (SocketException e) {
e.printStackTrace(); e.printStackTrace();
} }

StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (byte b : hwAddr) { for (byte b : hwAddr) {
sb.append(String.format("%02x", b)); sb.append(String.format("%02x", b));
Expand Down
52 changes: 26 additions & 26 deletions src/RTSPResponder.java
Expand Up @@ -27,15 +27,15 @@
* *
*/ */
public class RTSPResponder extends Thread{ public class RTSPResponder extends Thread{

private ServerSocket sock; // Initial socket private ServerSocket sock; // Initial socket
private Socket socket; // Connected socket private Socket socket; // Connected socket
private int[] fmtp; private int[] fmtp;
private byte[] aesiv, aeskey; // ANNOUNCE request infos private byte[] aesiv, aeskey; // ANNOUNCE request infos
private AudioServer serv; // Audio listener private AudioServer serv; // Audio listener
byte[] hwAddr; byte[] hwAddr;
boolean stopThread = false; boolean stopThread = false;

private String key = private String key =
"-----BEGIN RSA PRIVATE KEY-----\n" "-----BEGIN RSA PRIVATE KEY-----\n"
+"MIIEpQIBAAKCAQEA59dE8qLieItsH1WgjrcFRKj6eUWqi+bGLOX1HL3U3GhC/j0Qg90u3sG/1CUt\n" +"MIIEpQIBAAKCAQEA59dE8qLieItsH1WgjrcFRKj6eUWqi+bGLOX1HL3U3GhC/j0Qg90u3sG/1CUt\n"
Expand Down Expand Up @@ -68,34 +68,34 @@ public class RTSPResponder extends Thread{
*/ */
public RTSPResponder(int port, byte[] hwAddr) throws IOException{ public RTSPResponder(int port, byte[] hwAddr) throws IOException{
this.hwAddr = hwAddr; this.hwAddr = hwAddr;

// Try to take the given port. If not possible, take another. If not possible: ERROR // Try to take the given port. If not possible, take another. If not possible: ERROR
try { try {
sock = new ServerSocket(5000); sock = new ServerSocket(5000);
} catch (IOException e) { } catch (IOException e) {
sock = new ServerSocket(); sock = new ServerSocket();
} }
} }


public void stopThread() throws IOException{ public void stopThread() throws IOException{
stopThread = true; stopThread = true;
if(serv != null){ if(serv != null){
serv.stop(); serv.stop();
} }
sock.close(); sock.close();
} }


/** /**
* @return port number * @return port number
*/ */
public int getPort(){ public int getPort(){
return sock.getLocalPort(); return sock.getLocalPort();
} }

public void handlePacket(RTSPPacket packet){ public void handlePacket(RTSPPacket packet){

// We init the response holder // We init the response holder
StringBuilder response = new StringBuilder("RTSP/1.0 200 OK\r\n"); StringBuilder response = new StringBuilder("RTSP/1.0 200 OK\r\n");
response.append("Audio-Jack-Status: connected; type=analog\r\n"); response.append("Audio-Jack-Status: connected; type=analog\r\n");
Expand All @@ -121,13 +121,13 @@ public void handlePacket(RTSPPacket packet){
out.write(ip); out.write(ip);
// HW-Addr // HW-Addr
out.write(hwAddr); out.write(hwAddr);

// Pad to 32 Bytes // Pad to 32 Bytes
int padLen = 32 - out.size(); int padLen = 32 - out.size();
for(int i = 0; i < padLen; ++i) { for(int i = 0; i < padLen; ++i) {
out.write(0x00); out.write(0x00);
} }

} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
Expand Down Expand Up @@ -200,7 +200,7 @@ public void handlePacket(RTSPPacket packet){


// Launching audioserver // Launching audioserver
serv = new AudioServer(new AudioSession(aesiv, aeskey, fmtp, controlPort, timingPort)); serv = new AudioServer(new AudioSession(aesiv, aeskey, fmtp, controlPort, timingPort));

response.append("Transport: " + packet.valueOfHeader("Transport") + ";server_port=" + serv.getServerPort() + "\r\n"); response.append("Transport: " + packet.valueOfHeader("Transport") + ";server_port=" + serv.getServerPort() + "\r\n");


// ??? Why ??? // ??? Why ???
Expand Down Expand Up @@ -237,7 +237,7 @@ public void handlePacket(RTSPPacket packet){


System.out.println(packet.getRawPacket()); System.out.println(packet.getRawPacket());
System.out.println(response.toString()); System.out.println(response.toString());

// Write the packet to the wire // Write the packet to the wire
BufferedWriter oStream; BufferedWriter oStream;
try { try {
Expand Down Expand Up @@ -270,7 +270,7 @@ public byte[] encryptRSA(byte[] array){


PEMReader pemReader = new PEMReader(new StringReader(key)); PEMReader pemReader = new PEMReader(new StringReader(key));
KeyPair pObj = (KeyPair) pemReader.readObject(); KeyPair pObj = (KeyPair) pemReader.readObject();

// Encrypt // Encrypt
Cipher cipher = Cipher.getInstance("RSA/NONE/PKCS1Padding"); Cipher cipher = Cipher.getInstance("RSA/NONE/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pObj.getPrivate()); cipher.init(Cipher.ENCRYPT_MODE, pObj.getPrivate());
Expand All @@ -279,10 +279,10 @@ public byte[] encryptRSA(byte[] array){
}catch(Exception e){ }catch(Exception e){
e.printStackTrace(); e.printStackTrace();
} }

return null; return null;
} }

/** /**
* Decrypt with RSA priv key * Decrypt with RSA priv key
* @param array * @param array
Expand All @@ -292,10 +292,10 @@ public byte[] decryptRSA(byte[] array){
try{ try{
Security.addProvider(new BouncyCastleProvider()); Security.addProvider(new BouncyCastleProvider());


// La clŽ RSA // La cl RSA
PEMReader pemReader = new PEMReader(new StringReader(key)); PEMReader pemReader = new PEMReader(new StringReader(key));
KeyPair pObj = (KeyPair) pemReader.readObject(); KeyPair pObj = (KeyPair) pemReader.readObject();

// Encrypt // Encrypt
Cipher cipher = Cipher.getInstance("RSA/NONE/OAEPPadding"); Cipher cipher = Cipher.getInstance("RSA/NONE/OAEPPadding");
cipher.init(Cipher.DECRYPT_MODE, pObj.getPrivate()); cipher.init(Cipher.DECRYPT_MODE, pObj.getPrivate());
Expand All @@ -304,34 +304,34 @@ public byte[] decryptRSA(byte[] array){
}catch(Exception e){ }catch(Exception e){
e.printStackTrace(); e.printStackTrace();
} }

return null; return null;
} }

/** /**
* Thread to listen packets * Thread to listen packets
*/ */
public void run() { public void run() {
boolean fin = stopThread; boolean fin = stopThread;
try { try {

// Socket & Streams // Socket & Streams
// Socket init // Socket init
if(socket == null && !stopThread){ if(socket == null && !stopThread){
socket = sock.accept(); socket = sock.accept();
} }

if(socket != null){ if(socket != null){
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String packet = ""; String packet = "";
while(!fin){ while(!fin){
// Buffer // Buffer
char[] buffer = new char[4096]; char[] buffer = new char[4096];
in.read(buffer); in.read(buffer);
String temp = new String(buffer); String temp = new String(buffer);
packet = packet + temp; packet = packet + temp;

// If packet completed // If packet completed
Pattern p = Pattern.compile("(.*)\r\n\r\n"); Pattern p = Pattern.compile("(.*)\r\n\r\n");
Matcher m = p.matcher(packet); Matcher m = p.matcher(packet);
Expand All @@ -343,7 +343,7 @@ public void run() {
packet = ""; packet = "";
break; break;
} }

synchronized(this){ synchronized(this){
fin = stopThread; fin = stopThread;
} }
Expand All @@ -355,4 +355,4 @@ public void run() {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }

0 comments on commit f9596e0

Please sign in to comment.