/*
* The GPLv3 licence :
* -----------------
* Copyright (c) 2009 Ricardo Dias
*
* This file is part of MuVis.
*
* MuVis 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 3 of the License, or
* (at your option) any later version.
*
* MuVis 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 MuVis. If not, see <http://www.gnu.org/licenses/>.
*/
package muvis.view.controllers;
import java.util.ArrayList;
import java.util.List;
import javazoom.jlgui.basicplayer.BasicPlayerException;
import muvis.Environment;
import muvis.audio.AudioMetadata;
import muvis.audio.MuVisAudioPlayer;
import muvis.audio.playlist.PlaylistItem;
import muvis.database.MusicLibraryDatabaseManager;
import muvis.util.Observable;
import muvis.util.Observer;
import muvis.view.main.filters.TreemapFilterManager;
/**
* Music Player Generic Controller - Plays the filtered tracks and next the
* tracks in the playlist
* @author Ricardo Dias
*/
public class MusicPlayerGeneralController implements MusicPlayerControllerInterface, Observer {
private AudioMetadata trackPlaying;
private int position;
private MusicLibraryDatabaseManager dbManager;
private ArrayList<Integer> tracksToPlay;
private Environment workspace;
private boolean isPlaying, updateTracksToPlay;
private MuVisAudioPlayer audioPlayer;
private TreemapFilterManager filterManager;
private boolean enabled;
private boolean playNext;
public MusicPlayerGeneralController() {
trackPlaying = null;
position = 0;
workspace = Environment.getEnvironmentInstance();
dbManager = workspace.getDatabaseManager();
workspace.getAudioPlayer().registerObserver(this);
isPlaying = false;
tracksToPlay = new ArrayList<Integer>();
updateTracksToPlay = true;
audioPlayer = workspace.getAudioPlayer();
playNext = true;
}
private void needTrackUpdate() throws BasicPlayerException {
if (filterManager == null) {
filterManager = workspace.getTreemapFilterManager();
filterManager.registerObserver(this);
}
if (!isPlaying && updateTracksToPlay) {
setTracksToPlay();
updateTracksToPlay = false;
position = 0; //start from the beginning
} else if (tracksToPlay == null) {
setTracksToPlay();
updateTracksToPlay = false;
}
}
private void setTracksToPlay() {
List filteredTracks = filterManager.getFilteredTracks();
tracksToPlay.clear();
tracksToPlay = new ArrayList<Integer>(filteredTracks);
//adding the tracks in the playlist
for (PlaylistItem item : workspace.getAudioPlaylist().getAllItems()){
int id = dbManager.getTrackId(item.getFullName());
tracksToPlay.add(id);
}
}
@Override
public AudioMetadata getTrackPlayingMetadata() {
try {
needTrackUpdate();
trackPlaying = dbManager.getTrackMetadata(tracksToPlay.get(position));
} catch (BasicPlayerException ex) {
ex.printStackTrace();
return null;
}
return trackPlaying;
}
@Override
public void playNextTrack() {
if (position < (tracksToPlay.size() - 1)) {
position++;
} else {
position = 0;
}
isPlaying = false;
playNext = true;
playTrack();
}
@Override
public void playPreviousTrack() {
if (position > 0) {
position--;
} else if (position == 0) {
position = tracksToPlay.size() - 1;
}
isPlaying = false;
playNext = false;
playTrack();
}
@Override
public void playTrack() {
try {
needTrackUpdate();
if (audioPlayer.isPlaying()) {
audioPlayer.stop();
}
if (tracksToPlay.size() > 0) {
String filename = dbManager.getFilename(tracksToPlay.get(position));
audioPlayer.play(filename);
}
} catch (BasicPlayerException ex) {
ex.printStackTrace();
if (playNext){
playNextTrack();
} else playPreviousTrack();
}
}
@Override
public void pauseTrack() {
try {
audioPlayer.pause();
} catch (BasicPlayerException ex) {
ex.printStackTrace();
}
}
@Override
public void setPlayerVolume(int value) throws BasicPlayerException {
audioPlayer.setVolume(value);
}
@Override
public void stopTrack() {
try {
isPlaying = false;
position = 0;
audioPlayer.stop();
} catch (BasicPlayerException ex) {
ex.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void update(Observable obs, Object arg) {
if (enabled) {
if (obs instanceof MuVisAudioPlayer) {
if (MuVisAudioPlayer.Event.STOPPED.equals(arg) && isPlaying) {
playNextTrack();
} else if (MuVisAudioPlayer.Event.NEW_TRACK_PLAYING.equals(arg)) {
isPlaying = true;
}
} else if (obs instanceof TreemapFilterManager) {
updateTracksToPlay = true;
}
}
}
@Override
public void setEnable(boolean enabled) {
this.enabled = enabled;
}
@Override
public boolean isPlaying() {
return audioPlayer.isPlaying();
}
@Override
public boolean isEnabled() {
return enabled;
}
}