📄 player.java
字号:
package javazoom.jlGui;
/*
* Player.
*
*-----------------------------------------------------------------------
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*----------------------------------------------------------------------
*/
import java.awt.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;
import javax.sound.sampled.*;
import javazoom.jlGui.skin.*;
import javazoom.jlGui.playlist.*;
import javazoom.Util.*;
/*
* Player is the core of jlGui.<br>
*
* @author E.B from JavaZOOM
*
* Homepage : http://www.javazoom.net
*/
public class Player extends Window implements ActionListener, BasicPlayerListener
{
private String currentFileOrURL = null;
private String currentSongName = null;
private boolean currentIsFile;
/*-- Window Parameters --*/
private Image offScreenImage;
private Graphics offScreenGraphics;
private int WinWidth, WinHeight;
private int OrigineX = 10, OrigineY = 10;
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,14};
private int[] pressedTitlePanel = {27,15,264,14};
private int[] titleBarLocation = {0,0};
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};
/*-- 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 = {107,43};
private String TITLETEXT = "JLGUI 2.0";
private String titleText = TITLETEXT;
private String clearText = " ";
private Image clearImage;
private Image titleImage;
private int[] titleLocation = {111,27};
/*-- Numbers Members --*/
private int numberWidth = 9;
private int numberHeight = 13;
private String theNumbers = "numbers.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 activeComponent acVolume, acBalance;
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[] releasedVolumePanel = {15,422,14,11};
private int[] pressedVolumePanel = {0,422,14,11};
private int minGain = 0;
private int maxGain = 100;
private int gainValue = 80;
private int deltaVolume = 50;
private int[] volumeLocation = {107+deltaVolume*gainValue/maxGain,58};
private int[] volumeBounds = {107,107+deltaVolume};
private Image[] balanceImage = {null};
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 int deltaPosBar = 219;
private int[] posBarLocation = {16,72};
private int[] posBarBounds = {16,16+deltaPosBar};
//private int[] posBarLocation = {16,72};
/*-- JavaSound Members --*/
private static final int INIT = 0;
private static final int OPEN = 1;
private static final int PLAY = 2;
private static final int PAUSE = 3;
private static final int STOP = 4;
private int playerState = INIT;
private long secondsAmount = 0;
private Playlist playlist = null;
private BasicPlayer theSoundPlayer = null;
private Config config = null;
/**
* Constructor.
*/
public Player(String Skin, int loglevel, String logfile)
{
super(new Frame());
// Log feature.
Debug dbg = Debug.getInstance();
if ( (logfile != null) && (!logfile.equals("")) )
{
dbg.init(logfile, loglevel);
}
else dbg.setLogLevel(loglevel);
// Config feature.
config = Config.getInstance();
// Skin feature.
if (Skin != null) thePath = Skin;
else thePath = config.getDefaultSkin();
SkinLoader skl = new SkinLoader(thePath);
try
{
skl.loadImages();
} catch (Exception e)
{
trace(0,getClass().getName(),"Can't load skin : "+e.getMessage());
System.exit(0);
}
imMain = skl.getImage(theMain);
imButtons = skl.getImage(theButtons);
imTitleBar = skl.getImage(theTitleBar);
imText = skl.getImage(theText);
imMode = skl.getImage(theMode);
imNumbers = skl.getImage(theNumbers);
imVolume = skl.getImage(theVolume);
imIcons = skl.getImage(theIcons);
imPosBar = skl.getImage(thePosBar);
WinHeight = imMain.getHeight(this);
WinWidth = imMain.getWidth(this);
setSize(WinWidth,WinHeight);
setLocation(OrigineX,OrigineY);
setBackground(Color.black);
show();
offScreenImage = createImage(WinWidth,WinHeight);
offScreenGraphics = offScreenImage.getGraphics();
offScreenGraphics.drawImage(imMain,0,0,this);
// Playlist feature.
PlaylistFactory plf = PlaylistFactory.getInstance();
playlist = plf.getPlaylist();
playlist.load(config.getPlaylistFilename());
theSoundPlayer = new BasicPlayer(this);
/*-- Buttons --*/
readPanel(releasedImage,releasedPanel,pressedImage,pressedPanel,imButtons);
setButtonsPanel();
/*-- Volume/Balance --*/
readPanel(releasedVolumeImage,releasedVolumePanel,pressedVolumeImage,pressedVolumePanel,imVolume);
setVolumePanel();
/*-- Title Bar --*/
readPanel(releasedTitleIm,releasedTitlePanel,pressedTitleIm,pressedTitlePanel,imTitleBar);
setTitleBarPanel();
/*-- Exit --*/
readPanel(releasedExitIm,releasedExitPanel,pressedExitIm,pressedExitPanel,imTitleBar);
setExitPanel();
/*-- 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();
repaint();
}
/**
* Crop Panel Features from image file.
*/
private 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.
*/
private 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++]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -