Not written by me, I slightly optimized / tweaked it.
Singleton pattern.
package audio;
import java.io.File;
import java.util.HashMap;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
public class MusicPlayer {
private static MusicPlayer instance = new MusicPlayer();
private HashMap<String, Clip> clips = new HashMap<String, Clip>();
private int frameGap;
private boolean mute;
private MusicPlayer() {
}
public static MusicPlayer getInstance() {
return instance == null ? instance = new MusicPlayer() : instance;
}
public void load(File file, String name) {
if (clips.get(name) != null) {
return;
}
Clip clip;
try {
AudioInputStream rawStream = AudioSystem.getAudioInputStream(file);
AudioFormat baseFormat = rawStream.getFormat();
AudioFormat decodeFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false);
AudioInputStream decodedStream = AudioSystem.getAudioInputStream(decodeFormat, rawStream);
clip = AudioSystem.getClip();
clip.open(decodedStream);
clips.put(name, clip);
}
catch(Exception e) {
e.printStackTrace();
}
}
public void play(String name) {
play(name, frameGap);
}
public void play(String name, int framePosition) {
if (mute) {
return;
}
Clip clip = clips.get(name);
if (clip == null) {
return;
}
if (clip.isRunning()) {
clip.stop();
}
clip.setFramePosition(framePosition);
while (!clip.isRunning()) {
clip.start();
}
}
public void stop(String name) {
if(clips.get(name) == null) {
return;
}
if(clips.get(name).isRunning()) {
clips.get(name).stop();
}
}
public void resume(String name) {
if (mute) {
return;
}
if (clips.get(name).isRunning()) {
return;
}
clips.get(name).start();
}
public void loop(String name) {
loop(name, frameGap, frameGap, clips.get(name).getFrameLength() - 1);
}
public void loop(String name, int framePosition) {
loop(name, framePosition, frameGap, clips.get(name).getFrameLength() - 1);
}
public void loop(String name, int loopStartPosition, int loopEndPosition) {
loop(name, frameGap, loopStartPosition, loopEndPosition);
}
public void loop(String name, int framePosition, int loopStartPosition, int loopEndPosition) {
stop(name);
if(mute) {
return;
}
clips.get(name).setLoopPoints(loopStartPosition, loopEndPosition);
clips.get(name).setFramePosition(framePosition);
clips.get(name).loop(Clip.LOOP_CONTINUOUSLY);
}
public void setPosition(String name, int framePosition) {
clips.get(name).setFramePosition(framePosition);
}
public int getFrameLength(String name) {
return clips.get(name).getFrameLength();
}
public int getFramePosition(String name) {
return clips.get(name).getFramePosition();
}
public void close(String name) {
stop(name);
clips.get(name).close();
}
}