package jass.generators;
import jass.engine.*;
import java.util.*;
/** Level meter. Has null audio buffer so can only be attached to mixer as source
@author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class LevelMeter extends InOut {
protected float level=0; // average |a|^2
protected float dBOffset=0; // dB level reported is 10LOG(level) + dBOffset
/** Add source to Sink. Override to allow only one input.
@param s Source to add.
@return object representing Source in Sink (may be null).
*/
public Object addSource(Source s) throws SinkIsFullException {
if (sourceContainer.size() > 0) {
throw new SinkIsFullException();
} else {
sourceContainer.addElement(s);
}
return null;
}
public float getDBLevel() {
return (float)(10*Math.log((double)level)+dBOffset);
}
/** Create level meter
@param bufferSize Buffer size used for real-time rendering.
*/
public LevelMeter(int bufferSize) {
super(bufferSize);
level = 0;
dBOffset = 0;
buf = null;
}
/** Create level meter
@param decibel offset
@param bufferSize Buffer size used for real-time rendering.
*/
public LevelMeter(int bufferSize,float dBOffset) {
super(bufferSize);
level = 0;
this.dBOffset = dBOffset;
buf = null;
}
/** Compute the next buffer (none here)
*/
protected void computeBuffer() {
if (srcBuffers == null ||srcBuffers[0] == null ) {
return;
}
float[] tmpbuf = srcBuffers[0];
float tmplevel = 0;
int bufsz = getBufferSize();
for (int k = 0; k < bufsz; k++) {
tmplevel += tmpbuf[k]*tmpbuf[k];
}
tmplevel /= bufsz;
level = tmplevel;
}
}