import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
public class Sound implements Runnable
{
private URL soundToPlay; //aktueller Musik Titel
private Thread runner = new Thread(this); //AbspielThread
private static final int BUFFER_SIZE = 3000; // Anzahl der Daten, die aufeinmal an die Soundkarte geschickt werden.
private byte[] buffer = new byte[BUFFER_SIZE];
private int gainPercent = 70; //gibt die Lautstärke in Prozent an. (0% = -80dB und 100% = 6dB)
private Boolean stop = false;
/**
* damit mp3-Dateien abgespielt werden können, muss das mp3plugin von Sun im Classpath stehen oder
* (zB. unter Eclipse) als Bibliothek eingetragen sein.
* Das gleiche gilt für flac-Dateien.
*
* Die Lautstärke "gainLevel" ist logarhytmisch von -80dB bis ca. 6dB. Daher ist die
* prozentuale Lautstärkeregelung nicht ganz korrekt.
*/
/**
* übergibt den Musiktitel
* @param titel
* @throws MalformedURLException
*/
public void setSoundToPlay(URL titel) {
soundToPlay = titel;
}
/**
* stoppt die Wiedergabe
*
*/
public void stop()
{
stop=true;
}
/**
* starten der Wiedergabe
*
*/
public void play()
{
stop=false;
if (!runner.isAlive())
{
runner = new Thread(this);
runner.start();
}
}
/**
* der WiedergabeThread
*/
public void run()
{
try {
AudioInputStream in = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, AudioSystem.getAudioInputStream(soundToPlay));
AudioFormat audioFormat = in.getFormat();
SourceDataLine line = (SourceDataLine) AudioSystem.getLine(new DataLine.Info(SourceDataLine.class, audioFormat));
line.open(audioFormat);
FloatControl gainControl = (FloatControl)line.getControl(FloatControl.Type.MASTER_GAIN);
line.start();
while ((true)&&(!stop)){
int gainLevel= (int) ((int)gainControl.getMinimum()+((gainControl.getMaximum()-gainControl.getMinimum())/100*gainPercent));
gainControl.setValue(gainLevel);
int n = in.read(buffer, 0, buffer.length);
if ((n < 0)||(stop)) {
break;
}
line.write(buffer, 0, n);
}
line.drain();
line.close();
in.close();
} catch (UnsupportedAudioFileException e) {
System.out.println("nicht unterstütztes Format");
} catch (IOException e) {
System.out.println("Datei nicht gefunden");
} catch (LineUnavailableException e) {
System.out.println("Soundkartenfehler");
}
}
public static void main(String[] args) {
File file = new File("d:\\meinlied.mp3");
Sound musik = new Sound();
try {
musik.setSoundToPlay(file.toURL());// Musikdatei zuweisen
musik.gainPercent=60; // Lautstärke auf 60% setzen
musik.play(); // Musik starten
Thread.sleep(10000); //10 sec warten
musik.gainPercent=80; // Lautstärke auf 80% setzen
Thread.sleep(10000); //10 sec warten
musik.gainPercent=100; // Lautstärke auf 100% setzen
Thread.sleep(10000); //10 sec warten
musik.stop(); // Musik stoppen
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}