/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package webcamstudio.mixers;
import java.util.ArrayList;
/**
*
* @author patrick
*/
public class MasterMixer {
private static MasterMixer instance = null;
public static int BUFFER_SIZE = 30;
public static MasterMixer getInstance() {
if (instance==null){
instance = new MasterMixer();
}
return instance;
}
protected int frameRate = 25;
protected int width = 320;
protected int height = 240;
protected ArrayList<SinkListener> listeners = null;
private MasterFrameBuilder builder = null;
private int audioLevelLeft = 0;
private int audioLevelRight = 0;
private float avgFPS = 0;
private MasterMixer(){
listeners = new ArrayList<>();
}
/**
* @return the audioLevelLeft
*/
public int getAudioLevelLeft(){
return audioLevelLeft;
}
public void setFPS(float f) {
avgFPS=f;
}
public float getFPS(){
return avgFPS;
}
/**
* @return the audioLevelRight
*/
public int getAudioLevelRight(){
return audioLevelRight;
}
public synchronized void register(SinkListener l) {
listeners.add(l);
}
public synchronized void unregister(SinkListener l){
listeners.remove(l);
}
public void setWidth(int w){
width = w;
}
public void setHeight(int h) {
height = h;
}
public void setRate(int rate) {
frameRate = rate;
}
public int getRate() {
return frameRate;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public void start() {
builder = new MasterFrameBuilder(width,height,frameRate);
new Thread(builder).start();
}
public void stop() {
builder.stop();
}
public void setCurrentFrame(Frame f) {
setAudioLevel(f);
updateListeners(f);
}
private synchronized void updateListeners(Frame f){
for (SinkListener l : listeners){
l.newFrame(f);
}
}
protected void setAudioLevel(Frame f){
byte[] data = f.getAudioData();
if (data != null) {
audioLevelLeft = 0;
audioLevelRight = 0;
int tempValue = 0;
for (int i = 0; i < data.length; i += 4) {
tempValue = (data[i]<<8 & (data[i + 1]))/256;
if (tempValue<0){
tempValue *=-1;
}
if (getAudioLevelLeft() < tempValue) {
audioLevelLeft = tempValue;
}
tempValue = (data[i + 2]<<8 & (data[i + 3]))/256;
if (tempValue<0){
tempValue *=-1;
}
if (getAudioLevelRight() < tempValue) {
audioLevelRight = tempValue;
}
}
}
}
public interface SinkListener {
public void newFrame(Frame frame);
}
}