package tcpSoundCommunication;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Line2D;
import javax.swing.*;
//import javax.swing.event.*;
import javax.swing.border.*;
import java.util.Vector;
//import java.util.Enumeration;
import java.io.*;
import javax.sound.sampled.*;
import java.awt.font.*;
import java.text.*;
//connSocket类
//import java.io.*;
import java.net.*;
//import java.awt.event.*;
import javax.sound.sampled.*;
/**
* audio can be saved either as a WAVE, AU or AIFF. Or load an audio file
* for streaming playback.
*/
public class CapturePlaybackClient
extends JPanel
implements ActionListener, MyControlContext {
final int bufSize = 16384; //2048 x 8 8个双字节长 22048=10多?
ConnSocket connSocket = new ConnSocket();
FormatControls formatControls = new FormatControls();
Capture capture= new Capture();
Playback playback= new Playback();
//存放声音的对象——audioInputStream
AudioInputStream audioInputStream;
SamplingGraph samplingGraph;
JButton connB, playB, captB, pausB, loadB;
JButton auB, aiffB, waveB;
JTextField textField;
String fileName = "untitled";
String errStr;
double duration, seconds;
File file;
//
Vector lines = new Vector();
public CapturePlaybackClient() {
/**
* 关于几个容器(P1,P1右面部分P2)——panel的布局,外观
*/
setLayout(new BorderLayout());
EmptyBorder eb = new EmptyBorder(5, 5, 5, 5);
SoftBevelBorder sbb = new SoftBevelBorder(SoftBevelBorder.LOWERED);
setBorder(new EmptyBorder(5, 5, 5, 5));
JPanel p1 = new JPanel();
//P1——formatControls左面格式参数设置
p1.setLayout(new BoxLayout(p1, BoxLayout.X_AXIS));
// p1.add(formatControls);
//P2——:
JPanel p2 = new JPanel();
p2.setBorder(sbb);
p2.setLayout(new BoxLayout(p2, BoxLayout.Y_AXIS));
//buttonsPanel上方
JPanel buttonsPanel = new JPanel();
buttonsPanel.setBorder(new EmptyBorder(10, 0, 5, 0));
connB = addButton("连接", buttonsPanel, true);
playB = addButton("Play", buttonsPanel, false);
captB = addButton("Record", buttonsPanel, true);
pausB = addButton("Pause", buttonsPanel, false);
loadB = addButton("Load...", buttonsPanel, true);
p2.add(buttonsPanel);
//samplingPanel画板
JPanel samplingPanel = new JPanel(new BorderLayout());
eb = new EmptyBorder(10, 20, 20, 20);
samplingPanel.setBorder(new CompoundBorder(eb, sbb));
samplingPanel.add(samplingGraph = new SamplingGraph());
p2.add(samplingPanel);
//savePanel下方
JPanel savePanel = new JPanel();
savePanel.setLayout(new BoxLayout(savePanel, BoxLayout.Y_AXIS));
JPanel saveTFpanel = new JPanel();
saveTFpanel.add(new JLabel("File to save: "));
saveTFpanel.add(textField = new JTextField(fileName));
textField.setPreferredSize(new Dimension(140, 25));
savePanel.add(saveTFpanel);
JPanel saveBpanel = new JPanel();
auB = addButton("Save AU", saveBpanel, false);
aiffB = addButton("Save AIFF", saveBpanel, false);
waveB = addButton("Save WAVE", saveBpanel, false);
savePanel.add(saveBpanel);
p2.add(savePanel);
p1.add(p2);
add(p1);
}
public void open() {}
public void close() {
if (playback.thread != null) {
//doClick()模拟一个按钮的click动作!时间为0;
playB.doClick(0);
}
if (capture.thread != null) {
captB.doClick(0);
}
}
private JButton addButton(String name, JPanel p, boolean state) {
JButton b = new JButton(name);
b.addActionListener(this);
b.setEnabled(state);
p.add(b);
return b;
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj.equals(auB)) {
saveToFile(textField.getText().trim(), AudioFileFormat.Type.AU);
}
else if (obj.equals(aiffB)) {
saveToFile(textField.getText().trim(), AudioFileFormat.Type.AIFF);
}
else if (obj.equals(waveB)) {
saveToFile(textField.getText().trim(), AudioFileFormat.Type.WAVE);
}
else if (obj.equals(playB)) {
if (playB.getText().startsWith("Play")) {
playback.start();
samplingGraph.start();
captB.setEnabled(false);
pausB.setEnabled(true);
playB.setText("Stop");
}
else {
playback.stop();
samplingGraph.stop();
captB.setEnabled(true);
pausB.setEnabled(false);
playB.setText("Play");
}
}
else if (obj.equals(connB)) {
if (connB.getText().startsWith("连接")) {
connSocket.start();
//设置人机界面
connB.setText("断开");
loadB.setEnabled(false);
playB.setEnabled(false);
pausB.setEnabled(false);
auB.setEnabled(false);
aiffB.setEnabled(false);
waveB.setEnabled(false);
captB.setEnabled(false);
}
else {
try {
connSocket.stop();
}
catch (Exception ex1) {
}
connB.setText("连接");
}
}
else if (obj.equals(captB)) {
//kehu---lianjie
if (captB.getText().startsWith("Record")) {
file = null;
//开始一个线程 "Capture"
capture.start();
fileName = "untitled";
//开始一个线程 "SamplingGraph"
samplingGraph.start(); //call run()
//设置人机界面
loadB.setEnabled(false);
playB.setEnabled(false);
pausB.setEnabled(true);
auB.setEnabled(false);
aiffB.setEnabled(false);
waveB.setEnabled(false);
captB.setText("Stop");
}
else {
//kehu---duankai
lines.removeAllElements();
capture.stop();
samplingGraph.stop();
loadB.setEnabled(true);
playB.setEnabled(true);
pausB.setEnabled(false);
auB.setEnabled(true);
aiffB.setEnabled(true);
waveB.setEnabled(true);
captB.setText("Record");
connB.setText("连接");
}
}
else if (obj.equals(pausB)) {
if (pausB.getText().startsWith("Pause")) {
if (capture.thread != null) {
//cease I/O activity ;停止捕获
capture.line.stop();
}
else {
if (playback.thread != null) {
//cease I/O activity;停止重放
playback.line.stop();
}
}
pausB.setText("Resume");
}
else {
if (capture.thread != null) {
//engage in data I/O
capture.line.start();
}
else {
if (playback.thread != null) {
//engage in data I/O
playback.line.start();
}
}
pausB.setText("Pause");
}
}
else if (obj.equals(loadB)) {
try {
File file = new File(System.getProperty("user.dir"));
JFileChooser fc = new JFileChooser(file);
fc.setFileFilter(new javax.swing.filechooser.FileFilter() {
public boolean accept(File f) {
if (f.isDirectory()) {
return true;
}
String name = f.getName();
if (name.endsWith(".au") || name.endsWith(".wav") ||
name.endsWith(".aiff") || name.endsWith(".aif")) {
return true;
}
return false;
}
public String getDescription() {
return ".au, .wav, .aif";
}
});
if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
//true,表示要更新audioInputStream对象的format;fc就是文件选择器JFileChooser;
createAudioInputStream(fc.getSelectedFile(), true);
}
}
catch (SecurityException ex) {
// JavaSound.showInfoDialog();
ex.printStackTrace();
}
catch (Exception ex) {
ex.printStackTrace();
}
评论0