/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.weem.epicinventor.utility; import javazoom.jl.player.advanced.*; import javazoom.jl.player.*; import java.io.*; /** * * @author Brandon */ public class GameSong extends PlaybackListener implements Runnable { private String filePath; private AudioDevice audioDevice; private AdvancedPlayer player; private Thread playerThread; private float maxGain; private float currentGain; private float duration; private GameMusicFade fadeIn; private GameMusicFade fadeOut; private GamePlayList gamePlayList; private float fadeTime; private boolean currentlyPlaying; private boolean playOnce; public GameSong(String file, float mg, float ft, float dur, GamePlayList gpl, boolean po) { try { filePath = file; maxGain = mg; audioDevice = FactoryRegistry.systemRegistry().createAudioDevice(); fadeIn = null; fadeOut = null; fadeTime = ft; currentlyPlaying = false; playOnce = po; gamePlayList = gpl; duration = dur; } catch (Exception e) { EIError.debugMsg(e.getMessage()); } } protected void playerInitialize() { try { audioDevice = FactoryRegistry.systemRegistry().createAudioDevice(); InputStream stream = getClass().getResourceAsStream(filePath); player = new AdvancedPlayer(stream, audioDevice); player.setPlayBackListener(this); } catch (Exception e) { EIError.debugMsg(e.getMessage()); } } public void stop() { if(player != null) { if(fadeTime == 0.0f || this != gamePlayList.getCurrentSong() || gamePlayList.getStopping()) { stopFadeIn(); stopFadeOut(); // setVolume(getMinGain()); // if(playerThread != null) { // playerThread.interrupt(); // playerThread = null; // } currentlyPlaying = false; stopPlayer(); } } } protected void stopPlayer() { if(player != null) { AdvancedPlayer p = player; player = null; p.stop(); } } public String getFilePath() { return filePath; } public boolean isPlaying() { return currentlyPlaying; } public void stopFadeIn() { if(fadeIn != null) { fadeIn.fadeStop(); fadeIn.interrupt(); fadeIn = null; } } protected void stopFadeOut() { if(fadeOut != null) { fadeOut.fadeStop(); fadeOut.interrupt(); fadeOut = null; } } public void fadeOut() { stopFadeIn(); if(fadeTime > 0.0f) { if(fadeOut != null) { if(!fadeOut.isFading()) { stopFadeOut(); fadeOut = new GameMusicFade(this, currentGain, getMinGain(), fadeTime, 0.0f); } } else if(gamePlayList.getStopping()) { fadeOut = new GameMusicFade(this, currentGain, getMinGain(), fadeTime, 0.0f); } } else { stop(); } } public void play() { boolean playListStopping = false; if(gamePlayList != null) { playListStopping = gamePlayList.getStopping(); } if(!playListStopping) { if(playerThread != null && player != null) { player.stop(); } player = null; playerInitialize(); //EIError.debugMsg("GameSongThread "+filePath); playerThread = new Thread(this, "GameSongThread "+filePath); playerThread.start(); } } public float getMaxGain() { float gainMax = -9999.0f; if (audioDevice instanceof JavaSoundAudioDevice) { JavaSoundAudioDevice jsAudio = (JavaSoundAudioDevice) audioDevice; gainMax = jsAudio.getMaxGain(); } return gainMax; } public void setMaxGain(float gain) { maxGain = gain; } public float getMinGain() { float gainMin = -9999.0f; if (audioDevice instanceof JavaSoundAudioDevice) { JavaSoundAudioDevice jsAudio = (JavaSoundAudioDevice) audioDevice; gainMin = jsAudio.getMinGain(); } return gainMin; } public void setVolume(float gain) { if (audioDevice instanceof JavaSoundAudioDevice) { JavaSoundAudioDevice jsAudio = (JavaSoundAudioDevice) audioDevice; if (gain > maxGain) { gain = maxGain; } if (gain > getMaxGain()) { gain = getMaxGain(); } if(fadeOut != null) { fadeOut.setFade(gain, (gain+getMinGain())/2, fadeTime, duration-fadeTime); } currentGain = gain; jsAudio.setLineGain(gain); //EIError.debugMsg("Setting Gain: "+gain); } } public void startFadeOut() { if(gamePlayList != null) { if(this == gamePlayList.getNextSong(false) && !gamePlayList.getStopping()) { stopFadeOut(); } gamePlayList.startFadeOut(); } } public void endFadeOut() { stop(); } @Override public void playbackFinished(PlaybackEvent playbackEvent) { if(gamePlayList != null) { if(playOnce) { gamePlayList.removeByFileName(filePath); } } stop(); if(gamePlayList != null) { gamePlayList.stoppedCurrentSong(); } } // PlaybackListener members @Override public void playbackStarted(PlaybackEvent playbackEvent) { try { if (fadeTime > 0.0f && fadeIn == null) { stopFadeIn(); stopFadeOut(); setVolume(getMinGain()); if(gamePlayList != null) { if(gamePlayList.getLastSong() != this) { fadeIn = new GameMusicFade(this, (maxGain+getMinGain())/2, maxGain, fadeTime, 0.0f); } } fadeOut = new GameMusicFade(this, maxGain, (maxGain+getMinGain())/2, fadeTime, duration-fadeTime); } else { setVolume(maxGain); } } catch (Exception e) { EIError.debugMsg(e.getMessage()); } } @Override public void run() { try { currentlyPlaying = true; EIError.debugMsg("GameSong: "+filePath); player.play(); } catch (Exception e) { EIError.debugMsg(e.getMessage()); } currentlyPlaying = false; } }