/*
* PlayerApplet.
*
* JavaZOOM : jlgui@javazoom.net
* http://www.javazoom.net
*
*-----------------------------------------------------------------------
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*----------------------------------------------------------------------
*/
package javazoom.jlgui.player.amp;
import java.applet.Applet;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ListIterator;
import java.util.Map;
import javax.swing.ImageIcon;
import javazoom.jlgui.basicplayer.AppletMpegSPIWorkaround;
import javazoom.jlgui.basicplayer.AppletVorbisSPIWorkaround;
import javazoom.jlgui.basicplayer.BasicController;
import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerApplet;
import javazoom.jlgui.basicplayer.BasicPlayerEvent;
import javazoom.jlgui.basicplayer.BasicPlayerException;
import javazoom.jlgui.basicplayer.BasicPlayerListener;
import javazoom.jlgui.player.amp.equalizer.ui.EqualizerApplet;
import javazoom.jlgui.player.amp.playlist.BasePlaylist;
import javazoom.jlgui.player.amp.playlist.Playlist;
import javazoom.jlgui.player.amp.playlist.PlaylistFactory;
import javazoom.jlgui.player.amp.playlist.PlaylistItem;
import javazoom.jlgui.player.amp.playlist.ui.MP3FilesApplet;
import javazoom.jlgui.player.amp.skin.ActiveComponent;
import javazoom.jlgui.player.amp.skin.InvisibleActiveComponent;
import javazoom.jlgui.player.amp.skin.SkinComponent;
import javazoom.jlgui.player.amp.skin.SkinLoader;
import javazoom.jlgui.player.amp.skin.Taftb;
import javazoom.jlgui.player.amp.skin.UrlDialog;
import javazoom.jlgui.player.amp.util.Config;
import javazoom.jlgui.player.amp.util.FileSelector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/*
* Player is the UI core of jlGui.
* <br>
* @author JavaZOOM
*/
public class PlayerApplet extends Applet implements ActionListener, BasicPlayerListener, DropTargetListener, WindowListener
{
private static Log log = LogFactory.getLog(Player.class);
protected static int TEXT_LENGTH_MAX = 30;
protected static long SCROLL_PERIOD = 250;
protected static String TITLETEXT = "jlGui Applet 2.3.2 ";
protected static String initConfig = "jlgui.ini";
protected static String initSong = null;
protected static String showPlaylist = null;
protected static String showEqualizer = null;
protected static String skinVersion = "1"; // 1, 2, for different Volume.bmp
protected static boolean autoRun = false;
private MP3FilesApplet fileList = null;
private EqualizerApplet equalizer = null;
private String currentFileOrURL = null;
private String currentSongName = null;
private PlaylistItem currentPlaylistItem = null;
private boolean currentIsFile;
/*-- Window Parameters --*/
private Image offScreenImage;
private Graphics offScreenGraphics;
private int WinWidth, WinHeight;
private int OrigineX = 0, OrigineY = 0;
private int screenWidth = -1, screenHeight = -1;
private String thePath = "";
private String theMain = "main.bmp";
/*-- Buttons Panel members --*/
private String theButtons = "cbuttons.bmp";
private Image imMain,imButtons;
private ActiveComponent acPrevious,acPlay,acPause,acStop,acNext,acEject;
private Image imPrevious,imPlay,imPause,imStop,imNext,imEject;
private Image[] releasedImage = {imPrevious, imPlay, imPause, imStop, imNext, imEject};
private Image[] pressedImage = {imPrevious, imPlay, imPause, imStop, imNext, imEject};
private int[] releasedPanel = {0, 0, 23, 18, 23, 0, 23, 18, 46, 0, 23, 18, 69, 0, 23, 18, 92, 0, 22, 18, 114, 0, 22, 16};
private int[] pressedPanel = {0, 18, 23, 18, 23, 18, 23, 18, 46, 18, 23, 18, 69, 18, 23, 18, 92, 18, 22, 18, 114, 16, 22, 16};
private int[] panelLocation = {16, 88, 39, 88, 62, 88, 85, 88, 108, 88, 137, 89};
/*-- Title members --*/
private boolean FirstDrag = true;
private int XDrag = 0, YDrag = 0;
private String theTitleBar = "titlebar.bmp";
private Image imTitleBar;
private ActiveComponent acTitleBar;
private Image imTitleB;
private Image[] releasedTitleIm = {imTitleB};
private Image[] pressedTitleIm = {imTitleB};
private int[] releasedTitlePanel = {27, 0, 264 - 20, 14}; // -20 for the two button add by me
private int[] pressedTitlePanel = {27, 15, 264 - 20, 14};// -20 for the two button add by me
private int[] titleBarLocation = {0, 0};
/*-- Exit member --*/
private ActiveComponent acExit;
private int[] releasedExitPanel = {18, 0, 9, 9};
private int[] pressedExitPanel = {18, 9, 9, 9};
private Image[] releasedExitIm = {null};
private Image[] pressedExitIm = {null};
private int[] exitLocation = {264, 3};
/*-- Minimize member --*/
private ActiveComponent acMinimize;
private int[] releasedMinimizePanel = {9, 0, 9, 9};
private int[] pressedMinimizePanel = {9, 9, 9, 9};
private Image[] releasedMinimizeIm = {null};
private Image[] pressedMinimizeIm = {null};
private int[] minimizeLocation = {244, 3};
/*-- Text Members --*/
private int fontWidth = 5;
private int fontHeight = 6;
private String theText = "text.bmp";
private Image imText;
private String fontIndex = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\"@a "
+ "0123456789 :()-'!_+ /[]^&%.=$#"
+ " ?*";
private Image sampleRateImage;
private String sampleRateClearText = " ";
private Image sampleRateClearImage;
private int[] sampleRateLocation = {156, 43};
private String bitsRateClearText = " ";
private Image bitsRateClearImage;
private Image bitsRateImage;
private int[] bitsRateLocation = {110, 43};
private String titleText = TITLETEXT.toUpperCase();
private String clearText = " ";
private Image clearImage;
private Image titleImage;
private int[] titleLocation = {111, 27};
private Image[] titleScrollImage = null;
private int scrollIndex = 0;
private long lastScrollTime = 0L;
private boolean scrollRight = true;
/*-- Numbers Members --*/
private int numberWidth = 9;
private int numberHeight = 13;
private String theNumbers = "numbers.bmp";
private String theNumEx = "nums_ex.bmp";
private Image imNumbers;
private String numberIndex = "0123456789 ";
private Image minuteImage;
private Image secondImage;
private Image minuteDImage;
private Image secondDImage;
private Image[] timeImage = {null, null, null, null, null, null, null, null, null, null, null};
private int[] minuteDLocation = {48, 26};
private int[] minuteLocation = {60, 26};
private int[] secondDLocation = {78, 26};
private int[] secondLocation = {90, 26};
/*-- Mono/Stereo Members --*/
private String theMode = "monoster.bmp";
private Image imMode;
private int[] activeModePanel = {0, 0, 28, 12, 29, 0, 27, 12};
private int[] passiveModePanel = {0, 12, 28, 12, 29, 12, 27, 12};
private Image imSA,imMA,imSI,imMI;
private Image[] activeModeImage = {imSA, imMA};
private Image[] passiveModeImage = {imSI, imMI};
private int[] monoLocation = {212, 40};
private int[] stereoLocation = {239, 40};
/*-- Volume/Balance Panel members --*/
private boolean FirstVolumeDrag = true;
private int XVolumeDrag = 0;
private String theVolume = "volume.bmp";
private Image imVolume;
private SkinComponent acVolume;
private Image[] volumeImage = {null, null, null, null, null, null, null,
null, null, null, null, null, null, null,
null, null, null, null, null, null, null,
null, null, null, null, null, null, null};
private String fakeIndex = "abcdefghijklmnopqrstuvwxyz01";
private int[] volumeBarLocation = {107, 57};
private Image[] releasedVolumeImage = {null};
private Image[] pressedVolumeImage = {null};
private int[] releasedVolumePanel0 = {15, 422, 14, 11};
private int[] pressedVolumePanel0 = {0, 422, 14, 11};
private int[] releasedVolumePanel1 = {75, 376, 14, 11};
private int[] pressedVolumePanel1 = {90, 376, 14, 11};
private int minGain = 0;
private int maxGain = 100;
private int gainValue = 60;
private int deltaVolume = 50;
private int[] volumeLocation = {107 + deltaVolume * gainValue / maxGain, 58};
private int[] volumeBounds = {107, 107 + deltaVolume};
private String theBalance = "balance.bmp";
private SkinComponent acBalance;
private Image imBalance;
private Image[] balanceImage = {null, null, null, null, null, null, null,
null, null, null, null, null, null, null,
null, null, null, null, null, null, null,
null, null, null, null, null, null, null};
private Image[] releasedBalanceImage = {null};
private Image[] pressedBalanceImage = {null};
private int[] releasedBalancePanel0 = {15, 422, 14, 11};
private int[] pressedBalancePanel0 = {0, 422, 14, 11};
private int[] releasedBalancePanel1 = {75, 376, 14, 11};
private int[] pressedBalancePanel1 = {90, 376, 14, 11};
private boolean FirstBalanceDrag = true;
private int XBalanceDrag = 0;
private double minBalance = -1.0;
private double maxBalance = +1.0;
private double balanceValue = 0.0;
private int deltaBalance = 24;
private int[] balanceLocation = {177 + deltaBalance / 2, 58};
private int[] balanceBounds = {177, 177 + deltaBalance};
private int[] balanceBarLocation = {177, 57};
/*-- Play/Pause Icons --*/
private String theIcons = "playpaus.bmp";
private Image imIcons;
private Image[] iconsImage = {null, null, null, null, null};
private int[] iconsPanel = {0, 0, 9, 9, 9, 0, 9, 9, 18, 0, 9, 9, 36, 0, 3, 9, 27, 0, 2, 9};
private int[] iconsLocation = {26, 27, 24, 27};
/*-- PosBar members --*/
private boolean FirstPosBarDrag = true;
private int XPosBarDrag = 0;
private String thePosBar = "posbar.bmp";
private Image imPosBar;
private ActiveComponent acPosBar;
private Image[] releasedPosIm = {null};
private Image[] pressedPosIm = {null};
private int[] releasedPosPanel = {248, 0, 28, 10};
private int[] pressedPosPanel = {278, 0, 28, 10};
private double minPos = 0.0;
private double maxPos = +1.0;
private double posValue = 0.0;
private boolean posValueJump = false;
private int deltaPosBar = 219;
private int[] posBarLocation = {16, 72};
private int[] posBarBounds = {16, 16 + deltaPosBar};
/*-- Equalizer/Playlist/Shuffle/Repeat --*/
private String theEPSRButtons = "shufrep.bmp";
private Image imEPSRButtons;
private ActiveComponent acEqualizer,acPlaylist,acShuffle,acRepeat;
private Image imEqualizer,imPlaylist,imShuffle,imRepeat;
private Image[] releasedEPSRImage = {imEqualizer, imPlaylist, imShuffle, imRepeat};
private Image[] pressedEPSRImage = {imEqualizer, imPlaylist, imShuffle, imRepeat};
private int[] releasedEPSRPanel = {0, 61, 22, 12, 23, 61, 22, 12, 28, 0, 47, 14, 0, 0, 28, 14};
private int[] pressedEPSRPanel = {0, 73, 22, 12, 23, 73, 22, 12, 28, 30, 47, 14, 0, 30, 28, 14};
private int[] panelEPSRLocation = {219, 58, 242, 58, 166, 89, 212, 89};
/*-- JavaSound Members --*/
public static final int INIT = 0;
public static final int OPEN = 1;
public static final int PLAY = 2;
public static final int PAUSE = 3;
public static final int STOP = 4;
private int playerState = INIT;
private long secondsAmount = 0;
private Playlist playlist = null;
private BasicController theSoundPlayer = null;
private Map audioInfo = null;
private Config config = null;
private Applet topFrame = null;
public static final int NONE = 0;
public static final int URL = 1;
public static final int ALL = 2;
private int location = ALL;
private String base = null;
/**
* Applet constructor.
*/
public PlayerApplet()
{
topFrame = this;
BasicPlayerApplet bplayer = new BasicPlayerApplet();
// Register the front-end to low-level player events.
bplayer.addBasicPlayerListener(this);
// Adds controls for front-end to low-level player.
this.setController(bplayer);
}
/**
* Loads Applet parameters.
*/
public void init()
{
base = getCodeBase().toString();
log.info("Codebase:"+base);
String skin = getParameter("skin");
if (skin != null)
{
if (!Config.startWithProtocol(skin)) skin = base + skin;
}
String song = getParameter("song");
if (song != null)
{
if (Config.startWithProtocol(song)) initSong = song;
else initSong = base + song;
}
String start = getParameter("start");
if ((start != null) && (start.equals("yes"))) autoRun = true;
String enableopenlocation = getParameter("location");
if ((enableopenlocation != null))
{
if (enableopenlocation.equalsIgnoreCase("none")) location = NONE;
else if (enableopenlocation.equalsIgnoreCase("url")) location = URL;
else if (enableopenlocation.equalsIgnoreCase("all")) location = ALL;
}
String skinversion = getParameter("skinversion");
if (skinversion != null) skinVersion = skinversion;
String init = getParameter("init");
if (init != null)
{
if (Config.startWithProtocol(init)) initConfig = init;
else initConfig = base+init;
}
else initConfig = base+"jlgui.ini";
// Ugly workaround to make it work under Java Plugin.
String userAgent = getParameter("useragent");
AppletVorbisSPIWorkaround.useragent=userAgent;
AppletMpegSPIWorkaround.useragent=userAgent;
String forceOgg = getParameter("forceogg");
if ((forceOgg != null) && (forceOgg.equalsIgnoreCase("true"))) BasicPlayerApplet.forceOgg=true;
// End.
initPlayer(skin);
if (autoRun == true) pressStart();
}
/**
* Init player applet.
*/
public void initPlayer(String Skin)
{
// Config feature.
config = Config.getInstance();
config.load(initConfig);
OrigineX = config.getXLocation();
OrigineY = config.getYLocation();
// Get screen size
try
{
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension dimension = toolkit.getScreenSize();
screenWidth = dimension.width;
screenHeight = dimension.height;
} catch (Exception e)
{
}
// Minimize/Maximize/Icon features.
//topFrame.addWindowListener(this);
topFrame.setLocation(OrigineX, OrigineY);
topFrame.setSize(0, 0);
// Polis : Comment out to fix a bug under XWindow
//topFrame.setResizable(false);
ClassLoader cl = this.getClass().getClassLoader();
URL iconURL = cl.getResource("javazoom/jlgui/player/amp/jlguiicon.gif");
if (iconURL != null)
{
ImageIcon jlguiIcon = new ImageIcon(iconURL);
//topFrame.setIconImage(jlguiIcon.getImage());
}
topFrame.show();
// DnD feature.
DropTarget dt = new DropTarget(this, DnDConstants.ACTION_COPY, this, true);
// Volume.
if (config.getVolume() != -1)
{
gainValue = config.getVolume();
volumeLocation[0] = 107 + deltaVolume * gainValue / maxGain;
}
// Playlist feature.
boolean playlistfound = false;
if ((initSong != null) && (!initSong.equals(""))) playlistfound = loadPlaylist(initSong);
else playlistfound = loadPlaylist(config.getPlaylistFilename());
// Load skin specified in args
if (Skin != null)
{
thePath = Skin;
log.info("Load default skin from " + thePath);
loadSkin(thePath);
config.setDefaultSkin(thePath);
}
// Load skin specified in jlgui.ini
else if ((config.getDefaultSkin() != null) && (!config.getDefaultSkin().trim().equals("")))
{
log.info("Load default skin from " + config.getDefaultSkin());
loadSkin(config.getDefaultSkin());
}
// Default included skin
else
{
//ClassLoader cl = this.getClass().getClassLoader();
InputStream sis = cl.getResourceAsStream("javazoom/jlgui/player/amp/metrix.wsz");
log.info("Load default skin for JAR");
loadSkin(sis);
}
// Go to playlist begining if needed.
if ((playlist != null) && (playlistfound == true))
{
if (playlist.getPlaylistSize() > 0) acNext.fireEvent();
}
// Display the whole
hide();
show();
repaint();
}
/**
* Loads a new playlist.
*/
protected boolean loadPlaylist(String playlistName)
{
boolean loaded = false;
PlaylistFactory plf = PlaylistFactory.getInstance();
playlist = plf.getPlaylist();
if (playlist == null)
{
config.setPlaylistClassName("javazoom.jlgui.player.amp.playlist.BasePlaylist");
playlist = plf.getPlaylist();
}
if (playlist instanceof BasePlaylist)
{
((BasePlaylist)playlist).setM3UHome(base);
((BasePlaylist)playlist).setPLSHome(base);
}
if ((playlistName != null) && (!playlistName.equals("")))
{
// M3U file or URL.
if ((playlistName.toLowerCase().endsWith(".m3u")) || (playlistName.toLowerCase().endsWith(".pls"))) loaded = playlist.load(playlistName);
// Simple song.
else
{
String name = playlistName;
if (!Config.startWithProtocol(playlistName))
{
int indn = playlistName.lastIndexOf(java.io.File.separatorChar);
if (indn != -1) name = playlistName.substring(indn + 1);
PlaylistItem pli = new PlaylistItem(name, playlistName, -1, true);
playlist.appendItem(pli);
loaded = true;
}
else
{
PlaylistItem pli = new PlaylistItem(name, playlistName, -1, false);
playlist.appendItem(pli);
loaded = true;
}
}
}
return loaded;
}
/**
* Loads a new skin from local file system.
*/
protected void loadSkin(String skinName)
{
SkinLoader skl = new SkinLoader(skinName);
try
{
loadSkin(skl);
}
catch (Exception e)
{
log.info("Can't load skin : "+skinName,e);
InputStream sis = this.getClass().getClassLoader().getResourceAsStream("javazoom/jlgui/player/amp/metrix.wsz");
log.info("Load default skin for JAR");
loadSkin(sis);
}
}
/**
* Loads a new skin from any input stream.
*/
public void loadSkin(InputStream skinStream)
{
SkinLoader skl = new SkinLoader(skinStream);
try
{
loadSkin(skl);
}
catch (Exception e)
{
log.info("Can't load skin : "+skinStream, e);
InputStream sis = this.getClass().getClassLoader().getResourceAsStream("javazoom/jlgui/player/amp/metrix.wsz");
log.info("Load default skin for JAR");
loadSkin(sis);
}
}
/**
* Loads a skin from a SkinLoader.
*/
protected void loadSkin(SkinLoader skl) throws Exception
{
skl.loadImages();
imMain = skl.getImage(theMain);
imButtons = skl.getImage(theButtons);
imTitleBar = skl.getImage(theTitleBar);
imText = skl.getImage(theText);
imMode = skl.getImage(theMode);
imNumbers = skl.getImage(theNumbers);
// add by John Yang
if (imNumbers == null)
{
log.info("Try load nums_ex.bmp !");
imNumbers = skl.getImage(theNumEx);
}
imVolume = skl.getImage(theVolume);
imBalance = skl.getImage(theBalance);
imIcons = skl.getImage(theIcons);
imPosBar = skl.getImage(thePosBar);
imEPSRButtons = skl.getImage(theEPSRButtons);
// Computes volume slider height :
int vh = (imVolume.getHeight(null)-422);
if (vh > 0)
{
releasedVolumePanel0[3] = vh;
pressedVolumePanel0[3] = vh;
releasedVolumePanel1[3] = vh;
pressedVolumePanel1[3] = vh;
}
// Computes balance slider height :
if (imBalance == null) imBalance = imVolume;
int bh = (imBalance.getHeight(null)-422);
if (bh > 0)
{
releasedBalancePanel0[3] = bh;
pressedBalancePanel0[3] = bh;
releasedBalancePanel1[3] = bh;
pressedBalancePanel1[3] = bh;
}
// Compute posbar height.
int ph = imPosBar.getHeight(null);
if (ph > 0)
{
releasedPosPanel[3] = ph;
pressedPosPanel[3] = ph;
}
WinHeight = imMain.getHeight(this); // 275
WinWidth = imMain.getWidth(this); // 116
setSize(WinWidth, WinHeight);
setLocation(OrigineX, OrigineY);
//setBackground(Color.black);
show();
offScreenImage = createImage(WinWidth, WinHeight);
offScreenGraphics = offScreenImage.getGraphics();
// E.B Fix for JDK 1.4 slow down problem.
hide();
// End Fix.
offScreenGraphics.drawImage(imMain, 0, 0, this);
// M.S : Remove all components when loading a new skin.
if (acPrevious != null) remove(acPrevious);
if (acPlay != null) remove(acPlay);
if (acPause != null) remove(acPause);
if (acStop != null) remove(acStop);
if (acNext != null) remove(acNext);
if (acEject != null) remove(acEject);
if (acTitleBar != null) remove(acTitleBar);
if (acExit != null) remove(acExit);
if (acMinimize != null) remove(acMinimize);
if (acVolume != null) remove((Component)acVolume);
if (acBalance != null) remove((Component)acBalance);
if (acPosBar != null) remove(acPosBar);
if (acPlaylist != null) remove(acPlaylist);
if (acRepeat != null) remove(acRepeat);
if (acShuffle != null) remove(acShuffle);
if (acEqualizer != null) remove(acEqualizer);
if (fileList != null) remove(fileList);
if (equalizer != null) remove(equalizer);
System.gc();
/*-- Buttons --*/
readPanel(releasedImage, releasedPanel, pressedImage, pressedPanel, imButtons);
setButtonsPanel();
/*-- Volume/Balance --*/
if (skinVersion.equals("1"))
{
readPanel(releasedVolumeImage, releasedVolumePanel0, pressedVolumeImage, pressedVolumePanel0, imVolume);
readPanel(releasedBalanceImage, releasedBalancePanel0, pressedBalanceImage, pressedBalancePanel0, imBalance);
}
else
{
readPanel(releasedVolumeImage, releasedVolumePanel1, pressedVolumeImage, pressedVolumePanel1, imVolume);
readPanel(releasedBalanceImage, releasedBalancePanel1, pressedBalanceImage, pressedBalancePanel1, imBalance);
}
setVolumeBalancePanel(vh, bh);
/*-- Title Bar --*/
readPanel(releasedTitleIm, releasedTitlePanel, pressedTitleIm, pressedTitlePanel, imTitleBar);
setTitleBarPanel();
/*-- Exit --*/
readPanel(releasedExitIm, releasedExitPanel, pressedExitIm, pressedExitPanel, imTitleBar);
setExitPanel();
/*-- Minimize --*/
readPanel(releasedMinimizeIm, releasedMinimizePanel, pressedMinimizeIm, pressedMinimizePanel, imTitleBar);
setMinimizePanel();
/*-- Mode --*/
readPanel(activeModeImage, activeModePanel, passiveModeImage, passiveModePanel, imMode);
offScreenGraphics.drawImage(passiveModeImage[0], stereoLocation[0], stereoLocation[1], this);
offScreenGraphics.drawImage(passiveModeImage[1], monoLocation[0], monoLocation[1], this);
/*-- Text --*/
sampleRateClearImage = (new Taftb(fontIndex, imText, fontWidth, fontHeight, 0, sampleRateClearText)).getBanner();
bitsRateClearImage = (new Taftb(fontIndex, imText, fontWidth, fontHeight, 0, bitsRateClearText)).getBanner();
clearImage = (new Taftb(fontIndex, imText, fontWidth, fontHeight, 0, clearText)).getBanner(0, 0, 155, 6);
titleImage = (new Taftb(fontIndex, imText, fontWidth, fontHeight, 0, titleText)).getBanner(0, 0, 155, 6);
offScreenGraphics.drawImage(titleImage, titleLocation[0], titleLocation[1], this);
/*-- Numbers --*/
for (int h = 0; h < numberIndex.length(); h++)
{
timeImage[h] = (new Taftb(numberIndex, imNumbers, numberWidth, numberHeight, 0, "" + numberIndex.charAt(h))).getBanner();
}
/*-- Icons --*/
readPanel(iconsImage, iconsPanel, null, null, imIcons);
offScreenGraphics.drawImage(iconsImage[2], iconsLocation[0], iconsLocation[1], this);
/*-- Pos Bar --*/
readPanel(releasedPosIm, releasedPosPanel, pressedPosIm, pressedPosPanel, imPosBar);
setPosBarPanel();
/*-- Equalizer/Playlist/Shuffle/Repeat --*/
readPanel(releasedEPSRImage, releasedEPSRPanel, pressedEPSRImage, pressedEPSRPanel, imEPSRButtons);
setEPSRButtonsPanel();
// Popup menu on TitleBar
PopupMenu mainpopup = new PopupMenu("Setup");
Font fnt = new Font("Dialog", Font.PLAIN, 11);
mainpopup.setFont(fnt);
MenuItem mi = new MenuItem(TITLETEXT + "- JavaZOOM");
mi.setEnabled(false);
mi.addActionListener(this);
mainpopup.add(mi);
mainpopup.addSeparator();
mi = new MenuItem("Preferences");
mi.setEnabled(false);
mi.addActionListener(this);
mainpopup.add(mi);
mi = new MenuItem("Skins");
mi.setEnabled(false);
mi.addActionListener(this);
mainpopup.add(mi);
mainpopup.addSeparator();
mi = new MenuItem("Exit");
mi.setEnabled(false);
mi.addActionListener(this);
mainpopup.add(mi);
acTitleBar.setPopup(mainpopup);
/* -- create MP3File List Window --*/
if (showPlaylist != null) config.setPlaylistEnabled(true);
fileList = new MP3FilesApplet(topFrame, this, playlist, skl, OrigineX, OrigineY + WinHeight, config.isPlaylistEnabled());
add(fileList);
/* -- create Equalizer Window --*/
if (showEqualizer != null) config.setEqualizerEnabled(true);
int factor = 1;
if (config.isPlaylistEnabled()) factor = 2;
equalizer = new EqualizerApplet(topFrame, this, skl, OrigineX, OrigineY + WinHeight*factor, config.isEqualizerEnabled());
add(equalizer);
show();
}
/**
* Crop Panel Features from image file.
*/
public void readPanel(Image[] releasedImage, int[] releasedPanel,
Image[] pressedImage, int[] pressedPanel, Image imPanel)
{
int xul,yul,xld,yld;
int j = 0;
if (releasedImage != null)
{
for (int i = 0; i < releasedImage.length; i++)
{
releasedImage[i] = createImage(releasedPanel[j + 2], releasedPanel[j + 3]);
xul = releasedPanel[j];
yul = releasedPanel[j + 1];
xld = releasedPanel[j] + releasedPanel[j + 2];
yld = releasedPanel[j + 1] + releasedPanel[j + 3];
(releasedImage[i].getGraphics()).drawImage(imPanel, 0, 0, releasedPanel[j + 2], releasedPanel[j + 3],
xul, yul, xld, yld, null);
j = j + 4;
}
}
j = 0;
if (pressedImage != null)
{
for (int i = 0; i < pressedImage.length; i++)
{
pressedImage[i] = createImage(pressedPanel[j + 2], pressedPanel[j + 3]);
xul = pressedPanel[j];
yul = pressedPanel[j + 1];
xld = pressedPanel[j] + pressedPanel[j + 2];
yld = pressedPanel[j + 1] + pressedPanel[j + 3];
(pressedImage[i].getGraphics()).drawImage(imPanel, 0, 0, pressedPanel[j + 2], pressedPanel[j + 3],
xul, yul, xld, yld, null);
j = j + 4;
}
}
}
/**
* Instantiate Buttons Panel with ActiveComponent.
* Add them to window and ActionListener.
*/
protected void setButtonsPanel()
{
int l = 0;
setLayout(null);
acPrevious = new ActiveComponent(releasedImage[0], pressedImage[0], AWTEvent.MOUSE_EVENT_MASK);
acPrevious.setLocation(panelLocation[l++], panelLocation[l++]);
add(acPrevious);
acPrevious.setActionCommand("Previous");
acPrevious.addActionListener(this);
acPlay = new ActiveComponent(releasedImage[1], pressedImage[1], AWTEvent.MOUSE_EVENT_MASK);
acPlay.setLocation(panelLocation[l++], panelLocation[l++]);
add(acPlay);
acPlay.setActionCommand("Play");
acPlay.addActionListener(this);
acPause = new ActiveComponent(releasedImage[2], pressedImage[2], AWTEvent.MOUSE_EVENT_MASK);
acPause.setLocation(panelLocation[l++], panelLocation[l++]);
add(acPause);
acPause.setActionCommand("Pause");
acPause.addActionListener(this);
acStop = new ActiveComponent(releasedImage[3], pressedImage[3], AWTEvent.MOUSE_EVENT_MASK);
acStop.setLocation(panelLocation[l++], panelLocation[l++]);
add(acStop);
acStop.setActionCommand("Stop");
acStop.addActionListener(this);
acNext = new ActiveComponent(releasedImage[4], pressedImage[4], AWTEvent.MOUSE_EVENT_MASK);
acNext.setLocation(panelLocation[l++], panelLocation[l++]);
add(acNext);
acNext.setActionCommand("Next");
acNext.addActionListener(this);
acEject = new ActiveComponent(releasedImage[5], pressedImage[5], AWTEvent.MOUSE_EVENT_MASK | AWTEvent.KEY_EVENT_MASK);
acEject.setLocation(panelLocation[l++], panelLocation[l++]);
add(acEject);
acEject.setActionCommand("Eject");
acEject.addActionListener(this);
}
/**
* Instantiate Title Panel with ActiveComponent.
* Add them to window and ActionListener.
*/
protected void setTitleBarPanel()
{
int l = 0;
acTitleBar = new ActiveComponent(releasedTitleIm[0], pressedTitleIm[0], AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK);
// TODO - Title bar disabled.
acTitleBar.setEnabled(false);
acTitleBar.setLocation(titleBarLocation[l++], titleBarLocation[l++]);
add(acTitleBar);
acTitleBar.setActionCommand("TitleBar");
acTitleBar.addActionListener(this);
}
/**
* Instantiate Exit Panel with ActiveComponent.
* Add them to window and ActionListener.
*/
protected void setExitPanel()
{
int l = 0;
acExit = new ActiveComponent(releasedExitIm[0], pressedExitIm[0], AWTEvent.MOUSE_EVENT_MASK);
// TODO - Exit disabled
acExit.setEnabled(false);
acExit.setLocation(exitLocation[l++], exitLocation[l++]);
add(acExit);
acExit.setActionCommand("Exit");
acExit.addActionListener(this);
}
/**
* Instantiate Minimize Panel with ActiveComponent.
* Add them to window and ActionListener.
*/
protected void setMinimizePanel()
{
int l = 0;
acMinimize = new ActiveComponent(releasedMinimizeIm[0], pressedMinimizeIm[0], AWTEvent.MOUSE_EVENT_MASK);
// TODO - Minimize disabled
acMinimize.setEnabled(false);
acMinimize.setLocation(minimizeLocation[l++], minimizeLocation[l++]);
add(acMinimize);
acMinimize.setActionCommand("Minimize");
acMinimize.addActionListener(this);
}
/**
* Instantiate Volume/Balance Panel with ActiveComponent.
* Add them to window and ActionListener.
*/
protected void setVolumeBalancePanel(int vheight, int bheight)
{
// Volume.
int l = 0;
if (vheight > 0) acVolume = new ActiveComponent(releasedVolumeImage[0], pressedVolumeImage[0], AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK);
else acVolume = new InvisibleActiveComponent(releasedVolumeImage[0], pressedVolumeImage[0], AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK);
acVolume.setLocation(volumeLocation[l++], volumeLocation[l++]);
add((Component)acVolume);
acVolume.setActionCommand("Volume");
acVolume.addActionListener(this);
for (int k = 0; k < volumeImage.length; k++)
{
volumeImage[k] = (new Taftb(fakeIndex, imVolume, 68, 13, 2, "" + fakeIndex.charAt(k))).getBanner();
}
offScreenGraphics.drawImage(volumeImage[(int) Math.round(((double) gainValue / (double) maxGain) * (volumeImage.length - 1))], volumeBarLocation[0], volumeBarLocation[1], this);
// Balance
Image cropBalance = createImage(37, 418);
Graphics g = cropBalance.getGraphics();
g.drawImage(imBalance, 0, 0, 37, 418, 9, 0, 9 + 37, 0 + 418, null);
l = 0;
if (bheight > 0) acBalance = new ActiveComponent(releasedBalanceImage[0], pressedBalanceImage[0], AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK);
else acBalance = new InvisibleActiveComponent(releasedBalanceImage[0], pressedBalanceImage[0], AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK);
acBalance.setLocation(balanceLocation[l++], balanceLocation[l++]);
add((Component)acBalance);
acBalance.setActionCommand("Balance");
acBalance.addActionListener(this);
for (int k = 0; k < balanceImage.length; k++)
{
balanceImage[k] = (new Taftb(fakeIndex, cropBalance, 37, 13, 2, "" + fakeIndex.charAt(k))).getBanner();
}
offScreenGraphics.drawImage(balanceImage[(int) Math.round(((double) Math.abs(balanceValue) / (double) 1) * (balanceImage.length - 1))], balanceBarLocation[0], balanceBarLocation[1], this);
}
/**
* Instantiate PosBar Panel with ActiveComponent.
* Add them to window and ActionListener.
*/
protected void setPosBarPanel()
{
int l = 0;
acPosBar = new ActiveComponent(releasedPosIm[0], pressedPosIm[0], AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK);
acPosBar.setLocation(posBarLocation[l++], posBarLocation[l++]);
add(acPosBar);
acPosBar.setActionCommand("Seek");
acPosBar.addActionListener(this);
remove(acPosBar);
}
/**
* Instantiate EPSR Buttons Panel with ActiveComponent.
* Add them to window and ActionListener.
*/
protected void setEPSRButtonsPanel()
{
int l = 0;
setLayout(null);
acEqualizer = new ActiveComponent(releasedEPSRImage[0], pressedEPSRImage[0], AWTEvent.MOUSE_EVENT_MASK, true, config.isEqualizerEnabled());
acEqualizer.setLocation(panelEPSRLocation[l++], panelEPSRLocation[l++]);
add(acEqualizer);
acEqualizer.setActionCommand("Equalizer");
acEqualizer.addActionListener(this);
acPlaylist = new ActiveComponent(releasedEPSRImage[1], pressedEPSRImage[1], AWTEvent.MOUSE_EVENT_MASK, true, config.isPlaylistEnabled());
acPlaylist.setLocation(panelEPSRLocation[l++], panelEPSRLocation[l++]);
add(acPlaylist);
acPlaylist.setActionCommand("Playlist");
acPlaylist.addActionListener(this);
acShuffle = new ActiveComponent(releasedEPSRImage[2], pressedEPSRImage[2], AWTEvent.MOUSE_EVENT_MASK, true, config.isShuffleEnabled());
acShuffle.setLocation(panelEPSRLocation[l++], panelEPSRLocation[l++]);
add(acShuffle);
acShuffle.setActionCommand("Shuffle");
acShuffle.addActionListener(this);
acRepeat = new ActiveComponent(releasedEPSRImage[3], pressedEPSRImage[3], AWTEvent.MOUSE_EVENT_MASK, true, config.isRepeatEnabled());
acRepeat.setLocation(panelEPSRLocation[l++], panelEPSRLocation[l++]);
add(acRepeat);
acRepeat.setActionCommand("Repeat");
acRepeat.addActionListener(this);
}
/**
* Sets the current song to play and start playing if needed.
*/
public void setCurrentSong(PlaylistItem pli)
{
int playerStateMem = playerState;
if ((playerState == PAUSE) || (playerState == PLAY))
{
try
{
theSoundPlayer.stop();
}
catch (BasicPlayerException e)
{
log.error("Cannot stop",e);
}
playerState = STOP;
secondsAmount = 0;
acPosBar.setLocation(posBarBounds[0], posBarLocation[1]);
offScreenGraphics.drawImage(iconsImage[2], iconsLocation[0], iconsLocation[1], this);
offScreenGraphics.drawImage(iconsImage[4], iconsLocation[2], iconsLocation[3], this);
}
playerState = OPEN;
if (pli != null)
{
// Read tag info.
pli.getTagInfo();
currentSongName = pli.getFormattedName();
currentFileOrURL = pli.getLocation();
currentIsFile = pli.isFile();
currentPlaylistItem = pli;
}
// Playlist ended.
else
{
// Try to repeat ?
if (config.isRepeatEnabled())
{
if (playlist != null)
{
// PlaylistItems available ?
if (playlist.getPlaylistSize() > 0)
{
playlist.begin();
PlaylistItem rpli = playlist.getCursor();
if (rpli != null)
{
// OK, Repeat the playlist.
rpli.getTagInfo();
currentSongName = rpli.getFormattedName();
currentFileOrURL = rpli.getLocation();
currentIsFile = rpli.isFile();
currentPlaylistItem = rpli;
}
}
// No, so display Title.
else
{
currentSongName = TITLETEXT;
currentFileOrURL = null;
currentIsFile = false;
currentPlaylistItem = null;
}
}
}
// No, so display Title.
else
{
currentSongName = TITLETEXT;
currentFileOrURL = null;
currentIsFile = false;
currentPlaylistItem = null;
}
}
if (currentIsFile == true)
{
add(acPosBar);
acPosBar.repaint();
}
else
{
config.setLastURL(currentFileOrURL);
remove(acPosBar);
}
titleText = currentSongName.toUpperCase();
showMessage(titleText);
repaint();
// Start playing if needed.
if ((playerStateMem == PLAY) || (playerStateMem == PAUSE))
{
acPlay.fireEvent();
}
}
/*-----------------------------------------*/
/*-- BasicPlayerListener Interface --*/
/*-----------------------------------------*/
/**
* Open callback, stream is ready to play.
*/
public void opened(Object stream, Map properties)
{
audioInfo = properties;
log.debug(properties.toString());
}
/**
* Progress callback while playing.
*/
public void progress(int bytesread, long microseconds, byte[] pcmdata, Map properties)
{
int byteslength = -1;
long total = -1;
// Try to get time from playlist item.
if (currentPlaylistItem != null) total = currentPlaylistItem.getLength();
// If it fails then try again with JavaSound SPI.
if (total <=0) total = (long) Math.round(getTimeLengthEstimation(audioInfo)/1000);
// If it fails again then it might be stream => Total = -1
if (total <=0) total = -1;
if (audioInfo.containsKey("audio.length.bytes"))
{
byteslength = ((Integer) audioInfo.get("audio.length.bytes")).intValue();
}
float progress = -1.0f;
if ((bytesread > 0) && ((byteslength > 0))) progress = bytesread*1.0f/byteslength*1.0f;
if (audioInfo.containsKey("audio.type"))
{
String audioformat = (String) audioInfo.get("audio.type");
if (audioformat.equalsIgnoreCase("mp3"))
{
//if (properties.containsKey("mp3.position.microseconds")) secondsAmount = (long) Math.round(((Long) properties.get("mp3.position.microseconds")).longValue()/1000000);
// Shoutcast stream title.
if (properties.containsKey("mp3.shoutcast.metadata.StreamTitle"))
{
String shoutTitle = ((String) properties.get("mp3.shoutcast.metadata.StreamTitle")).trim();
if (shoutTitle.length()>0)
{
if (currentPlaylistItem != null)
{
String sTitle = " ("+currentPlaylistItem.getFormattedDisplayName()+")";
if (!currentPlaylistItem.getFormattedName().equals(shoutTitle+sTitle))
{
currentPlaylistItem.setFormattedDisplayName(shoutTitle+sTitle);
showTitle((shoutTitle+sTitle).toUpperCase());
fileList.displayAll();
}
}
}
}
// Equalizer
if (properties.containsKey("mp3.equalizer"))equalizer.setBands((float[])properties.get("mp3.equalizer"));
if (total > 0) secondsAmount = (long) (total*progress);
else secondsAmount = -1;
}
else if (audioformat.equalsIgnoreCase("wave"))
{
secondsAmount = (long) (total*progress);
}
else
{
secondsAmount = (long) Math.round(microseconds/1000000);
equalizer.setBands(null);
}
}
else
{
secondsAmount = (long) Math.round(microseconds/1000000);
equalizer.setBands(null);
}
if (secondsAmount < 0) secondsAmount = (long) Math.round(microseconds/1000000);
/*-- Display elapsed time --*/
int secondD=0,second=0,minuteD=0,minute=0;
int seconds=(int) secondsAmount;
int minutes=(int) Math.floor(seconds/60);
int hours=(int) Math.floor(minutes/60);
minutes=minutes-hours*60;
seconds=seconds-minutes*60-hours*3600;
if (seconds < 10)
{
secondD = 0;
second = seconds;
}
else
{
secondD = ((int) seconds / 10);
second = ((int) (seconds - (((int) seconds / 10)) * 10));
}
if (minutes < 10)
{
minuteD = 0;
minute = minutes;
}
else
{
minuteD = ((int) minutes / 10);
minute = ((int) (minutes - (((int) minutes / 10)) * 10));
}
// Update PosBar location.
if (total != 0)
{
if ((FirstPosBarDrag == true) && (posValueJump==false))
{
posBarLocation[0] = ((int) Math.round(secondsAmount * deltaPosBar / total)) + posBarBounds[0];
if (posBarLocation[0] < posBarBounds[0]) posBarLocation[0] = posBarBounds[0];
else if (posBarLocation[0] > posBarBounds[1]) posBarLocation[0] = posBarBounds[1];
acPosBar.setLocation(posBarLocation[0], posBarLocation[1]);
acPosBar.repaint();
}
}
else posBarLocation[0] = posBarBounds[0];
offScreenGraphics.drawImage(timeImage[minuteD], minuteDLocation[0], minuteDLocation[1], this);
offScreenGraphics.drawImage(timeImage[minute], minuteLocation[0], minuteLocation[1], this);
offScreenGraphics.drawImage(timeImage[secondD], secondDLocation[0], secondDLocation[1], this);
offScreenGraphics.drawImage(timeImage[second], secondLocation[0], secondLocation[1], this);
long ctime = System.currentTimeMillis();
long lctime = lastScrollTime;
// Scroll title ?
if ((titleScrollImage != null) && (titleScrollImage.length > 0))
{
if (ctime-lctime > SCROLL_PERIOD)
{
lastScrollTime = ctime;
if (scrollRight == true)
{
scrollIndex++;
if (scrollIndex>=titleScrollImage.length)
{
scrollIndex--;
scrollRight=false;
}
}
else
{
scrollIndex--;
if (scrollIndex<=0)
{
scrollRight=true;
}
}
if ((offScreenGraphics != null) && (clearImage != null) && (titleScrollImage != null))
{
offScreenGraphics.drawImage(clearImage, titleLocation[0], titleLocation[1], this);
offScreenGraphics.drawImage(titleScrollImage[scrollIndex], titleLocation[0], titleLocation[1], this);
}
}
}
repaint();
}
/**
* Notification callback.
*/
public void stateUpdated(BasicPlayerEvent event)
{
log.debug("Event:"+event);
/*-- End Of Media reached --*/
int state = event.getCode();
Object obj = event.getDescription();
if (state==BasicPlayerEvent.EOM)
{
if ((playerState == PAUSE) || (playerState == PLAY))
{
playlist.nextCursor();
fileList.nextCursor();
PlaylistItem pli = playlist.getCursor();
this.setCurrentSong(pli);
}
}
else if (state==BasicPlayerEvent.PLAYING)
{
lastScrollTime = System.currentTimeMillis();
posValueJump = false;
}
else if (state==BasicPlayerEvent.SEEKING)
{
posValueJump = true;
}
else if (state==BasicPlayerEvent.OPENING)
{
if ((obj instanceof URL) || (obj instanceof InputStream))
{
showTitle("PLEASE WAIT ... BUFFERING ...");
paintAll(getGraphics());
}
}
}
/**
* A handle to the BasicPlayer, plugins may control the player through
* the controller (play, stop, ...)
*/
public void setController(BasicController controller)
{
theSoundPlayer = controller;
}
/**
* Process seek feature.
*/
protected void processSeek()
{
try
{
if (audioInfo.containsKey("audio.type"))
{
String type = (String) audioInfo.get("audio.type");
// Seek support for MP3.
if ((type.equalsIgnoreCase("mp3")) && (audioInfo.containsKey("audio.length.bytes")))
{
long skipBytes = (long) Math.round(((Integer) audioInfo.get("audio.length.bytes")).intValue()*posValue);
log.debug("Seek value (MP3) : "+skipBytes);
theSoundPlayer.seek(skipBytes);
}
// Seek support for WAV.
else if ((type.equalsIgnoreCase("wave")) && (audioInfo.containsKey("audio.length.bytes")))
{
long skipBytes = (long) Math.round(((Integer) audioInfo.get("audio.length.bytes")).intValue()*posValue);
log.debug("Seek value (WAVE) : "+skipBytes);
theSoundPlayer.seek(skipBytes);
}
else posValueJump = false;
}
else posValueJump = false;
}
catch (BasicPlayerException ioe)
{
log.error("Cannot skip",ioe);
posValueJump = false;
}
}
/**
* Manages events.
*/
public void actionPerformed(ActionEvent e)
{
/*------------------------------------*/
/*-- Interact on Seek --*/
/*------------------------------------*/
if (e.getActionCommand().equals("Seek"))
{
if (acPosBar.isMousePressed() == false)
{
FirstPosBarDrag = true;
posValueJump = true;
processSeek();
repaint();
}
else
{
int DeltaX = 0;
if (FirstPosBarDrag == false)
{
DeltaX = acPosBar.getMouseX() - XPosBarDrag;
XPosBarDrag = acPosBar.getMouseX() - DeltaX;
if (posBarLocation[0] + DeltaX < posBarBounds[0]) posBarLocation[0] = posBarBounds[0];
else if (posBarLocation[0] + DeltaX > posBarBounds[1]) posBarLocation[0] = posBarBounds[1];
else posBarLocation[0] = posBarLocation[0] + DeltaX;
acPosBar.setLocation(posBarLocation[0], posBarLocation[1]);
double a = (maxPos - minPos) / (posBarBounds[1] - posBarBounds[0]);
posValue = (a * (posBarLocation[0] - posBarBounds[0]) + minPos);
}
else
{
FirstPosBarDrag = false;
XPosBarDrag = acPosBar.getMouseX();
}
}
}
/*------------------------------------*/
/*-- Interact on Volume --*/
/*------------------------------------*/
else if (e.getActionCommand().equals("Volume"))
{
if (acVolume.isMousePressed() == false)
{
FirstVolumeDrag = true;
offScreenGraphics.drawImage(clearImage, titleLocation[0], titleLocation[1], this);
offScreenGraphics.drawImage(titleImage, titleLocation[0], titleLocation[1], this);
repaint();
}
else
{
int DeltaX = 0;
if (FirstVolumeDrag == false)
{
DeltaX = acVolume.getMouseX() - XVolumeDrag;
XVolumeDrag = acVolume.getMouseX() - DeltaX;
if (volumeLocation[0] + DeltaX < volumeBounds[0]) volumeLocation[0] = volumeBounds[0];
else if (volumeLocation[0] + DeltaX > volumeBounds[1]) volumeLocation[0] = volumeBounds[1];
else volumeLocation[0] = volumeLocation[0] + DeltaX;
acVolume.setLocation(volumeLocation[0], volumeLocation[1]);
double a = (maxGain - minGain) / (volumeBounds[1] - volumeBounds[0]);
gainValue = (int) (a * (volumeLocation[0] - volumeBounds[0]) + minGain);
try
{
if (gainValue == 0) theSoundPlayer.setGain(0);
else theSoundPlayer.setGain(((double) gainValue / (double) maxGain));
config.setVolume(gainValue);
}
catch (BasicPlayerException e1)
{
log.debug("Cannot set gain",e1);
}
String volumeText = "VOLUME: " + (int) Math.round((100 / (volumeBounds[1] - volumeBounds[0])) * (volumeLocation[0] - volumeBounds[0])) + "%";
Image volImage = (new Taftb(fontIndex, imText, fontWidth, fontHeight, 0, volumeText)).getBanner();
offScreenGraphics.drawImage(volumeImage[(int) Math.round(((double) gainValue / (double) maxGain) * (volumeImage.length - 1))], volumeBarLocation[0], volumeBarLocation[1], this);
offScreenGraphics.drawImage(clearImage, titleLocation[0], titleLocation[1], this);
offScreenGraphics.drawImage(volImage, titleLocation[0], titleLocation[1], this);
}
else
{
FirstVolumeDrag = false;
XVolumeDrag = acVolume.getMouseX();
}
}
}
/*------------------------------------*/
/*-- Interact on Balance --*/
/*------------------------------------*/
else if (e.getActionCommand().equals("Balance"))
{
if (acBalance.isMousePressed() == false)
{
FirstBalanceDrag = true;
offScreenGraphics.drawImage(clearImage, titleLocation[0], titleLocation[1], this);
offScreenGraphics.drawImage(titleImage, titleLocation[0], titleLocation[1], this);
repaint();
} else
{
int DeltaX = 0;
if (FirstBalanceDrag == false)
{
DeltaX = acBalance.getMouseX() - XBalanceDrag;
XBalanceDrag = acBalance.getMouseX() - DeltaX;
if (balanceLocation[0] + DeltaX < balanceBounds[0]) balanceLocation[0] = balanceBounds[0];
else if (balanceLocation[0] + DeltaX > balanceBounds[1]) balanceLocation[0] = balanceBounds[1];
else balanceLocation[0] = balanceLocation[0] + DeltaX;
acBalance.setLocation(balanceLocation[0], balanceLocation[1]);
double a = (maxBalance - minBalance) / (balanceBounds[1] - balanceBounds[0]);
balanceValue = (a * (balanceLocation[0] - balanceBounds[0]) + minBalance);
try
{
theSoundPlayer.setPan((float) balanceValue);
}
catch (BasicPlayerException e1)
{
log.debug("Cannot set pan",e1);
}
String balanceText = "BALANCE: " + (int) Math.abs(balanceValue * 100) + "%";
if (balanceValue > 0) balanceText = balanceText + " RIGHT";
else if (balanceValue < 0) balanceText = balanceText + " LEFT";
else balanceText = "BALANCE: CENTER";
Image balImage = (new Taftb(fontIndex, imText, fontWidth, fontHeight, 0, balanceText)).getBanner();
offScreenGraphics.drawImage(balanceImage[(int) Math.round(((double) Math.abs(balanceValue) / (double) 1) * (balanceImage.length - 1))], balanceBarLocation[0], balanceBarLocation[1], this);
offScreenGraphics.drawImage(clearImage, titleLocation[0], titleLocation[1], this);
offScreenGraphics.drawImage(balImage, titleLocation[0], titleLocation[1], this);
}
else
{
FirstBalanceDrag = false;
XBalanceDrag = acBalance.getMouseX();
}
}
}
/*------------------------------------*/
/*-- Select Filename or URL to load --*/
/*------------------------------------*/
else if (e.getActionCommand().equals("Eject"))
{
if ((playerState == PLAY) || (playerState == PAUSE))
{
try
{
theSoundPlayer.stop();
}
catch (BasicPlayerException e1)
{
log.info("Cannot stop",e1);
}
playerState = STOP;
}
if ((playerState == INIT) || (playerState == STOP) || (playerState == OPEN))
{
System.gc();
PlaylistItem pli = null;
if (location != NONE)
{
// Local File.
// E.B : FileSelector added as M.S did.
if (acEject.getMouseButton() == MouseEvent.BUTTON1_MASK)
{
String fsFile = null;
if (location == ALL)
{
Frame f = new Frame();
f.setLocation(this.getBounds().x, this.getBounds().y + 10);
FileSelector.setWindow(f);
fsFile = FileSelector.selectFile(FileSelector.OPEN, config.getExtensions(), config.getLastDir());
fsFile = FileSelector.getFile();
}
else if (location == URL)
{
UrlDialog UD = new UrlDialog("Open location",this.getBounds().x,this.getBounds().y + 10,280,120,config.getLastURL());
UD.show();
if (UD.getFile() != null)
{
config.setLastURL(UD.getURL());
fsFile = UD.getURL();
}
}
if (fsFile != null)
{
if (location == ALL) config.setLastDir(FileSelector.getDirectory());
else config.setLastDir("");
if (fsFile != null)
{
// Loads a new playlist.
if ((fsFile.toLowerCase().endsWith(".m3u")) || (fsFile.toLowerCase().endsWith(".pls")))
{
if (loadPlaylist(config.getLastDir() + fsFile))
{
config.setPlaylistFilename(config.getLastDir() + fsFile);
playlist.begin();
fileList.initPlayList();
this.setCurrentSong(playlist.getCursor());
fileList.repaint();
}
}
else if (fsFile.toLowerCase().endsWith(".wsz"))
{
//this.dispose();
loadSkin(config.getLastDir() + fsFile);
config.setDefaultSkin(config.getLastDir() + fsFile);
}
else
{
if (location == ALL) pli = new PlaylistItem(fsFile, config.getLastDir()+fsFile, -1, true);
else pli = new PlaylistItem(fsFile, fsFile, -1, false);
}
}
}
}
// Remote File.
else if (acEject.getMouseButton() == MouseEvent.BUTTON3_MASK)
{
UrlDialog UD = new UrlDialog("Open location", this.getBounds().x, this.getBounds().y + 10, 280, 130, config.getLastURL());
UD.show();
if (UD.getFile() != null)
{
showTitle("PLEASE WAIT ... LOADING ...");
displayAll();
if (fileList != null) fileList.displayAll();
if (equalizer != null) equalizer.displayAll();
// Remote playlist ?
if ((UD.getURL().toLowerCase().endsWith(".m3u")) || (UD.getURL().toLowerCase().endsWith(".pls")))
{
if (loadPlaylist(UD.getURL()))
{
config.setPlaylistFilename(UD.getURL());
playlist.begin();
fileList.initPlayList();
this.setCurrentSong(playlist.getCursor());
fileList.repaint();
}
}
// Remote file or stream.
else
{
pli = new PlaylistItem(UD.getFile(), UD.getURL(), -1, false);
}
config.setLastURL(UD.getURL());
}
}
}
if (pli != null)
{
playlist.removeAllItems();
playlist.appendItem(pli);
playlist.nextCursor();
fileList.initPlayList();
this.setCurrentSong(pli);
}
}
offScreenGraphics.drawImage(iconsImage[2], iconsLocation[0], iconsLocation[1], this);
offScreenGraphics.drawImage(iconsImage[4], iconsLocation[2], iconsLocation[3], this);
repaint();
}
/*---------------------------*/
/*-- Play the current File --*/
/*---------------------------*/
else if (e.getActionCommand().equals("Play"))
{
if (playlist.isModified()) // playlist has been modified since we were last there, must update our cursor pos etc.
{
PlaylistItem pli = playlist.getCursor();
if (pli == null)
{
playlist.begin();
pli = playlist.getCursor();
}
this.setCurrentSong(pli);
playlist.setModified(false);
fileList.repaint();
}
// Resume is paused.
if (playerState == PAUSE)
{
try
{
theSoundPlayer.resume();
}
catch (BasicPlayerException e1)
{
log.error("Cannot resume",e1);
}
playerState = PLAY;
offScreenGraphics.drawImage(iconsImage[0], iconsLocation[0], iconsLocation[1], this);
offScreenGraphics.drawImage(iconsImage[3], iconsLocation[2], iconsLocation[3], this);
repaint();
}
// Stop if playing.
else if (playerState == PLAY)
{
try
{
theSoundPlayer.stop();
}
catch (BasicPlayerException e1)
{
log.error("Cannot stop",e1);
}
playerState = PLAY;
secondsAmount = 0;
offScreenGraphics.drawImage(timeImage[0], minuteDLocation[0], minuteDLocation[1], this);
offScreenGraphics.drawImage(timeImage[0], minuteLocation[0], minuteLocation[1], this);
offScreenGraphics.drawImage(timeImage[0], secondDLocation[0], secondDLocation[1], this);
offScreenGraphics.drawImage(timeImage[0], secondLocation[0], secondLocation[1], this);
repaint();
if (currentFileOrURL != null)
{
try
{
if (currentIsFile == true) theSoundPlayer.open(openFile(currentFileOrURL));
else theSoundPlayer.open(new URL(currentFileOrURL));
theSoundPlayer.play();
} catch (Exception ex)
{
log.error("Cannot read file : " + currentFileOrURL,ex);
showMessage("INVALID FILE");
}
}
}
else if ((playerState == STOP) || (playerState == OPEN))
{
try
{
theSoundPlayer.stop();
}
catch (BasicPlayerException e1)
{
log.error("Stop failed",e1);
}
if (currentFileOrURL != null)
{
try
{
if (currentIsFile == true) theSoundPlayer.open(openFile(currentFileOrURL));
else theSoundPlayer.open(new URL(currentFileOrURL));
theSoundPlayer.play();
titleText = currentSongName.toUpperCase();
// Get bitrate, samplingrate, channels, time in the following order :
// PlaylistItem, BasicPlayer (JavaSound SPI), Manual computation.
int bitRate = -1;
if (currentPlaylistItem != null) bitRate = currentPlaylistItem.getBitrate();
if ((bitRate <= 0) && (audioInfo.containsKey("bitrate"))) bitRate = ((Integer) audioInfo.get("bitrate")).intValue();
if ((bitRate <= 0) && (audioInfo.containsKey("audio.framerate.fps")) && (audioInfo.containsKey("audio.framesize.bytes")))
{
float FR = ((Float)audioInfo.get("audio.framerate.fps")).floatValue();
int FS = ((Integer)audioInfo.get("audio.framesize.bytes")).intValue();
bitRate = Math.round(FS * FR * 8);
}
int channels = -1;
if (currentPlaylistItem != null) channels = currentPlaylistItem.getChannels();
if ((channels <= 0) &&(audioInfo.containsKey("audio.channels"))) channels = ((Integer) audioInfo.get("audio.channels")).intValue();
float sampleRate = -1.0f;
if (currentPlaylistItem != null) sampleRate = currentPlaylistItem.getSamplerate();
if ((sampleRate <= 0) && (audioInfo.containsKey("audio.samplerate.hz"))) sampleRate = ((Float) audioInfo.get("audio.samplerate.hz")).floatValue();
long lenghtInSecond = -1L;
if (currentPlaylistItem != null) lenghtInSecond = currentPlaylistItem.getLength();
if ((lenghtInSecond <= 0) && (audioInfo.containsKey("duration"))) lenghtInSecond = ((Long) audioInfo.get("duration")).longValue()/1000000;
if ((lenghtInSecond <= 0) && (audioInfo.containsKey("audio.length.bytes")))
{
// Try to compute time length.
lenghtInSecond = (long) Math.round(getTimeLengthEstimation(audioInfo)/1000);
if (lenghtInSecond > 0)
{
int minutes=(int) Math.floor(lenghtInSecond/60);
int hours=(int) Math.floor(minutes/60);
minutes=minutes-hours*60;
int seconds=(int) (lenghtInSecond-minutes*60-hours*3600);
if (seconds >= 10) titleText = "(" + minutes + ":" + seconds + ") "+titleText;
else titleText = "(" + minutes + ":0" + seconds + ") "+titleText;
}
}
bitRate = Math.round(( bitRate/ 1000));
sampleRateImage = (new Taftb(fontIndex, imText, fontWidth, fontHeight, 0, "" + Math.round((sampleRate / 1000)))).getBanner();
if (bitRate > 999)
{
bitRate = (int) (bitRate/100);
bitsRateImage = (new Taftb(fontIndex, imText, fontWidth, fontHeight, 0, "" + bitRate+"H")).getBanner();
}
else bitsRateImage = (new Taftb(fontIndex, imText, fontWidth, fontHeight, 0, "" + bitRate)).getBanner();
offScreenGraphics.drawImage(sampleRateImage, sampleRateLocation[0], sampleRateLocation[1], this);
offScreenGraphics.drawImage(bitsRateImage, bitsRateLocation[0], bitsRateLocation[1], this);
if (channels == 2)
{
offScreenGraphics.drawImage(activeModeImage[0], stereoLocation[0], stereoLocation[1], this);
}
else if (channels == 1)
{
offScreenGraphics.drawImage(activeModeImage[1], monoLocation[0], monoLocation[1], this);
}
showTitle(titleText);
offScreenGraphics.drawImage(timeImage[0], minuteDLocation[0], minuteDLocation[1], this);
offScreenGraphics.drawImage(timeImage[0], minuteLocation[0], minuteLocation[1], this);
offScreenGraphics.drawImage(timeImage[0], secondDLocation[0], secondDLocation[1], this);
offScreenGraphics.drawImage(timeImage[0], secondLocation[0], secondLocation[1], this);
offScreenGraphics.drawImage(iconsImage[0], iconsLocation[0], iconsLocation[1], this);
offScreenGraphics.drawImage(iconsImage[3], iconsLocation[2], iconsLocation[3], this);
}
catch (BasicPlayerException bpe)
{
log.info("Stream error :" + currentFileOrURL,bpe);
showMessage("INVALID FILE");
}
catch (MalformedURLException mue)
{
log.info("Stream error :" + currentFileOrURL,mue);
showMessage("INVALID FILE");
}
// Set pan/gain.
try
{
theSoundPlayer.setGain(((double) gainValue / (double) maxGain));
theSoundPlayer.setPan((float) balanceValue);
}
catch (BasicPlayerException e2)
{
log.info("Cannot set control",e2);
}
playerState = PLAY;
repaint();
log.info(titleText);
}
}
}
/*-----------------------------------*/
/*-- Pause/Resume the current File --*/
/*-----------------------------------*/
else if (e.getActionCommand().equals("Pause"))
{
if (playerState == PLAY)
{
try
{
theSoundPlayer.pause();
}
catch (BasicPlayerException e1)
{
log.error("Cannot pause",e1);
}
playerState = PAUSE;
offScreenGraphics.drawImage(iconsImage[1], iconsLocation[0], iconsLocation[1], this);
offScreenGraphics.drawImage(iconsImage[4], iconsLocation[2], iconsLocation[3], this);
repaint();
}
else if (playerState == PAUSE)
{
try
{
theSoundPlayer.resume();
}
catch (BasicPlayerException e1)
{
log.info("Cannot resume",e1);
}
playerState = PLAY;
offScreenGraphics.drawImage(iconsImage[0], iconsLocation[0], iconsLocation[1], this);
offScreenGraphics.drawImage(iconsImage[3], iconsLocation[2], iconsLocation[3], this);
repaint();
}
}
/*------------------*/
/*-- Stop to play --*/
/*------------------*/
else if (e.getActionCommand().equals("Stop"))
{
if ((playerState == PAUSE) || (playerState == PLAY))
{
try
{
theSoundPlayer.stop();
}
catch (BasicPlayerException e1)
{
log.info("Cannot stop",e1);
}
playerState = STOP;
secondsAmount = 0;
acPosBar.setLocation(posBarBounds[0], posBarLocation[1]);
offScreenGraphics.drawImage(iconsImage[2], iconsLocation[0], iconsLocation[1], this);
offScreenGraphics.drawImage(iconsImage[4], iconsLocation[2], iconsLocation[3], this);
repaint();
}
}
/*----------*/
/*-- Next --*/
/*----------*/
else if (e.getActionCommand().equals("Next"))
{
// Try to get next song from the playlist
playlist.nextCursor();
fileList.nextCursor();
PlaylistItem pli = playlist.getCursor();
this.setCurrentSong(pli);
}
/*--------------*/
/*-- Previous --*/
/*--------------*/
else if (e.getActionCommand().equals("Previous"))
{
// Try to get previous song from the playlist
playlist.previousCursor();
fileList.nextCursor();
PlaylistItem pli = playlist.getCursor();
this.setCurrentSong(pli);
}
/*--------------------------------------------*/
/*-- Exit window through Exit Button --*/
/*--------------------------------------------*/
else if (e.getActionCommand().equals("Exit"))
{
closePlayer();
}
/*----------------------------------------------------*/
/*-- Minimize window through Minimize Button --*/
/*----------------------------------------------------*/
else if (e.getActionCommand().equals("Minimize"))
{
// Iconify top frame.
topFrame.setLocation(OrigineX, OrigineY);
//topFrame.setState(Frame.ICONIFIED);
//topFrame.show();
}
/*--------------------------------------------*/
/*-- Move full window through its Title Bar --*/
/*--------------------------------------------*/
else if (e.getActionCommand().equals("TitleBar"))
{
//log.info("X="+acTitle.getMouseX()+" Y="+acTitle.getMouseY());
if (acTitleBar.isMousePressed() == false) FirstDrag = true;
else
{
int DeltaX = 0;
int DeltaY = 0;
if (FirstDrag == false)
{
DeltaX = acTitleBar.getMouseX() - XDrag;
DeltaY = acTitleBar.getMouseY() - YDrag;
XDrag = acTitleBar.getMouseX() - DeltaX;
YDrag = acTitleBar.getMouseY() - DeltaY;
OrigineX = OrigineX + DeltaX;
OrigineY = OrigineY + DeltaY;
if (config.isScreenLimit())
{
// Keep player window in screen
if (OrigineX < 0) OrigineX = 0;
if (OrigineY < 0) OrigineY = 0;
if (screenWidth != -1)
{
if (OrigineX > screenWidth - WinWidth) OrigineX = screenWidth - WinWidth;
}
if (screenHeight != -1)
{
if (OrigineY > screenHeight - WinHeight) OrigineY = screenHeight - WinHeight;
}
}
// Moves top frame.
topFrame.setLocation(OrigineX, OrigineY);
topFrame.setSize(0, 0);
// Moves the main window + playlist
setLocation(OrigineX, OrigineY);
fileList.setLocation(OrigineX, OrigineY + WinHeight);
int factor = 1;
if (config.isPlaylistEnabled()) factor = 2;
equalizer.setLocation(OrigineX, OrigineY + WinHeight*factor);
}
else
{
FirstDrag = false;
XDrag = acTitleBar.getMouseX();
YDrag = acTitleBar.getMouseY();
}
}
}
/*-----------------------------------------*/
/*-- Playlist window hide/display --*/
/*-----------------------------------------*/
else if (e.getActionCommand().equals("Playlist"))
{
if (acPlaylist.getCheckboxState())
{
config.setPlaylistEnabled(true);
if (config.isEqualizerEnabled())
{
equalizer.setLocation(OrigineX, OrigineY + WinHeight*2);
}
fileList.setVisible(true);
}
else
{
config.setPlaylistEnabled(false);
fileList.setVisible(false);
if (config.isEqualizerEnabled())
{
equalizer.setLocation(OrigineX, OrigineY + WinHeight);
}
}
}
/*--------------------------------------*/
/*-- Playlist window equalizer --*/
/*--------------------------------------*/
else if (e.getActionCommand().equals("Equalizer"))
{
if (acEqualizer.getCheckboxState())
{
config.setEqualizerEnabled(true);
int factor = 1;
if (config.isPlaylistEnabled()) factor = 2;
equalizer.setLocation(OrigineX, OrigineY + WinHeight*factor);
equalizer.setVisible(true);
}
else
{
config.setEqualizerEnabled(false);
equalizer.setVisible(false);
}
}
/*--------------------*/
/*-- Shuffle --*/
/*--------------------*/
else if (e.getActionCommand().equals("Shuffle"))
{
if (acShuffle.getCheckboxState())
{
config.setShuffleEnabled(true);
if (playlist != null) {
playlist.shuffle();
fileList.initPlayList();
// Play from the top
PlaylistItem pli = playlist.getCursor();
this.setCurrentSong(pli);
}
} else
{
config.setShuffleEnabled(false);
}
}
/*-------------------*/
/*-- Repeat --*/
/*-------------------*/
else if (e.getActionCommand().equals("Repeat"))
{
if (acRepeat.getCheckboxState())
{
config.setRepeatEnabled(true);
}
else
{
config.setRepeatEnabled(false);
}
}
/*----------------------*/
/*-- Equalizer --*/
/*----------------------*/
else if (e.getActionCommand().equals("Equalizer"))
{
if (acEqualizer.getCheckboxState())
{
config.setEqualizerEnabled(true);
}
else
{
config.setEqualizerEnabled(false);
}
}
else
{
// Unknown action.
}
}
/**
* Shows message in title an updates bitRate,sampleRate, Mono/Stereo,time features.
*/
protected void showMessage(String titleText)
{
showTitle(titleText);
offScreenGraphics.drawImage(sampleRateClearImage, sampleRateLocation[0], sampleRateLocation[1], this);
offScreenGraphics.drawImage(bitsRateClearImage, bitsRateLocation[0], bitsRateLocation[1], this);
offScreenGraphics.drawImage(passiveModeImage[0], stereoLocation[0], stereoLocation[1], this);
offScreenGraphics.drawImage(passiveModeImage[1], monoLocation[0], monoLocation[1], this);
offScreenGraphics.drawImage(timeImage[0], minuteDLocation[0], minuteDLocation[1], this);
offScreenGraphics.drawImage(timeImage[0], minuteLocation[0], minuteLocation[1], this);
offScreenGraphics.drawImage(timeImage[0], secondDLocation[0], secondDLocation[1], this);
offScreenGraphics.drawImage(timeImage[0], secondLocation[0], secondLocation[1], this);
}
protected void showTitle(String titleText)
{
titleScrollImage = null;
scrollIndex = 0;
scrollRight = true;
if (titleText.length() > TEXT_LENGTH_MAX)
{
int a = ((titleText.length())-(TEXT_LENGTH_MAX))+1;
titleScrollImage = new Image[a];
for (int k=0;k<a;k++)
{
String sText = titleText.substring(k, TEXT_LENGTH_MAX+k);
titleScrollImage[k] = (new Taftb(fontIndex, imText, fontWidth, fontHeight, 0, sText)).getBanner();
}
titleText = titleText.substring(0, TEXT_LENGTH_MAX);
}
titleImage = (new Taftb(fontIndex, imText, fontWidth, fontHeight, 0, titleText)).getBanner();
offScreenGraphics.drawImage(clearImage, titleLocation[0], titleLocation[1], this);
offScreenGraphics.drawImage(titleImage, titleLocation[0], titleLocation[1], this);
}
public void paint(Graphics g)
{
if (offScreenImage != null)
{
g.drawImage(offScreenImage, 0, 0, this);
}
}
public void update(Graphics g)
{
paint(g);
}
/*-------------------------------------------*/
/*-- WindowListener interface --*/
/*-------------------------------------------*/
/**
* Invoked when the window is set to be the user's active window,
* which means the window (or one of its subcomponents) will receive
* keyboard events.
*/
public void windowActivated(WindowEvent e)
{
topFrame.setSize(0, 0);
show();
}
/**
* Invoked when a window has been closed as the result
* of calling dispose on the window
*/
public void windowClosed(WindowEvent e)
{
topFrame.setSize(0, 0);
}
/**
* Invoked when the user attempts to close the window from the window's
* system menu.
*/
public void windowClosing(WindowEvent e)
{
// Closing window (Alt+F4 under Win32)
closePlayer();
}
/**
* Invoked when a window is no longer the user's active window,
* which means that keyboard events will no longer be delivered to
* the window or its subcomponents
*/
public void windowDeactivated(WindowEvent e)
{
topFrame.setSize(0, 0);
}
/**
* Invoked when a window is changed from a minimized to a normal state.
*/
public void windowDeiconified(WindowEvent e)
{
topFrame.setLocation(OrigineX, OrigineY);
topFrame.setSize(0, 0);
//this.toFront();
//topFrame.hide();
// Show main window to fix Unix problem.
show();
// Show playlist window if needed.
if (acPlaylist.getCheckboxState()) fileList.setVisible(true);
else fileList.setVisible(false);
// Show equalizer window if needed
if (acEqualizer.getCheckboxState()) equalizer.setVisible(true);
else equalizer.setVisible(false);
}
/**
* Invoked when a window is changed from a normal to a minimized state.
*/
public void windowIconified(WindowEvent e)
{
topFrame.setLocation(OrigineX, OrigineY);
topFrame.setSize(0, 0);
//topFrame.show();
}
/**
* Invoked the first time a window is made visible.
*/
public void windowOpened(WindowEvent e)
{
topFrame.setSize(0, 0);
}
/*-------------------------------------------*/
/*-- Drag and drop interface --*/
/*-------------------------------------------*/
/**
* DnD : dragEnter implementation.
*/
public void dragEnter(DropTargetDragEvent e)
{
if (isDragOk(e) == false)
{
e.rejectDrag();
return;
}
}
/**
* DnD : dragOver implementation.
*/
public void dragOver(DropTargetDragEvent e)
{
if (isDragOk(e) == false)
{
e.rejectDrag();
return;
}
}
/**
* DnD : dragExit implementation.
*/
public void dragExit(DropTargetEvent e)
{
}
/**
* DnD : dropActionChanged implementation.
*/
public void dropActionChanged(DropTargetDragEvent e)
{
if (isDragOk(e) == false)
{
e.rejectDrag();
return;
}
}
/**
* DnD : Drop implementation.
* Adds all dropped files to the playlist.
*/
public void drop(DropTargetDropEvent e)
{
// Check DataFlavor
DataFlavor[] dfs = e.getCurrentDataFlavors();
DataFlavor tdf = null;
for (int i = 0; i < dfs.length; i++)
{
if (DataFlavor.javaFileListFlavor.equals(dfs[i]))
{
tdf = dfs[i];
break;
}
}
// Is file list ?
if (tdf != null)
{
// Accept COPY DnD only.
if ((e.getSourceActions() & DnDConstants.ACTION_COPY) != 0)
{
e.acceptDrop(DnDConstants.ACTION_COPY);
} else
return;
try
{
Transferable t = e.getTransferable();
Object data = t.getTransferData(tdf);
// How many files ?
if (data instanceof java.util.List)
{
java.util.List al = (java.util.List) data;
// Read the first File.
if (al.size() > 0)
{
File file = null;
// Stops the player if needed.
if ((playerState == PLAY) || (playerState == PAUSE))
{
theSoundPlayer.stop();
playerState = STOP;
}
// Clean the playlist.
playlist.removeAllItems();
// Add all dropped files to playlist.
ListIterator li = al.listIterator();
while (li.hasNext())
{
file = (File) li.next();
PlaylistItem pli = null;
if (file != null)
{
pli = new PlaylistItem(file.getName(), file.getAbsolutePath(), -1, true);
if (pli != null) playlist.appendItem(pli);
}
}
// Start the playlist from the top.
playlist.nextCursor();
fileList.initPlayList();
this.setCurrentSong(playlist.getCursor());
}
}
else
{
log.info("Unknown dropped objects");
}
} catch (IOException ioe)
{
log.info("Drop error",ioe);
e.dropComplete(false);
return;
} catch (UnsupportedFlavorException ufe)
{
log.info("Drop error",ufe);
e.dropComplete(false);
return;
} catch (Exception ex)
{
log.info("Drop error",ex);
e.dropComplete(false);
return;
}
e.dropComplete(true);
}
}
/**
* Checks if Drag allowed.
*/
protected boolean isDragOk(DropTargetDragEvent e)
{
// Check DataFlavor
DataFlavor[] dfs = e.getCurrentDataFlavors();
DataFlavor tdf = null;
for (int i = 0; i < dfs.length; i++)
{
if (DataFlavor.javaFileListFlavor.equals(dfs[i]))
{
tdf = dfs[i];
break;
}
}
// Only file list allowed.
if (tdf != null)
{
// Only DnD COPY allowed.
if ((e.getSourceActions() & DnDConstants.ACTION_COPY) != 0)
{
return true;
} else
return false;
} else
return false;
}
/*--------------------------------*/
/*-- Misc --*/
/*--------------------------------*/
/**
* Try to compute time length in milliseconds.
*/
public long getTimeLengthEstimation(Map properties)
{
long milliseconds = -1;
int byteslength = -1;
if (properties != null)
{
if (properties.containsKey("audio.length.bytes"))
{
byteslength = ((Integer) properties.get("audio.length.bytes")).intValue();
}
if (properties.containsKey("duration"))
{
milliseconds = (int) (((Long) properties.get("duration")).longValue())/1000;
}
else
{
// Try to compute duration
int bitspersample = -1;
int channels = -1;
float samplerate = -1.0f;
int framesize = -1;
if (properties.containsKey("audio.samplesize.bits"))
{
bitspersample = ((Integer) properties.get("audio.samplesize.bits")).intValue();
}
if (properties.containsKey("audio.channels"))
{
channels = ((Integer) properties.get("audio.channels")).intValue();
}
if (properties.containsKey("audio.samplerate.hz"))
{
samplerate = ((Float) properties.get("audio.samplerate.hz")).floatValue();
}
if (properties.containsKey("audio.framesize.bytes"))
{
framesize = ((Integer) properties.get("audio.framesize.bytes")).intValue();
}
if (bitspersample > 0)
{
milliseconds = (int) (1000.0f*byteslength/(samplerate * channels * (bitspersample/8)));
}
else
{
milliseconds = (int)(1000.0f*byteslength/(samplerate*framesize));
}
}
}
return milliseconds;
}
/**
* Returns a File from a filename.
*/
protected File openFile(String file)
{
return new File(file);
}
/**
* Sets skin filename.
*/
public void setSkin(String sk)
{
thePath = sk;
}
/**
* Returns Playlist instance.
*/
public Playlist getPlaylist()
{
return playlist;
}
/**
* Returns Player state.
*/
public int getPlayerState()
{
return playerState;
}
/**
* Free ressources and close the player.
*/
protected void closePlayer()
{
if ((playerState == PAUSE) || (playerState == PLAY))
{
try
{
theSoundPlayer.stop();
}
catch (BasicPlayerException e)
{
log.error("Cannot stop",e);
}
}
config.setLocation(OrigineX, OrigineY);
config.save();
// Polis : Frame instead of Window.
//topFrame.dispose();
System.gc();
exit(0);
}
/**
* Kills the player.
*/
public void exit(int status)
{
System.exit(status);
}
/**
* Return playlist UI.
* @return
*/
public MP3FilesApplet getPlaylistUI()
{
return fileList;
}
/**
* Return equalizer UI.
* @return
*/
public EqualizerApplet getEqualizerUI()
{
return equalizer;
}
/**
* Force display of all components.
*/
public void displayAll()
{
acVolume.display();
acBalance.display();
acPlay.display();
acStop.display();
acPrevious.display();
acNext.display();
acEject.display();
acPosBar.display();
acExit.display();
acMinimize.display();
acRepeat.display();
acPlaylist.display();
acEqualizer.display();
acPause.display();
acTitleBar.display();
acShuffle.display();
paintAll(getGraphics());
}
/**
* Refresh Playlist.
*/
protected void resetPlaylist()
{
playlist.begin();
if (fileList != null) fileList.initPlayList();
this.setCurrentSong(playlist.getCursor());
if (fileList != null) fileList.repaint();
repaint();
}
/*--------------------------------------*/
/*-- Methods for scriptable Applet --*/
/*-- AccessController.doPrivileged --*/
/*-- is needed for Java 1.4+ plugin --*/
/*--------------------------------------*/
/**
* Simulates "Play" selection.
*/
public void pressStart()
{
AccessController.doPrivileged(new PrivilegedAction() {
public Object run()
{
acPlay.fireEvent();
return null;
}
});
}
/**
* Simulates "Pause" selection.
*/
public void pressPause()
{
AccessController.doPrivileged(new PrivilegedAction() {
public Object run()
{
acPause.fireEvent();
return null;
}
});
}
/**
* Simulates "Stop" selection.
*/
public void pressStop()
{
AccessController.doPrivileged(new PrivilegedAction() {
public Object run()
{
acStop.fireEvent();
return null;
}
});
}
/**
* Simulates "Next" selection.
*/
public void pressNext()
{
AccessController.doPrivileged(new PrivilegedAction() {
public Object run()
{
acNext.fireEvent();
return null;
}
});
}
/**
* Simulates "Previous" selection.
*/
public void pressPrevious()
{
AccessController.doPrivileged(new PrivilegedAction() {
public Object run()
{
acPrevious.fireEvent();
return null;
}
});
}
/**
* Simulates "Eject" selection.
*/
public void pressEject()
{
AccessController.doPrivileged(new PrivilegedAction() {
public Object run()
{
acEject.fireEvent();
return null;
}
});
}
/**
* Load skin.
*/
public void loadMySkin(final String skn)
{
AccessController.doPrivileged(new PrivilegedAction() {
public Object run()
{
loadSkin(skn);
return null;
}
});
}
/**
* Reset Playlist.
*/
public void resetMyPlaylist()
{
AccessController.doPrivileged(new PrivilegedAction() {
public Object run()
{
resetPlaylist();
return null;
}
});
}
/**
* Load a playlist.
* @param playlistName
*/
public void loadMyPlaylist(final String playlistName)
{
AccessController.doPrivileged(new PrivilegedAction() {
public Object run()
{
loadPlaylist(playlistName);
return null;
}
});
}
/**
* Returns Playlist Dump.
*/
public String getPlaylistDump()
{
String plist = "";
if (this.playlist != null)
{
for (int i=0;i<playlist.getPlaylistSize();i++)
{
PlaylistItem pli = playlist.getItemAt(i);
plist = plist + "#"+pli.getName() + "|" + pli.getLocation();
}
}
return plist;
}
/**
* Simulates "Shuffle" selection.
*/
public void pressShuffle()
{
final MouseEvent smevt = new MouseEvent(this, MouseEvent.MOUSE_RELEASED, 0, 1, 0, 0, 1, false);
AccessController.doPrivileged(new PrivilegedAction() {
public Object run()
{
acShuffle.processEvent(smevt);
return null;
}
});
}
/**
* Simulates "Repeat" selection.
*/
public void pressRepeat()
{
final MouseEvent rmevt = new MouseEvent(this, MouseEvent.MOUSE_RELEASED, 0, 1, 0, 0, 1, false);
AccessController.doPrivileged(new PrivilegedAction() {
public Object run()
{
acRepeat.processEvent(rmevt);
return null;
}
});
}
/**
* Returns Gain in [0-100] range.
*/
public int getGain()
{
return gainValue;
}
/**
* Set Gain value in [0,100]
* @param val
*/
public void setGain(String val)
{
try
{
gainValue = Integer.parseInt(val);
if (gainValue < 0) gainValue = 0;
if (gainValue > maxGain) gainValue = maxGain;
if (gainValue == 0) theSoundPlayer.setGain(0);
else theSoundPlayer.setGain(((double) gainValue / (double) maxGain));
} catch (NumberFormatException nfe)
{
log.info("Cannot set gain",nfe);
}
catch (BasicPlayerException e)
{
log.debug("Cannot set gain",e);
}
}
/**
* Returns current song path.
* @return
*/
public String getCurrentSongPath()
{
return currentFileOrURL;
}
/**
* Returns current song name.
* @return
*/
public String getCurrentSongName()
{
return currentSongName;
}
/**
* Returns Balance in [-1.0,+1.0] range.
*/
public double getBalance()
{
return balanceValue;
}
/**
* Set Balance value in [-1.0, +1.0]
* @param val
*/
public void setBalance(String val)
{
try
{
balanceValue = Double.parseDouble(val);
if (balanceValue < -1.0) balanceValue = -1.0;
if (balanceValue > +1.0) balanceValue = +1.0;
theSoundPlayer.setPan((float) balanceValue);
} catch (NumberFormatException nfe)
{
log.info("Cannot set balance",nfe);
}
catch (BasicPlayerException e)
{
log.debug("Cannot set balance",e);
}
}
/**
* Entry point.
*/
public static void main(String[] args)
{
Player theGUI;
String currentArg = null;
String currentValue = null;
String skin = null;
for (int i = 0; i < args.length; i++)
{
currentArg = args[i];
if (currentArg.startsWith("-"))
{
if (currentArg.toLowerCase().equals("-init"))
{
i++;
if (i >= args.length) usage("init value missing");
currentValue = args[i];
if (Config.startWithProtocol(currentValue))
initConfig = currentValue;
else
initConfig = currentValue.replace('\\', '/').replace('/', java.io.File.separatorChar);
}
else if (currentArg.toLowerCase().equals("-song"))
{
i++;
if (i >= args.length) usage("song value missing");
currentValue = args[i];
if (Config.startWithProtocol(currentValue))
initSong = currentValue;
else
initSong = currentValue.replace('\\', '/').replace('/', java.io.File.separatorChar);
}
else if (currentArg.toLowerCase().equals("-start"))
{
autoRun = true;
}
else if (currentArg.toLowerCase().equals("-showplaylist"))
{
showPlaylist = "true";
}
else if (currentArg.toLowerCase().equals("-showequalizer"))
{
showEqualizer = "true";
}
else if (currentArg.toLowerCase().equals("-skin"))
{
i++;
if (i >= args.length) usage("skin value missing");
currentValue = args[i];
if (Config.startWithProtocol(currentValue))
skin = currentValue;
else
skin = currentValue.replace('\\', '/').replace('/', java.io.File.separatorChar);
}
else if (currentArg.toLowerCase().equals("-v"))
{
i++;
if (i >= args.length) usage("skin version value missing");
skinVersion = args[i];
}
else usage("Unknown parameter : " + currentArg);
}
else
{
usage("Invalid parameter :" + currentArg);
}
}
// Instantiate AWT front-end.
theGUI = new Player(skin, new Frame(TITLETEXT));
// Instantiate low-level player.
BasicPlayer bplayer = new BasicPlayer();
// Register the front-end to low-level player events.
bplayer.addBasicPlayerListener(theGUI);
// Adds controls for front-end to low-level player.
theGUI.setController(bplayer);
// Display.
theGUI.show();
if (autoRun == true) theGUI.pressStart();
}
/**
* Displays usage.
*/
protected static void usage(String msg)
{
System.out.println(TITLETEXT + " : " + msg);
System.out.println("");
System.out.println(TITLETEXT + " : Usage");
System.out.println(" java javazoom.jlgui.player.amp.Player [-skin skinFilename] [-song audioFilename] [-start] [-showplaylist] [-showequalizer] [-init configFilename] [-v skinversion]");
System.out.println("");
System.out.println(" skinFilename : Filename or URL to a Winamp Skin2.x");
System.out.println(" audioFilename : Filename or URL to initial song or playlist");
System.out.println(" start : Starts playing song (from the playlist)");
System.out.println(" showplaylist : Show playlist");
System.out.println(" showequalizer : Show equalizer");
System.out.println("");
System.out.println(" Advanced parameters :");
System.out.println(" skinversion : 1 or 2 (default 1)");
System.out.println(" configFilename : Filename or URL to jlGui initial configuration (playlist,skin,parameters ...)");
System.out.println(" Initial configuration won't be overriden by -skin and -song arguments");
System.out.println("");
System.out.println("Homepage : http://www.javazoom.net");
System.exit(0);
}
}