📄 captureplayback.java
字号:
package javasound;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.*;public class CapturePlayback extends JPanel implements ActionListener, ControlContext { final int bufSize = 16384; FormatControls formatControls = new FormatControls(); Capture capture = new Capture(); Playback playback = new Playback(); AudioInputStream audioInputStream; SamplingGraph samplingGraph; JButton 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 CapturePlayback() { 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.setLayout(new BoxLayout(p1, BoxLayout.X_AXIS)); p1.add(formatControls); JPanel p2 = new JPanel(); p2.setBorder(sbb); p2.setLayout(new BoxLayout(p2, BoxLayout.Y_AXIS)); JPanel buttonsPanel = new JPanel(); buttonsPanel.setBorder(new EmptyBorder(10,0,5,0)); playB = addButton("Play", buttonsPanel, false); captB = addButton("Record", buttonsPanel, true); pausB = addButton("Pause", buttonsPanel, false); loadB = addButton("Load...", buttonsPanel, true); p2.add(buttonsPanel); 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); 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) { 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(captB)) { if (captB.getText().startsWith("Record")) { file = null; capture.start(); fileName = "untitled"; samplingGraph.start(); loadB.setEnabled(false); playB.setEnabled(false); pausB.setEnabled(true); auB.setEnabled(false); aiffB.setEnabled(false); waveB.setEnabled(false); captB.setText("Stop"); } else { 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"); } } else if (obj.equals(pausB)) { if (pausB.getText().startsWith("Pause")) { if (capture.thread != null) { capture.line.stop(); } else { if (playback.thread != null) { playback.line.stop(); } } pausB.setText("Resume"); } else { if (capture.thread != null) { capture.line.start(); } else { if (playback.thread != null) { 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) { createAudioInputStream(fc.getSelectedFile(), true); } } catch (SecurityException ex) { JavaSound.showInfoDialog(); ex.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } } } public void createAudioInputStream(File file, boolean updateComponents) { if (file != null && file.isFile()) { try { this.file = file; errStr = null; audioInputStream = AudioSystem.getAudioInputStream(file); playB.setEnabled(true); fileName = file.getName(); long milliseconds = (long)((audioInputStream.getFrameLength() * 1000) / audioInputStream.getFormat().getFrameRate()); duration = milliseconds / 1000.0; auB.setEnabled(true); aiffB.setEnabled(true); waveB.setEnabled(true); if (updateComponents) { formatControls.setFormat(audioInputStream.getFormat()); samplingGraph.createWaveForm(null); } } catch (Exception ex) { reportStatus(ex.toString()); } } else { reportStatus("Audio file required."); } } public void saveToFile(String name, AudioFileFormat.Type fileType) { if (audioInputStream == null) { reportStatus("No loaded audio to save"); return; } else if (file != null) { createAudioInputStream(file, false); } try { audioInputStream.reset(); } catch (Exception e) { reportStatus("Unable to reset stream " + e); return; } File file = new File(fileName = name); try { if (AudioSystem.write(audioInputStream, fileType, file) == -1) { throw new IOException("Problems writing to file"); } } catch (Exception ex) { reportStatus(ex.toString()); } samplingGraph.repaint(); } private void reportStatus(String msg) { if ((errStr = msg) != null) { System.out.println(errStr); samplingGraph.repaint(); } } public class Playback implements Runnable { SourceDataLine line; Thread thread; public void start() { errStr = null; thread = new Thread(this); thread.setName("Playback"); thread.start(); } public void stop() { thread = null; } private void shutDown(String message) { if ((errStr = message) != null) { System.err.println(errStr); samplingGraph.repaint(); } if (thread != null) { thread = null; samplingGraph.stop(); captB.setEnabled(true); pausB.setEnabled(false); playB.setText("Play"); } } public void run() { if (file != null) { createAudioInputStream(file, false); } if (audioInputStream == null) { shutDown("No loaded audio to play back"); return; } try { audioInputStream.reset(); } catch (Exception e) { shutDown("Unable to reset the stream\n" + e); return; } AudioFormat format = formatControls.getFormat(); AudioInputStream playbackInputStream = AudioSystem.getAudioInputStream(format, audioInputStream); if (playbackInputStream == null) { shutDown("Unable to convert stream of format " + audioInputStream + " to format " + format); return; } DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); if (!AudioSystem.isLineSupported(info)) { shutDown("Line matching " + info + " not supported."); return; } try { line = (SourceDataLine) AudioSystem.getLine(info); line.open(format, bufSize); } catch (LineUnavailableException ex) { shutDown("Unable to open the line: " + ex); return; } int frameSizeInBytes = format.getFrameSize(); int bufferLengthInFrames = line.getBufferSize() / 8; int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes; byte[] data = new byte[bufferLengthInBytes]; int numBytesRead = 0; line.start(); while (thread != null) { try { if ((numBytesRead = playbackInputStream.read(data)) == -1) { break; } int numBytesRemaining = numBytesRead; while (numBytesRemaining > 0 ) { numBytesRemaining -= line.write(data, 0, numBytesRemaining); } } catch (Exception e) { shutDown("Error during playback: " + e); break; } } if (thread != null) { line.drain(); } line.stop(); line.close(); line = null; shutDown(null); } } class Capture implements Runnable { TargetDataLine line; Thread thread; public void start() { errStr = null; thread = new Thread(this); thread.setName("Capture"); thread.start(); } public void stop() { thread = null; } private void shutDown(String message) { if ((errStr = message) != null && thread != null) { thread = null; samplingGraph.stop(); loadB.setEnabled(true); playB.setEnabled(true); pausB.setEnabled(false); auB.setEnabled(true); aiffB.setEnabled(true); waveB.setEnabled(true); captB.setText("Record"); System.err.println(errStr); samplingGraph.repaint(); } } public void run() { duration = 0; audioInputStream = null; AudioFormat format = formatControls.getFormat(); DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -