import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import javax.sound.sampled.*; public class RecordAndPlay extends JFrame { private AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 8000.0F, 16, 2, 4, 8000.0F, false); private DataLine.Info info; private TargetDataLine lineIn; private SourceDataLine lineOut; private ByteArrayOutputStream out; private boolean running; private JButton recordButton = new JButton("Record"); private JButton stopButton = new JButton("Stop"); private JButton playButton = new JButton("Play"); private JButton saveButton = new JButton("Save"); private JButton loadButton = new JButton("Load"); public static void main(String args[]) { new RecordAndPlay(); } public RecordAndPlay() { super("RecordAndPlay"); setDefaultCloseOperation(EXIT_ON_CLOSE); recordButton.setEnabled(true); stopButton.setEnabled(false); playButton.setEnabled(false); saveButton.setEnabled(false); loadButton.setEnabled(true); recordButton.addActionListener(new LRecord()); stopButton.addActionListener(new LStop()); playButton.addActionListener(new LPlay()); saveButton.addActionListener(new LSave()); loadButton.addActionListener(new LLoad()); getContentPane().setLayout(new GridLayout()); getContentPane().add(recordButton); getContentPane().add(stopButton); getContentPane().add(playButton); getContentPane().add(saveButton); getContentPane().add(loadButton); pack(); show(); } private void record() { try { info = new DataLine.Info(TargetDataLine.class, format); lineIn = (TargetDataLine)AudioSystem.getLine(info); lineIn.open(format); lineIn.start(); new Recorder(); } catch (LineUnavailableException e) { System.err.println("Line unavailable: " + e); System.exit(-2); } } private void play() { try { byte[] audio = out.toByteArray(); InputStream input = new ByteArrayInputStream(audio); AudioInputStream ais = new AudioInputStream(input, format, audio.length / format.getFrameSize()); info = new DataLine.Info(SourceDataLine.class, format); lineOut = (SourceDataLine)AudioSystem.getLine(info); lineOut.open(format); lineOut.start(); new Player(ais); } catch (LineUnavailableException e) { System.err.println("Line unavailable: " + e); System.exit(-4); } } class Recorder extends Thread { int bufferSize = (int)format.getSampleRate() * format.getFrameSize(); byte buffer[] = new byte[bufferSize]; public Recorder() { start(); } public void run() { out = new ByteArrayOutputStream(); running = true; try { while (running) { int count = lineIn.read(buffer, 0, buffer.length); if (count > 0) { out.write(buffer, 0, count); } } out.close(); } catch (IOException e) { System.err.println("I/O problems: " + e); System.exit(-1); } } } class Player extends Thread { AudioInputStream ais; int bufferSize = (int)format.getSampleRate() * format.getFrameSize(); byte buffer[] = new byte[bufferSize]; public Player(AudioInputStream ais) { this.ais = ais; start(); } public void run() { try { int count; while ((count = ais.read(buffer, 0, buffer.length)) != -1) { if (count > 0) { lineOut.write(buffer, 0, count); } } lineOut.drain(); lineOut.close(); } catch (IOException e) { System.err.println("I/O problems: " + e); System.exit(-3); } } } class LRecord implements ActionListener { public void actionPerformed(ActionEvent e) { recordButton.setEnabled(false); stopButton.setEnabled(true); playButton.setEnabled(false); saveButton.setEnabled(false); loadButton.setEnabled(false); record(); } } class LStop implements ActionListener { public void actionPerformed(ActionEvent e) { recordButton.setEnabled(true); stopButton.setEnabled(false); playButton.setEnabled(true); saveButton.setEnabled(true); loadButton.setEnabled(true); running = false; } } class LPlay implements ActionListener { public void actionPerformed(ActionEvent e) { play(); } } class LSave implements ActionListener { public void actionPerformed(ActionEvent e) { try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("record_and_play")); oos.writeObject(new Storage(out)); oos.close(); } catch (IOException ioe) { System.err.println("I/O problems: " + e); } } } class LLoad implements ActionListener { public void actionPerformed(ActionEvent e) { try { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("record_and_play")); Storage storage = (Storage) ois.readObject(); ois.close(); out = new ByteArrayOutputStream(); out.write(storage.getData(), 0, storage.getData().length); } catch (Exception ioe) { System.err.println("I/O problems: " + e); } playButton.setEnabled(true); } } }