package audio; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLDecoder; import audio.jmikmod.MikModApp; import audio.gme.gme; public class VMusic implements Runnable { private static URL play; private int volume; Thread mTest = null; static MikModApp modPlayer; static Mp3Player mp3player; static gme vgmPlayer; static WavPlayer wavplayer; public VMusic() { this.volume = 100; } public VMusic(int volume) { this.volume = volume; } public int getVolume() { return this.volume; } public synchronized void start(URL url) { this.setPlay(url); if (mTest == null) { mTest = new Thread(this); } mTest.start(); } public synchronized boolean stop() { if(vgmPlayer != null) vgmPlayer.stopFile(); if(modPlayer != null) modPlayer.stop(); if(mp3player != null) mp3player.close(); //mTest.interrupt(); return true; } public synchronized void run() { if(getPlay() == null || getPlay().getFile() == null) { System.err.println("No file to play."); return; } String extension = getPlay().getFile().substring(getPlay().getFile().length()-3); if(extension.equalsIgnoreCase("vgm") || extension.equalsIgnoreCase("vgz")) { vgmPlayer = new gme(); System.out.println(vgmPlayer); double dv = (double)volume / 100; vgmPlayer.playSimple(getPlay(), dv); //"file:///" + play); } else if(extension.equalsIgnoreCase("mp3")){ mp3player = new Mp3Player(getPlay(), volume); mp3player.play(); } else if(extension.equalsIgnoreCase("wav")){ wavplayer = new WavPlayer(getPlay(), volume); wavplayer.play(); } else if (extension.equalsIgnoreCase("mod") || extension.equalsIgnoreCase("s3m") || extension.equalsIgnoreCase(".xm") || extension.equalsIgnoreCase(".it")) { modPlayer = new MikModApp(); try { // TODO: Still necessary? // Rafael: JAR files can't be read with RandomAccessFile. So we // need to copy the music file to a temporary file, in order to // MikMod app read it like a RandomAccessFile. /*if(play.getProtocol().equals("jar")) { File tempFile = File.createTempFile("temp" + (int)(Math.random()*10), extension); FileOutputStream fos = new FileOutputStream(tempFile); InputStream openStream = play.openStream(); int b = openStream.read(); while(b != -1) { fos.write(b); b = openStream.read(); } openStream.close(); fos.flush(); fos.close(); //Get temporary file path String absolutePath = tempFile.getAbsolutePath(); modPlayer.my_argv = new String[]{" -r ", absolutePath}; } else {*/ modPlayer.my_argv = new String[]{" -r ", " auto"};//, play.getFile()}; modPlayer.url = getPlay(); // TODO Volume? //} } catch (Exception e) { e.printStackTrace(); } modPlayer.init(); modPlayer.start(); } } public static URL getPlay() { return play; } public static void setPlay(URL play) { VMusic.play = play; } public void setVolume(int v) { if(vgmPlayer != null) { double dv = (double)v / 100; System.out.println("VGM volume changed to:" + dv); vgmPlayer.setVolume(dv); } } }