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());
- if (AudioSystem.isLineSupported(info)) {
-
- try {
- sourceLine = (SourceDataLine) AudioSystem.getLine(info);
- sourceLine.open(format.getFormat());
- } catch (LineUnavailableException ex) {
-
- ex.printStackTrace();
- }
- } else {
-
- 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) {
-
- ex.printStackTrace();
- }
- } else {
-
- System.out.println("SPEAKER Line is not supported");
- }
-
- } catch (Exception ex) {
-
- ex.printStackTrace();
- }
- }
- }
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;
- private String oldFilename;
- private final JComboBox soundChoice;
- private final JButton play;
- private AudioInputStream source;
- private SourceDataLine sourceLine;
- private byte[] soundData;
- private int bufferSize;
- private Thread thread;
- private boolean playing = false;
-
- public SoundPlayer() {
- setDefaultCloseOperation(EXIT_ON_CLOSE);
- setTitle("Sound File Player");
- setSize(250, 100);
-
-
- 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());
- }
- });
-
-
- 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);
-
-
- if (sourceLine != null) {
- if (sourceLine.isActive()) {
- sourceLine.stop();
- }
- play.setText("PLAY");
- }
-
-
- try {
- AudioInputStream newSource = AudioSystem.getAudioInputStream(soundFile);
-
- if (newSource.markSupported()) {
- newSource.mark(Integer.MAX_VALUE);
- }
-
- AudioFormat format = newSource.getFormat();
- DataLine.Info sourceInfo = new DataLine.Info(SourceDataLine.class, format);
- if (AudioSystem.isLineSupported(sourceInfo)) {
-
- sourceLine = (SourceDataLine) AudioSystem.getLine(sourceInfo);
- bufferSize = (int) (format.getFrameSize() * format.getFrameRate() / 2.0f);
- sourceLine.open(format, bufferSize);
- source = newSource;
- soundData = new byte[bufferSize];
- oldFilename = filename;
- } else {
- JOptionPane.showMessageDialog(null, "Line not supported", "Line NotSupported", JOptionPane.WARNING_MESSAGE);
- soundChoice.setSelectedItem(oldFilename);
- }
- } 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);
- }
- }
-
-
- public void startPlay() {
- if (sourceLine == null) {
- JOptionPane.showMessageDialog(null, "No line available", "Play Problem", JOptionPane.WARNING_MESSAGE);
- return;
- }
- thread = new Thread(this);
- playing = true;
- thread.start();
- }
-
-
- public void stopPlay() {
- playing = false;
- }
-
-
- public void run() {
- sourceLine.start();
- int byteCount = 0;
- try {
- while (playing) {
- byteCount = source.read(soundData, 0, soundData.length);
-
- if (byteCount == -1) {
- if (source.markSupported()) {
- source.reset();
- sourceLine.drain();
- playing = false;
- } else {
- sourceLine.drain();
- playing = false;
- source.close();
- newSound((String) soundChoice.getSelectedItem());
- }
- break;
- }
- sourceLine.write(soundData, 0, byteCount);
- }
- } catch (IOException e) {
- System.err.println(e);
- }
- sourceLine.stop();
- play.setText("PLAY");
- }
- }
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
}
}
Java
Audio, Java, Snippet