Audio snippet code in Java
24/03/2010
Here is an example of two simple Java classes that deals with audio streams ! One for retrieving Info, the other for playing sound …
Voici deux petits exemples de classe Java pour gérer des flux audio. L’une affichant les informations, l’autre implémentant un lecteur très minimaliste !
- import java.io.File;
- import javax.sound.sampled.AudioFileFormat;
- import javax.sound.sampled.AudioSystem;
- import javax.sound.sampled.DataLine;
- import javax.sound.sampled.Line;
- import javax.sound.sampled.LineUnavailableException;
- import javax.sound.sampled.Mixer;
- import javax.sound.sampled.Port;
- import javax.sound.sampled.SourceDataLine;
- public class AudioInfo {
- public static void main(final String[] args) {
- try {
- AudioFileFormat format = AudioSystem.getAudioFileFormat(new File("Recharger.wav"));
- System.out.println("format: " + format);
- Mixer.Info[] infos = AudioSystem.getMixerInfo();
- Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
- Line.Info lineInfo = null;
- for (int i = 0; i < infos.length; ++i) {
- Mixer mixer = AudioSystem.getMixer(mixerInfo[i]);
- System.out.println("Target lines infos");
- Line.Info[] lineInfos = mixer.getTargetLineInfo(Port.Info.SPEAKER);
- for (int l = 0; l < lineInfos.length; ++l) {
- System.out.println("Line Info " + l + " - " + lineInfos[l]);
- lineInfo = lineInfos[l];
- }
- }
- SourceDataLine sourceLine;
- DataLine.Info info = new DataLine.Info(SourceDataLine.class, format.getFormat()); // format is an AudioFormat object
- if (AudioSystem.isLineSupported(info)) {
- // Obtain and open the line.
- try {
- sourceLine = (SourceDataLine) AudioSystem.getLine(info);
- sourceLine.open(format.getFormat());
- } catch (LineUnavailableException ex) {
- // Handle the error.
- ex.printStackTrace();
- }
- } else {
- // Handle the error.
- System.out.println("Line is not supported");
- }
- Port targetLine;
- if (AudioSystem.isLineSupported(Port.Info.SPEAKER)) {
- try {
- targetLine = (Port) AudioSystem.getLine(Port.Info.SPEAKER);
- targetLine.open();
- } catch (LineUnavailableException ex) {
- // Handle the error.
- ex.printStackTrace();
- }
- } else {
- // Handle the error.
- System.out.println("SPEAKER Line is not supported");
- }
- } catch (Exception ex) {
- //UnsupportedAudioFile... & IO...
- ex.printStackTrace();
- }
- }
- }
- import java.awt.BorderLayout;
- import java.awt.Container;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.io.File;
- import java.io.FilenameFilter;
- import java.io.IOException;
- import javax.sound.sampled.AudioFormat;
- import javax.sound.sampled.AudioInputStream;
- import javax.sound.sampled.AudioSystem;
- import javax.sound.sampled.DataLine;
- import javax.sound.sampled.LineUnavailableException;
- import javax.sound.sampled.SourceDataLine;
- import javax.sound.sampled.UnsupportedAudioFileException;
- import javax.swing.JButton;
- import javax.swing.JComboBox;
- import javax.swing.JFrame;
- import javax.swing.JOptionPane;
- public class SoundPlayer extends JFrame implements Runnable {
- private final File currentDir; // Current directory
- private String oldFilename; // Last selected file name
- private final JComboBox soundChoice; // Dropdown list of files
- private final JButton play; // PLAY button
- private AudioInputStream source; // Stream for the sound file
- private SourceDataLine sourceLine; // The speaker output line
- private byte[] soundData; // Buffer to hold samples
- private int bufferSize; // Buffer size in bytes
- private Thread thread; // Playing thread
- private boolean playing = false; // Thread control
- public SoundPlayer() {
- setDefaultCloseOperation(EXIT_ON_CLOSE);
- setTitle("Sound File Player");
- setSize(250, 100);
- // Get the sounds file names from current directory
- currentDir = new File(System.getProperty("user.dir"));
- FilenameFilter filter = new FilenameFilter() {
- public boolean accept(final File directory, final String filename) {
- String name = filename.toLowerCase();
- return name.endsWith(".au") || name.endsWith(".aif") || name.endsWith(".wav");
- }
- };
- String soundFiles[] = currentDir.list(filter);
- if (soundFiles == null || soundFiles.length == 0) {
- JOptionPane.showMessageDialog(this, "No sound files .:. terminating...", "Sound Files Error", JOptionPane.ERROR_MESSAGE);
- System.exit(1);
- }
- soundChoice = new JComboBox(soundFiles);
- soundChoice.setSelectedIndex(0);
- newSound(soundFiles[0]);
- oldFilename = soundFiles[0];
- soundChoice.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- newSound((String) soundChoice.getSelectedItem());
- }
- });
- // Set up the PLAY button to play the current sound file
- play = new JButton("PLAY");
- play.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- if (e.getActionCommand().equals("PLAY")) {
- startPlay();
- play.setText("STOP");
- } else {
- stopPlay();
- play.setText("PLAY");
- }
- }
- });
- Container content = getContentPane();
- content.add(soundChoice);
- content.add(play, BorderLayout.SOUTH);
- setVisible(true);
- }
- public static void main(final String[] args) {
- new SoundPlayer();
- }
- public void newSound(final String filename) {
- File soundFile = new File(currentDir, filename);
- // We may have played a file already
- if (sourceLine != null) {// If we have a line
- if (sourceLine.isActive()) {
- sourceLine.stop(); // ...stop it
- }
- play.setText("PLAY"); // Ensure button is PLAY
- }
- // Now try for a stream and a line
- try {
- AudioInputStream newSource = AudioSystem.getAudioInputStream(soundFile);
- if (newSource.markSupported()) {
- newSource.mark(Integer.MAX_VALUE); // mark the start for later reset
- }
- AudioFormat format = newSource.getFormat(); // Get the audio format
- DataLine.Info sourceInfo = new DataLine.Info(SourceDataLine.class, format);
- if (AudioSystem.isLineSupported(sourceInfo)) { // If the line type is supported
- // Get a new line
- sourceLine = (SourceDataLine) AudioSystem.getLine(sourceInfo);
- bufferSize = (int) (format.getFrameSize() * format.getFrameRate() / 2.0f);
- sourceLine.open(format, bufferSize); // Open the line
- source = newSource; // New line is OK so save it
- soundData = new byte[bufferSize]; // Create the buffer for read
- oldFilename = filename; // Save the current file name
- } else {
- JOptionPane.showMessageDialog(null, "Line not supported", "Line NotSupported", JOptionPane.WARNING_MESSAGE);
- soundChoice.setSelectedItem(oldFilename); // Restore the old selection
- }
- } catch (UnsupportedAudioFileException e) {
- JOptionPane.showMessageDialog(null, "File not supported", "Unsupported File Type", JOptionPane.WARNING_MESSAGE);
- soundChoice.setSelectedItem(oldFilename);
- } catch (LineUnavailableException e) {
- JOptionPane.showMessageDialog(null, "Line not available", "Line Error", JOptionPane.WARNING_MESSAGE);
- soundChoice.setSelectedItem(oldFilename);
- } catch (IOException e) {
- JOptionPane.showMessageDialog(null, "I/O Error creating stream", "I/O Error", JOptionPane.WARNING_MESSAGE);
- soundChoice.setSelectedItem(oldFilename);
- }
- }
- // Start playing the current file
- public void startPlay() {
- if (sourceLine == null) {// Verify we have a line
- JOptionPane.showMessageDialog(null, "No line available", "Play Problem", JOptionPane.WARNING_MESSAGE);
- return;
- }
- thread = new Thread(this); // Create the playing thread
- playing = true; // Set the control to true
- thread.start(); // Start the thread
- }
- // Stop playing the current file
- public void stopPlay() {
- playing = false;
- }
- // The playing thread
- public void run() {
- sourceLine.start(); // Start the line
- int byteCount = 0; // Bytes read
- try {
- while (playing) { // Continue while true
- byteCount = source.read(soundData, 0, soundData.length); // Read the stream
- if (byteCount == -1) { // If it's the end of input
- if (source.markSupported()) {
- source.reset(); // ...put it back to the start
- sourceLine.drain(); // Play what is left in the buffer
- playing = false; // Reset the thread control
- } else {
- sourceLine.drain(); // Play what is left in the buffer
- playing = false; // Reset the thread control
- source.close();
- newSound((String) soundChoice.getSelectedItem());
- }
- break; // then stop playing
- }
- sourceLine.write(soundData, 0, byteCount); // Write the array to the line
- }
- } catch (IOException e) { // For the stream read operation
- System.err.println(e);
- }
- sourceLine.stop(); // Stop the line
- play.setText("PLAY"); // Reset the button text
- }
- }