📄 audiopanel.java
字号:
package sunstudio.record.au.userinterface;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import sunstudio.util.*;
import sunstudio.file.*;
import sunstudio.codec.au.*;
import sunstudio.record.au.audio.play.*;
import sunstudio.record.au.audio.capture.*;
import sunstudio.record.au.audio.*;
import sunstudio.mediaload.*;
import sunstudio.userinterface.button.*;
import sunstudio.userinterface.*;
public class AudioPanel extends Panel implements MouseListener,MouseMotionListener,ImgBtnListener,AudioDataListener,ParameterSet,AudioPlayListener{
int AUDIO_NOSIGNAL=0; //没有信号
int AUDIO_PLAYING=1; //播放模式
int AUDIO_RECORD=2; //录音模式
int AUDIO_PLAY_PAUSE=3; //放音暂停模式
int AUDIO_RECORD_PAUSE=4; //录音暂停模式
Image bgimg,block; //背景图片和播放位置块
ImgBtn btnPlay,btnPause,btnRecord,btnStop,btnUpload; //控制按钮
AudioView audioview=null; //音频波形显示
AudioPlayer player=null; //CTF格式音频播放器
AudioCapture capture=null; //音频采集器
MediaLoader ml=null; //媒体装载器
int workMode=0; //工作模式
BufferedOutputStream fos=null; //文件写缓冲流
BufferedInputStream fis=null; //文件读缓冲流
InputStream playstream=null; //播放数据流
AuReader rr=new AuReader(); //CTF文件解析器
AuWriter ww=new AuWriter(); //CTF文件生成器
byte[] audiodata=new byte[800]; //录音数据显示
int r_microsec=0; //录音毫秒数
int r_bCount=0; //录音写入字节数
int p_microsec=0; //放音总毫秒数
int p_curtime=0; //当前播放毫秒数
String filename=System.getProperty("com.ms.windir")+System.getProperty("file.separator")+"temp"+System.getProperty("file.separator")+"1.tmp";
String filename1=System.getProperty("com.ms.windir")+System.getProperty("file.separator")+"temp"+System.getProperty("file.separator")+"1.au";
boolean draging=false;
boolean hasRecord=false;
UploadComponent uploader=new UploadComponent();
ClockModel clock=new ClockModel();
public AudioPanel(MediaLoader ml1){
setLayout(null);
this.ml=ml1;
addMouseListener(this);
addMouseMotionListener(this);
capture=new AudioCapture();
capture.addAudioDataListener(this);
if(!capture.open())System.out.println("没有声卡或声卡正在占用!");
player=new AudioPlayer();
player.addAudioPlayListener(this);
bgimg=ml.loadImage("bgimg.gif");
block=ml.loadImage("block.gif");
audioview=new AudioView(ml.loadWaveFormImage(),ml.loadImage("flag.gif"));
audioview.setBounds(viewRect.x,viewRect.y,viewRect.width,viewRect.height);
add(audioview);
btnPlay=new ImgBtn(ml.loadImage("2b.gif"),ml.loadImage("2c.gif"),ml.loadImage("2a.gif"),ml.loadImage("2d.gif"));
btnPlay.setLocation(playRect.x-29,playRect.y);
add(btnPlay);
btnPause=new ImgBtn(ml.loadImage("3b.gif"),ml.loadImage("3c.gif"),ml.loadImage("3a.gif"),ml.loadImage("3d.gif"));
btnPause.setLocation(pauseRect.x-25,pauseRect.y);
add(btnPause);
btnRecord=new ImgBtn(ml.loadImage("4b.gif"),ml.loadImage("4c.gif"),ml.loadImage("4a.gif"),ml.loadImage("4d.gif"));
btnRecord.setLocation(recordRect.x-21,recordRect.y);
add(btnRecord);
btnStop=new ImgBtn(ml.loadImage("6b.gif"),ml.loadImage("6c.gif"),ml.loadImage("6a.gif"),ml.loadImage("6d.gif"));
btnStop.setLocation(stopRect.x-17,stopRect.y);
add(btnStop);
btnUpload=new ImgBtn(ml.loadImage("7b.gif"),ml.loadImage("7c.gif"),ml.loadImage("7a.gif"),ml.loadImage("7d.gif"));
btnUpload.setLocation(uploadRect.x-13,uploadRect.y);
add(btnUpload);
btnStop.setEnabled(false);
btnPause.setEnabled(false);
btnUpload.setEnabled(false);
btnRecord.addImgBtnListener(this);
btnPlay.addImgBtnListener(this);
btnPause.addImgBtnListener(this);
btnStop.addImgBtnListener(this);
btnUpload.addImgBtnListener(this);
}
public void paint(Graphics g){
g.drawImage(bgimg,0,0,this);
g.drawImage(block,pb.x,blockRect.y,this);
}
public void update(Graphics g){paint(g);}
void resetRecordParameter(){
r_bCount=0;
r_microsec=0;
clock.clear();
ww.writeBegin("阳光工作室(SunStudio)制作");
}
public void close(){
try{
capture.close();
System.out.println("声音俘获正常关闭");
}catch(Exception e){e.printStackTrace();}
try{
player.stop_play();
player.close();
System.out.println("声音播放正常关闭");
}catch(Exception e){}
}
void resetPlayParameter(){
p_curtime=0;
p_microsec=0;
clock.clear();
}
boolean isPlaying(){
return workMode==AUDIO_PLAYING;
}
boolean isRecording(){
return workMode==AUDIO_RECORD;
}
boolean isPlayPause(){
return workMode==AUDIO_PLAY_PAUSE;
}
boolean isRecordPause(){
return workMode==AUDIO_RECORD_PAUSE;
}
boolean isNoSignal(){
return workMode==AUDIO_NOSIGNAL;
}
public void actionPerformed(ImgBtnEvent evt){
if(evt.getSource().equals(btnRecord)){
if(isNoSignal()){
try{
if(fos!=null){
fos.close();
fos=null;
}
fos=new BufferedOutputStream(new FileOutputStream(filename));
resetRecordParameter();
capture.start_record();
workMode=AUDIO_RECORD;
btnRecord.setEnabled(false);
btnStop.setEnabled(true);
btnPause.setEnabled(true);
btnPlay.setEnabled(false);
btnUpload.setEnabled(false);
}catch(Exception e){e.printStackTrace();}
}
}else if(evt.getSource().equals(btnPlay)){
if(isNoSignal()){
try{
try{
if(fis!=null){
fis.close();
fis=null;
}
}catch(Exception e){e.printStackTrace();}
try{
if(playstream!=null)playstream=null;
fis=new BufferedInputStream(new FileInputStream(filename1));
rr.readHeader(fis);
rr.outputHeaderInfoTo(System.out);
resetPlayParameter();
p_microsec=rr.getMicroSeconds();
playstream=fis;
}catch(Exception e){e.printStackTrace();}
player.start_play(playstream);
workMode=AUDIO_PLAYING;
btnPlay.setEnabled(false);
btnRecord.setEnabled(false);
btnStop.setEnabled(true);
btnPause.setEnabled(true);
btnUpload.setEnabled(false);
}catch(Exception e){e.printStackTrace();}
}
}else if(evt.getSource().equals(btnPause)){
if(isPlaying()){
player.suspend_play();
this.workMode=this.AUDIO_PLAY_PAUSE;
return;
}
if(isPlayPause()){
player.resume_play();
this.workMode=this.AUDIO_PLAYING;
return;
}
if(isRecording()){
capture.suspend_record();
workMode=AUDIO_RECORD_PAUSE;
return;
}
if(isRecordPause()){
capture.resume_record();
workMode=AUDIO_RECORD;
return;
}
}else if(evt.getSource().equals(btnStop)){
if(isRecording()||isRecordPause()){
capture.stop_record();
try{
ww.writeOver();
fos.close();
fos=null;
}catch(Exception e){}
try{
FileOutputStream writer=new FileOutputStream(filename1);
FileInputStream reader=new FileInputStream(filename);
ww.writeHeaderTo(writer);
byte[] content=new byte[reader.available()];
reader.read(content);
writer.write(content);
writer.close();
reader.close();
hasRecord=true;
}catch(Exception e){}
}else if(isPlaying()||isPlayPause()){
player.stop_play();
try{
fis.close();
fis=null;
}catch(Exception e){}
}
workMode=AUDIO_NOSIGNAL;
btnPlay.setEnabled(true);
btnRecord.setEnabled(true);
btnPause.setEnabled(false);
btnStop.setEnabled(false);
if(hasRecord)btnUpload.setEnabled(true);
}else if(evt.getSource().equals(btnUpload)){
/* if(hasRecord&&isNoSignal()){
try{
if(fis!=null){
fis.close();
fis=null;
}
fis=new BufferedInputStream(new FileInputStream(filename1));
//上传语音文件
uploader.upload2Page(fis,fis.available(),"mis1",80,ml.getParameter("uploadto"));
}catch(Exception e){e.printStackTrace();}
}*/
}
}
public void onBtnMouseEnter(ImgBtnEvent evt){}
public void onBtnMouseExit(ImgBtnEvent evt){}
public void onAudioPlayEvent(AudioPlayEvent evt){
try{
if(evt.isPlayOver()){
btnRecord.setEnabled(true);
btnPlay.setEnabled(true);
btnPause.setEnabled(false);
btnStop.setEnabled(false);
player.stop_play();
if(hasRecord)btnUpload.setEnabled(true);
workMode=AUDIO_NOSIGNAL;
}else if(evt.isPlayData()){ //波形显示
p_curtime+=50;
clock.addMicroSeconds(50);
if(p_curtime%200==0){
if(!draging){
int x=Math.min(Math.max(0,(int)(((double)p_curtime/(double)p_microsec)*190D)),228-blockRect.x);
pb.move(blockRect.x+x,pb.y);
repaint();
}
}
audioview.setView(evt.getWaveData(),"当前播放:["+clock.getTime()+"]");
}else if(evt.isPlayErr()){
btnRecord.setEnabled(true);
btnPlay.setEnabled(true);
btnPause.setEnabled(false);
btnStop.setEnabled(false);
workMode=AUDIO_NOSIGNAL;
player.stop_play();
System.out.println("occur an error when playing!");
}
}catch(Exception e){}
}
public void onAudioDataArrived(AudioDataEvent evt){
try{
if(isNoSignal())return;
int min=evt.getAudioMinValue();
r_microsec+=100;
clock.addMicroSeconds(100);
if(min!=0){
AuEncoder.encode(evt.getAudioData(),audiodata);
//System.out.println("src length="+audiodata.length+",after compress="+Compress.compress(audiodata).length);
fos.write(audiodata);
ww.addSample();
audioview.setView(audiodata,"当前录制:["+clock.getTime()+"]");
}audioview.setView(audiodata,"当前录制:["+clock.getTime()+"]");
}catch(Exception e){e.printStackTrace();}
}
public void mouseClicked(MouseEvent e){}
public void mousePressed(MouseEvent e){
if(!isPlaying())return;
if(pb.contains(e.getX(),e.getY()))draging=true;
else if(track.contains(e.getX(),e.getY())){
int x=Math.min(Math.max(blockRect.x,e.getX()),228);
pb.move(x,pb.y);
repaint();
}
}
void GotoPlay(int goid){
int microid=goid;
microid=(int)Math.floor((double)goid/50D)*50;
player.stop_play();
try{
fis.close();
fis=null;
}catch(Exception e){}
try{
try{
if(playstream!=null)playstream=null;
fis=new BufferedInputStream(new FileInputStream(filename1));
rr.readHeader(fis);
resetPlayParameter();
this.p_curtime=microid;
this.p_microsec=rr.getMicroSeconds();
clock.addMicroSeconds(p_curtime);
fis.skip(microid*8);
playstream=fis;
}catch(Exception e){e.printStackTrace();}
player.start_play(playstream);
workMode=AUDIO_PLAYING;
}catch(Exception e){e.printStackTrace();}
}
public void mouseReleased(MouseEvent e){
draging=false;
if(track.contains(e.getX(),e.getY())&&isPlaying()){
btnStop.setEnabled(false);
btnPause.setEnabled(false);
int x=Math.min(Math.max(blockRect.x,e.getX()),228);
pb.move(x,pb.y);
repaint();
btnStop.setEnabled(true);
btnPause.setEnabled(true);
GotoPlay((int)((double)p_microsec*((double)(x-blockRect.x)/190D)));
}
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseMoved(MouseEvent e){}
public void mouseDragged(MouseEvent e){
if(draging){
pb.move(Math.min(Math.max(blockRect.x,e.getX()),228),pb.y);
repaint();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -