package controller.subcontroller;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;
import logging.LogUtil;
import model.audio.interfaces.IAudioPlayer;
import model.audio.player.MP3Player;
import model.exception.AudioPlayerException;
import model.util.WindowUtils;
import view.subview.id3.AudioPlayerView;
public class AudioPlayerController extends Observable implements ActionListener, MouseListener, Observer {
/**
* the logger
*/
private final Logger logger = Logger.getLogger(this.getClass().getName());
/**
* the player window
*/
private AudioPlayerView window;
/**
* the player
*/
private IAudioPlayer player;
/**
* artist name
*/
private String name;
/**
* song length
*/
private int length;
/**
* Constructor
*
* @param path
* path to the file
* @param name
* artist name
* @param length
* song length
* @param maxFrames
* frame count of the song
*
* @throws AudioPlayerException
* thrown if player couldn't be initialised
*/
public AudioPlayerController(String path, String name, int length, int maxFrames) throws AudioPlayerException {
logger.log(Level.FINER, "opening audio file. path: " + path + " name: " + name + " length: " + length + " frames: " + maxFrames);
this.name = name;
this.length = length;
this.player = new MP3Player();
this.player.init(path, maxFrames, length);
}
/**
* creates the window
*/
public void createWindow() {
window = new AudioPlayerView();
window.init(name, length);
window.setVisible(true);
window.setActionListener(this);
window.setMouseListener(this);
this.window.setLocation(WindowUtils.getCenteredWindowCoordinates(this.window));
window.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
closeWindow();
}
});
startPressed();
}
/**
* closes the window
*/
public void closeWindow() {
stopPressed();
setChanged();
notifyObservers();
window.dispose();
}
/*
* (non-Javadoc)
*
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
*/
@Override
public void update(Observable obs, Object obj) {
logger.log(Level.FINER, this.getClass().getName() + " got message from " + obs.getClass().getName());
// comes from id3 window --> close player
if (obs.getClass().getName().equals(controller.ID3TagController.class.getName())) {
if (!(obj instanceof String))
return;
String msg = (String) obj;
if (!msg.equals("closePlayer"))
return;
closeWindow();
}
}
/*
* (non-Javadoc)
*
* @see
* java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("startB"))
startPressed();
else if (e.getActionCommand().equals("pauseB"))
pausePressed();
else if (e.getActionCommand().equals("stopB"))
stopPressed();
}
/**
* stop button pressed
*/
private void stopPressed() {
logger.log(Level.FINER, "stop button pressed. running: " + player.isRunning());
try {
if (player.isRunning()) {
player.stopPlayer();
window.stopTimer();
}
} catch (AudioPlayerException e) {
logger.log(Level.SEVERE, "Error while stopping player:\n" + LogUtil.getStackTrace(e), e);
window.showMessage("ErrorStop");
}
}
/**
* pause button pressed
*/
private void pausePressed() {
logger.log(Level.FINER, "pause button pressed. running: " + player.isRunning());
try {
if (player.isRunning()) {
window.setPauseTimer(true);
player.pause(window.getSecondCount());
}
} catch (AudioPlayerException e) {
logger.log(Level.SEVERE, "Error while pausing player:\n" + LogUtil.getStackTrace(e), e);
window.showMessage("ErrorPause");
}
}
/**
* start button pressed
*/
private void startPressed() {
logger.log(Level.FINER, "start button pressed. running: " + player.isRunning());
// check if song is finished
if (window.isTimerFinished())
stopPressed();
// check if player is running
if (player.isRunning())
return;
new Thread(new Runnable() {
@Override
public void run() {
try {
if (window.isPaused())
window.setPauseTimer(false);
else {
window.stopTimer();
window.startTimer();
}
player.play();
} catch (AudioPlayerException e) {
logger.log(Level.SEVERE, "Error while starting player:\n" + LogUtil.getStackTrace(e), e);
window.showMessage("ErrorPlay");
}
}
}).start();
}
/*
* (non-Javadoc)
*
* @see
* java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
@Override
public void mouseReleased(MouseEvent arg0) {
logger.log(Level.FINER, "mouse is released.");
if (!this.player.isRunning()) {
window.stopTimer();
return;
}
new Thread(new Runnable() {
@Override
public void run() {
int sec = window.getSliderTime();
window.setPauseTimer(true);
window.setTimer(sec);
window.setPauseTimer(false);
try {
player.jumpTo(sec);
} catch (AudioPlayerException e) {
logger.log(Level.SEVERE, "Error while changing current time:\n" + LogUtil.getStackTrace(e), e);
window.showMessage("ErrorSwitchTime");
}
}
}).start();
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
@Override
public void mousePressed(MouseEvent e) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
*/
@Override
public void mouseClicked(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
@Override
public void mouseEntered(MouseEvent arg0) {
}
/*
* (non-Javadoc)
*
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
@Override
public void mouseExited(MouseEvent arg0) {
}
}