📄 audioview.java
字号:
package sunstudio.record.au.userinterface;
import java.awt.*;
public class AudioView extends Canvas{
int len=30;
int[] wavedata=new int[len];
int ptr=-1;
int minValue=0;
int viewtype=0;//0-frq,1-wave1,2-wave2;3,frq1
int xxx=0;
String playtime="00:00:00";
boolean isfull=false;
int frqlen=10;
double[] frq=new double[frqlen];
double[] mfrq=new double[frqlen];
int[] times=new int[frqlen];
Graphics offgra=null;
Image offimg=null;
Image m=null,fff=null;
boolean requestUpdate=false;
public AudioView(Image img,Image ff){
for(int i=0;i<len;i++)wavedata[i]=36;
setBackground(Color.black);
this.m=img;
this.fff=ff;
}
public void setView(byte[] wd,String playtime){
xxx++;
if(xxx<(modifyViewtype(false)==0||modifyViewtype(false)==3?2:3))return;
xxx=0;
this.playtime=playtime;
if(modifyViewtype(false)==0||modifyViewtype(false)==3){
calcParam(wd,80);
}else{
this.minValue=(int)(Au2Wave(wd[49])+Au2Wave(wd[99])+Au2Wave(wd[159]))/3;
ptr=ptr+1;
if(ptr>=len)isfull=true;
ptr%=len;
this.wavedata[ptr]=36+(int)(getBL()*72D);
}
repaint();
}
public void setView(int[] wd,String playtime){
this.playtime=playtime;
if(modifyViewtype(false)==0||modifyViewtype(false)==3){
calcParam(wd,80);
}else{
this.minValue=(wd[49]+wd[99]+wd[159])/3;
ptr=ptr+1;
if(ptr>=len)isfull=true;
ptr%=len;
this.wavedata[ptr]=36+(int)(getBL()*72D);
}
repaint();
}
public double getBL(){
return (((double)minValue/-32768D));
}
void calcParam(int ad[],int j){
double d2=0.0D;
double d4=0.0D;
double d6=6.2831853071795862D/(double)j;
for(int l=0;l<j;l++)d2+=(double)ad[l*2]*d6;
frq[0]=Math.abs(d2/6.2831853071795862D)/2D;
updateMaxFrq(0);
for(int k=1;k<frqlen;k++){
double d3=0.0D;
double d5=0.0D;
for(int i1=0;i1<j;i1++){
double d1=(double)k*d6*(double)(i1-j/2);
double d=ad[i1*2]*d6;
d3+=d*Math.cos(d1);
d5+=d*Math.sin(d1);
}
frq[k]=Math.sqrt((d3*d3+d5*d5)*0.10132118364233778D);
updateMaxFrq(k);
}
}
static double Au2Wave(byte byte0){
byte0^=0xff;
int i=((byte0&0xf)<<3)+132;
i<<=(byte0&0x70)>>4;
if((byte0&0x80)==0)return (double)(132-i);
else return (double)(i-132);
}
void calcParam(byte ad[],int j){
double d2=0.0D;
double d4=0.0D;
double d6=6.2831853071795862D/(double)j;
for(int l=0;l<j;l++)d2+=Au2Wave(ad[l*2+1])*d6;
frq[0]=Math.abs(d2/6.2831853071795862D)/2D;
updateMaxFrq(0);
for(int k=1;k<frqlen;k++){
double d3=0.0D;
double d5=0.0D;
for(int i1=0;i1<j;i1++){
double d1=(double)k*d6*(double)(i1-j/2);
double d=Au2Wave(ad[i1*2+1])*d6;
d3+=d*Math.cos(d1);
d5+=d*Math.sin(d1);
}
frq[k]=Math.sqrt((d3*d3+d5*d5)*0.10132118364233778D);
updateMaxFrq(k);
}
}
void updateMaxFrq(int index){
frq[index]=Math.min(26000,frq[index]);
if(frq[index]>mfrq[index]){
mfrq[index]=frq[index];
times[index]=0;
}else{
times[index]++;
if(times[index]>2)mfrq[index]-=1500*(times[index]-3);
}
}
public void paint(Graphics g){
if(offimg==null){
offimg=createImage(236,72);
offgra=offimg.getGraphics();
}
if(offgra==null)return;
offgra.clearRect(0,0,236,72);
try{
if(modifyViewtype(false)==0||modifyViewtype(false)==3)drawFrq(offgra);
else drawWave(offgra);
}catch(Exception e){}
offgra.setColor(Color.yellow);
offgra.drawString(playtime,10,12);
g.drawImage(offimg,0,0,this);
}
public void drawFrq(Graphics g) throws Exception{
g.drawImage(m,0,0,this);
int w=236/frqlen;
for(int i=0;i<frqlen;i++){
int h=(int)(frq[i]*72)/28000;
int hm=(int)(mfrq[i]*72)/28000;
g.setColor(Color.black);
g.fillRect(i*w,0,10,72);//分割
g.fillRect(i*w,0,w,72-h);
if(modifyViewtype(false)==0){
g.setColor(Color.lightGray);
g.fillRect(i*w+10,69-hm,w,2);
}else g.drawImage(fff,i*w+10+1,69-hm,this);
}
g.setColor(Color.black);
g.fillRect(228,0,w,72);
}
public void drawWave(Graphics g) throws Exception{
if(modifyViewtype(false)==1){
g.setColor(Color.red);
g.drawLine(0,36,236,36);
}
g.setColor(Color.green);
int col=0;
if(ptr==len-1){
for(int i=1;i<len;i++){
_draw(g,i*236/len,wavedata[i],(i+1)*236/len,wavedata[(i+1)%len]);
}
}else{
if(ptr==0&&isfull){
for(int i=1;i<len-1;i++){
_draw(g,col*236/len,wavedata[i],(col+1)*236/len,wavedata[(i+1)%len]);
col++;
}
_draw(g,col*236/len,wavedata[0],(col+1)*236/len,wavedata[len-1]);
}else{
if(!isfull){
for(int i=ptr;i>1;i--){
_draw(g,(len-col)*236/len,wavedata[i],(len-col-1)*236/len,wavedata[i-1]);
col++;
}
return;
}
for(int i=ptr+1;i<len;i++){
_draw(g,col*236/len,wavedata[i],(col+1)*236/len,wavedata[(i+1)%len]);
col++;
}
for(int i=0;i<=ptr;i++){
_draw(g,col*236/len,wavedata[i],(col+1)*236/len,wavedata[i+1]);
col++;
}
}
}
}
public boolean mouseUp(Event evt,int x,int y){
modifyViewtype(true);
return false;
}
synchronized int modifyViewtype(boolean mod){
if(mod){
viewtype++;
viewtype%=4;
}
return viewtype;
}
void _draw(Graphics g,int x1,int y1,int x2,int y2){
if(modifyViewtype(false)==1)g.drawLine(x1,y1,x2,y2);
else g.drawLine(x1,y1,x1,72);
}
public void update(Graphics g){
paint(g);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -