/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.sound;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;
public class SoundPlayer {
private static ExecutorService playerThreadPool = Executors.newCachedThreadPool();
private static AtomicInteger playerCount = new AtomicInteger();
public static void play(File file) throws IOException {
try {
Player player = new Player(new FileInputStream(file));
play(player);
} catch (JavaLayerException jle) {
throw new IOException (jle.toString());
}
}
public static void play(URL url) throws IOException {
try {
Player player = new Player(url.openStream());
play(player);
} catch (JavaLayerException jle) {
throw new IOException (jle.toString());
}
}
public static void play(String sound) throws IOException {
try {
Player player = new Player(SoundPlayer.class.getClassLoader().getResourceAsStream(sound));
play(player);
player.close();
} catch (JavaLayerException jle) {
throw new IOException (jle.toString());
} catch (NullPointerException npe) {
throw new IOException ("Could not find sound: " + sound);
}
}
/**
* Wait for all sounds to stop playing (Mostly for testing purposes)
*/
public static void waitFor() {
while (playerCount.get() > 0) {
try {
synchronized(playerCount) {
playerCount.wait();
}
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
private static void play(final Player player) {
playerCount.incrementAndGet();
playerThreadPool.submit(new Runnable() {
@Override
public void run() {
try {
player.play();
playerCount.decrementAndGet();
synchronized (playerCount) {
playerCount.notify();
}
} catch (JavaLayerException jle) {
jle.printStackTrace();
}
}
});
}
}