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
}
}
Java
Audio, Java, Snippet