import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.SourceDataLine; import javax.swing.JFileChooser; import javax.swing.JMenu; import javax.swing.JFrame; import javax.swing.JButton; import javax.swing.JOptionPane; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.AbstractAction; import javax.swing.JMenuBar; public class JAudioP extends JFrame implements ActionListener, Runnable { private Thread thd = null; private JButton jb = null; private JButton jbbrw = null; private String nameBrw = null; public static void main(String[] args) { JAudioP jframe = new JAudioP(); jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jframe.setVisible(true); jframe.setResizable(false); } //инициализация интерфейса программы JAudioP() { setTitle("Проигрыватель аудио (wav, au, aiff)"); setSize(600, 300); GridLayout gl = new GridLayout(2, 1); setLayout(gl); JMenu fileMenu = new JMenu("Файл"); JMenu aboutMenu = new JMenu("Информация"); fileMenu.add(new AbstractAction("Выход (Alt + F4)") { @Override public void actionPerformed(ActionEvent event) { System.exit(0); } }); aboutMenu.add(new AbstractAction("Об Авторе") { @Override public void actionPerformed(ActionEvent event) { JOptionPane .showConfirmDialog( null, "Евгений Осипов, 2012 год. \n" + "osipoveg1990@gmail.com, www.fastandclever.ru", "Об Авторе", JOptionPane.PLAIN_MESSAGE, JOptionPane.PLAIN_MESSAGE); } }); jb = new JButton("Play |>"); jb.addActionListener(this); jbbrw = new JButton("Выбрать файл"); jbbrw.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); int returnVal = chooser.showOpenDialog(chooser); if (returnVal == JFileChooser.APPROVE_OPTION) { nameBrw = chooser.getSelectedFile().getPath(); jbbrw.setText(nameBrw); } } }); JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); menuBar.add(fileMenu); menuBar.add(aboutMenu); add(jb); add(jbbrw); } //слушатель событий кнопки jb @Override public void actionPerformed(ActionEvent e) { thd = new Thread(this); thd.start(); } //запуск отдельного потока @Override public void run() { try{ soundPlay(nameBrw); }catch(NullPointerException e){ JOptionPane .showConfirmDialog( null, "Нужно выбрать wav, au или aiff", "Ошибка", JOptionPane.PLAIN_MESSAGE, JOptionPane.PLAIN_MESSAGE); jb.setEnabled(true); } } public void soundPlay(String file) { jb.setEnabled(false); SourceDataLine sdline = null; AudioInputStream audioInpStr = null; byte[] b = new byte[1024]; //буфер данных try { File f = new File(file); //входной поток байтов из файла f audioInpStr = AudioSystem.getAudioInputStream(f); //извлечение из потока информацию о способе записи звука AudioFormat af = audioInpStr.getFormat(); //информация записыватся в объект info DataLine.Info info = new DataLine.Info(SourceDataLine.class, af); //проверка, приемлем ли такой способ записи звука if (!AudioSystem.isLineSupported(info)) { System.err.println("Линия не поддерживается"); System.exit(0); } //входная линия sdline = (SourceDataLine) AudioSystem.getLine(info); //открытие линии sdline.open(af); //старт проигрывания sdline.start(); // Ждем появления данных в буфере int num = 0; //заполняем буфер while ((num = audioInpStr.read(b)) != -1) sdline.write(b, 0, num); //сбрасывание буфера, проигрывая остаток файла sdline.drain(); //закрытие потока audioInpStr.close(); } catch (Exception e) { System.err.println(e); } //остановка проигрывания sdline.stop(); //закрытие линии sdline.close(); jb.setEnabled(true); } }