102 lines
3.0 KiB
Java
102 lines
3.0 KiB
Java
package protect.babymonitor;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Color;
|
|
import android.graphics.Paint;
|
|
import android.support.annotation.Nullable;
|
|
import android.util.AttributeSet;
|
|
import android.util.Log;
|
|
import android.view.View;
|
|
|
|
import java.util.LinkedList;
|
|
|
|
public class VolumeView extends View {
|
|
private static final int MAX_HISTORY = 10_000;
|
|
private double volume;
|
|
private double maxVolume;
|
|
private Paint paint;
|
|
private LinkedList<Double> volumeHistory;
|
|
|
|
public VolumeView(Context context) {
|
|
super(context);
|
|
init();
|
|
}
|
|
|
|
public VolumeView(Context context, @Nullable AttributeSet attrs) {
|
|
super(context, attrs);
|
|
init();
|
|
}
|
|
|
|
public VolumeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
|
|
super(context, attrs, defStyleAttr);
|
|
init();
|
|
}
|
|
|
|
private void init() {
|
|
volume = 0;
|
|
maxVolume = 0.25;
|
|
paint = new Paint();
|
|
volumeHistory = new LinkedList<>();
|
|
paint.setColor(Color.rgb(255, 127, 0));
|
|
}
|
|
|
|
public void onAudioData(byte[] data) {
|
|
double sum = 0;
|
|
for (int i = 0; i < data.length; i++) {
|
|
double rel = data[i] / ((double)128);
|
|
sum += Math.pow(rel, 2);
|
|
}
|
|
volume = sum / data.length;
|
|
if (volume > maxVolume) {
|
|
maxVolume = volume;
|
|
}
|
|
volumeHistory.addLast(volume);
|
|
while (volumeHistory.size() > MAX_HISTORY) {
|
|
volumeHistory.removeFirst();
|
|
}
|
|
invalidate();
|
|
}
|
|
|
|
@Override
|
|
protected void onDraw(Canvas canvas) {
|
|
int height = canvas.getHeight();
|
|
int width = canvas.getWidth();
|
|
double relativeBrightness = 0;
|
|
double normalizedVolume = volume / maxVolume;
|
|
relativeBrightness = Math.max(0.3, normalizedVolume);
|
|
int blue;
|
|
int rest;
|
|
if (relativeBrightness > 0.5) {
|
|
blue = 255;
|
|
rest = (int) (2 * 255 * (relativeBrightness - 0.5));
|
|
} else {
|
|
blue = (int) (255 * (relativeBrightness - 0.2) / 0.3);
|
|
rest = 0;
|
|
}
|
|
int rgb = Color.rgb(rest, rest, blue);
|
|
canvas.drawColor(rgb);
|
|
double margins = height * 0.1;
|
|
double graphHeight = height - 2*margins;
|
|
int leftMost = Math.max(0, volumeHistory.size() - width);
|
|
int yPrev = (int) (graphHeight - margins);
|
|
for (int i = leftMost; i < volumeHistory.size() && i - leftMost < width; i++) {
|
|
int xNext = i - leftMost;
|
|
int yNext = (int) (margins + graphHeight - volumeHistory.get(i) / maxVolume * (graphHeight));
|
|
int xPrev;
|
|
if (i == leftMost) {
|
|
xPrev = xNext;
|
|
} else {
|
|
xPrev = xNext - 1;
|
|
}
|
|
if (i == leftMost && i > 0){
|
|
yPrev = (int) (margins + graphHeight - volumeHistory.get(i-1) / maxVolume * (graphHeight));
|
|
}
|
|
canvas.drawLine(xPrev, yPrev, xNext, yNext, paint);
|
|
yPrev = yNext;
|
|
|
|
}
|
|
|
|
}
|
|
}
|