/*
*
*/
package xplayer.presenter;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXSpinner;
import com.jfoenix.controls.JFXToggleButton;
import application.Main;
import application.tools.ActionTool;
import application.tools.InfoTool;
import application.tools.NotificationType;
import application.windows.XPlayerWindow;
import customnodes.DJDisc;
import customnodes.DJDiscListener;
import customnodes.Marquee;
import eu.hansolo.enzo.flippanel.FlipPanel;
import javafx.application.Platform;
import javafx.beans.binding.Bindings;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Orientation;
import javafx.geometry.Side;
import javafx.scene.Cursor;
import javafx.scene.ImageCursor;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.RadioMenuItem;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.ToggleButton;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.DragEvent;
import javafx.scene.input.MouseButton;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.util.Duration;
import xplayer.model.XPlayer;
import xplayer.model.XPlayerModel;
import xplayer.services.XPlayerPlayService;
import xplayer.services.XPlayerSeekService;
import xplayer.streamplayer.Status;
import xplayer.streamplayer.StreamPlayerEvent;
import xplayer.streamplayer.StreamPlayerException;
import xplayer.streamplayer.StreamPlayerListener;
import xplayer.visualizer.view.VisualizerStackController;
import xplayer.visualizer.view.VisualizerWindowController;
import xplayer.visualizer.view.XPlayerVisualizer;
/**
* Represents the graphical interface for the deck.
*
* @author GOXR3PLUS
*/
public class XPlayerController extends StackPane implements DJDiscListener, StreamPlayerListener {
@FXML
private StackPane xPlayerStackPane;
@FXML
private BorderPane borderPane;
@FXML
private GridPane container;
@FXML
private GridPane topGridPane;
@FXML
private StackPane visualizerStackPane;
@FXML
private Label playerStatusLabel;
@FXML
private Label visualizerVisibleLabel;
@FXML
private HBox visualizerMaximizedHBox;
@FXML
private Label visualizerMinimize;
@FXML
private Label visualizerRequestFocus;
@FXML
private ToggleButton visualizerVisible;
@FXML
private Button maximizeVisualizer;
@FXML
private VBox topRightVBox;
@FXML
private StackPane mediaFileStackPane;
@FXML
private Button openMediaFileFolder;
@FXML
private JFXButton openPlayerHistory;
@FXML
private Button backwardButton;
@FXML
private Button forwardButton;
@FXML
private GridPane bottomGridPane;
@FXML
private Button openFileButton;
@FXML
private Button extendPlayer;
@FXML
private StackPane diskStackPane;
@FXML
private Label topInfoLabel;
@FXML
private JFXToggleButton settingsToggle;
@FXML
private Region fxRegion;
@FXML
private Label bugLabel;
@FXML
private JFXSpinner fxSpinner;
@FXML
private Label fxLabel;
@FXML
private Label restorePlayer;
@FXML
private Label focusXPlayerWindow;
// -----------------------------------------------------------------------------
public final Logger logger = Logger.getLogger(getClass().getName());
// ------------------------- Images/ImageViews --------------------------
private final ImageView eye = InfoTool.getImageViewFromResourcesFolder("eye.png");
private final ImageView eyeDisabled = InfoTool.getImageViewFromResourcesFolder("eyeDisabled.png");
private static final Image noSeek = InfoTool.getImageFromResourcesFolder("Private-" + ( ImageCursor.getBestSize(64, 64).getWidth() < 64.00 ? "32" : "64" ) + ".png");
private static final ImageCursor noSeekCursor = new ImageCursor(noSeek, noSeek.getWidth() / 2, noSeek.getHeight() / 2);
// ------------------------- Services --------------------------
/** The seek service. */
private final XPlayerSeekService seekService = new XPlayerSeekService(this);
/** The play service. */
private final XPlayerPlayService playService = new XPlayerPlayService(this);
// ------------------------- Variables --------------------------
/** The key. */
private final int key;
/** The disc is being mouse dragged */
public boolean discIsDragging;
// -------------------------ETC --------------------------
private XPlayerPlaylist xPlayerPlayList;
private XPlayerWindow xPlayerWindow;
/** The x player settings controller. */
private XPlayerExtraSettings playerExtraSettings;
/** The x player model. */
private XPlayerModel xPlayerModel;
/** The x player. */
private XPlayer xPlayer;
/** The radial menu. */
private XPlayerRadialMenu radialMenu;
/** The visualizer window. */
private VisualizerWindowController visualizerWindow;
/**
* This controller contains a Visualizer and a Label which describes every
* time (for some milliseconds) which type of visualizer is being
* displayed (for example [ Oscilloscope , Rosette , Spectrum Bars etc...]);
*/
private final VisualizerStackController visualizerStackController = new VisualizerStackController();
/** The visualizer. */
private XPlayerVisualizer visualizer;
/** The equalizer. */
private XPlayerEqualizer equalizer;
/** The analyser box. */
// AnalyserBox analyserBox
/** The disc. */
private DJDisc disc;
private final Marquee mediaFileMarquee = new Marquee();
private final FlipPanel flipPane = new FlipPanel(Orientation.HORIZONTAL);
/**
* Constructor.
*
* @param key
* The key that is identifying this player
*/
public XPlayerController(int key) {
this.key = key;
// ----------------------------------- FXMLLoader
// -------------------------------------
FXMLLoader loader = new FXMLLoader(getClass().getResource(InfoTool.FXMLS + "XPlayerController.fxml"));
loader.setController(this);
loader.setRoot(this);
try {
loader.load();
} catch (IOException ex) {
logger.log(Level.SEVERE, "XPlayerController FXML can't be loaded!", ex);
}
}
/**
* @return the xPlayerStackPane
*/
public StackPane getXPlayerStackPane() {
return xPlayerStackPane;
}
/**
* @return the settingsToggle
*/
public JFXToggleButton getSettingsToggle() {
return settingsToggle;
}
/**
* Returns the XPlayerStackPane back to the XPlayerController if it is on
* XPlayer external Window
*/
public void restorePlayerStackPane() {
this.getChildren().add(getXPlayerStackPane());
}
/** Called as soon as the .fxml has been loaded */
@FXML
private void initialize() {
// -----XPlayer and XPlayerModel-------------
xPlayerModel = new XPlayerModel();
xPlayer = new XPlayer();
xPlayer.addStreamPlayerListener(this);
// -----Important-------------
xPlayerWindow = new XPlayerWindow(this);
radialMenu = new XPlayerRadialMenu(this);
xPlayerPlayList = new XPlayerPlaylist(this);
//xPlayList = new XPlayerPlaylist(25, this)
visualizerWindow = new VisualizerWindowController(this);
playerExtraSettings = new XPlayerExtraSettings(this);
// Styling
//setStyle("-fx-background-image:url('/image/deckBackground.jpg'); -fx-background-size:stretch;")
// Listeners
container.setOnDragOver(dragOver -> dragOver.acceptTransferModes(TransferMode.LINK));
container.setOnDragDropped(drop -> dragDrop(drop, 2));
// settingsToggle
//getChildren().add(xPlayerSettingsController)
//xPlayerSettingsController.visibleProperty().bind(settingsToggle.selectedProperty())
// fxRegion,fxSpinner
fxRegion.setVisible(false);
bugLabel.visibleProperty().bind(fxRegion.visibleProperty());
fxSpinner.visibleProperty().bind(fxRegion.visibleProperty());
fxLabel.visibleProperty().bind(fxRegion.visibleProperty());
// mediaFileStackPane
mediaFileStackPane.getChildren().add(mediaFileMarquee);
mediaFileMarquee.setOnMouseReleased(m -> openAudioInExplorer());
mediaFileMarquee.toBack();
// openMediaFileFolder
// openMediaFileFolder.visibleProperty().bind(mediaFileStackPane.hoverProperty())
openMediaFileFolder.setOnAction(action -> openAudioInExplorer());
// openFileButton
openFileButton.setOnAction(action -> openFileChooser());
// topInfoLabel
topInfoLabel.setText("Player <<" + this.getKey() + " >>");
// backwardButton
backwardButton.setOnAction(a -> seek(-10));
// forwardButton
forwardButton.setOnAction(a -> seek(10));
//flipPane
flipPane.setFlipTime(150);
flipPane.getFront().getChildren().addAll(container);
flipPane.getBack().getChildren().addAll(playerExtraSettings);
settingsToggle.selectedProperty().addListener((observable , oldValue , newValue) -> {
if (newValue) // true?
flipPane.flipToBack();
else
flipPane.flipToFront();
});
borderPane.setCenter(flipPane);
//RestorePlayerVBox
restorePlayer.getParent().visibleProperty().bind(xPlayerWindow.getWindow().showingProperty());
//restorePlayer
restorePlayer.setOnMouseReleased(m -> {
if (m.getButton() == MouseButton.PRIMARY)
xPlayerWindow.close();
});
//focusXPlayerWindow
focusXPlayerWindow.setOnMouseReleased(m -> xPlayerWindow.getWindow().requestFocus());
//extendPlayer
extendPlayer.textProperty().bind(Bindings.when(xPlayerWindow.getWindow().showingProperty()).then("Restore").otherwise("Extend"));
extendPlayer.setOnAction(ac -> {
if (xPlayerWindow.getWindow().isShowing())
xPlayerWindow.close();
else
xPlayerWindow.show();
});
}
/**
* Opens the current Media File of the player to the default system explorer
*/
public void openAudioInExplorer() {
if (xPlayerModel.songPathProperty().get() != null)
ActionTool.openFileLocation(xPlayerModel.songPathProperty().get());
}
/**
* Opens a FileChooser so the user can select a song File
*/
public void openFileChooser() {
File file = Main.specialChooser.selectSongFile(Main.window);
if (file != null)
playSong(file.getAbsolutePath());
}
/**
* Can be called from different classes to implement the dragDrop for their
* XPlayer.
*
* @param dragDrop
* the drag drop
* @param number
* the number
*/
public void dragDrop(DragEvent dragDrop , int number) {
// Keeping the absolute path
String absolutePath;
// File?
for (File file : dragDrop.getDragboard().getFiles()) {
absolutePath = file.getAbsolutePath();
if (file.isFile() && InfoTool.isAudioSupported(absolutePath)) {
// Ask Question?
if (xPlayer.isPausedOrPlaying() && Main.settingsWindow.getxPlayersSettingsController().getAskSecurityQuestion().isSelected()) {
if (ActionTool.doQuestion("A song is already playing on this deck.\n Are you sure you want to replace it?",
visualizerWindow.getStage().isShowing() && !xPlayerWindow.getWindow().isShowing() ? visualizerWindow : xPlayerStackPane,Main.window))
playSong(absolutePath);
} else
playSong(absolutePath);
break;
}
}
// // URL?
// if (xPlayer.isPausedOrPlaying()) {
// // OK?
// if (ActionTool
// .doQuestion("A song is already playing on this deck.\n Are you
// sure you want to replace it?"))
// xPlayer.playSong(dragDrop.getDragboard().getUrl().toString());
// } else
// xPlayer.playSong(dragDrop.getDragboard().getUrl().toString());
dragDrop.setDropCompleted(true);
}
/**
* Returns the volume level of the player.
*
* @return the volume
*/
public int getVolume() {
return disc.getVolume();
}
/**
* Returns the Disc Color.
*
* @return the disc color
*/
public Color getDiscColor() {
return disc.getArcColor();
}
/**
* Adjust the volume to a given value.
*
* @param value
* the value
*/
public void adjustVolume(int value) {
disc.setVolume(disc.getVolume() + value);
}
/**
* Adjust the volume to the maximum value.
*/
public void maximizeVolume() {
disc.setVolume(disc.getMaximumVolume());
}
/**
* Adjust the volume to the minimum value.
*/
public void minimizeVolume() {
disc.setVolume(0);
}
/**
* Set the volume to this value.
*
* @param value
* the new volume
*/
public void setVolume(int value) {
disc.setVolume(value);
}
/**
* Returns the key of the player.
*
* @return The Key of the Player
*/
public int getKey() {
return key;
}
public Region getFxRegion() {
return fxRegion;
}
public Label getFxLabel() {
return fxLabel;
}
/**
* Used by resume method.
*/
private void resumeCode() {
System.out.println("RESUME code....");
// Stop the fade animation
disc.stopFade();
// image !=null?
if (!playService.isDiscImageNull())
disc.resumeRotation();
// Start the visualizer
visualizer.startVisualizer();
// Pause Image
// radialMenu.resumeOrPause.setGraphic(radialMenu.pauseImageView);
}
/**
* Used by pause method.
*/
private void pauseCode() {
System.out.println("PAUSE code....");
// Play the fade animation
disc.playFade();
// Pause the Rotation fo disc
disc.pauseRotation();
// Stop the Visualizer
visualizer.stopVisualizer();
// Play Image
// radialMenu.resumeOrPause.setGraphic(radialMenu.playImageView);
}
/**
* Controls the volume of the player.
*/
public void controlVolume() {
try {
// if (key == 1 || key == 2) {
// if (djMode.balancer.getVolume() < 100) { // <100
//
// Main.xPlayersList.getXPlayer(1).setGain(
// ((Main.xPlayersList.getXPlayerUI(1).getVolume() / 100.00) *
// (djMode.balancer.getVolume()))
// / 100.00);
// Main.xPlayersList.getXPlayer(2).setGain(Main.xPlayersList.getXPlayerUI(2).getVolume()
// / 100.00);
//
// } else if (djMode.balancer.getVolume() == 100) { // ==100
//
// Main.xPlayersList.getXPlayer(1).setGain(Main.xPlayersList.getXPlayerUI(1).getVolume()
// / 100.00);
// Main.xPlayersList.getXPlayer(2).setGain(Main.xPlayersList.getXPlayerUI(2).getVolume()
// / 100.00);
//
// } else if (djMode.balancer.getVolume() > 100) { // >100
//
// Main.xPlayersList.getXPlayer(1).setGain(Main.xPlayersList.getXPlayerUI(1).getVolume()
// / 100.00);
// Main.xPlayersList.getXPlayer(2).setGain(((Main.xPlayersList.getXPlayerUI(2).getVolume()
// / 100.00)
// * (200 - djMode.balancer.getVolume())) / 100.00);
//
// }
// } else if (key == 0) {
xPlayer.setGain((double) disc.getVolume() / 100.00);
// }
} catch (Exception ex) {
logger.log(Level.INFO, "\n", ex);
}
}
/**
* Checks if the djDisc is being dragged by user.
*
* @return True if disc is being dragged
*/
public boolean isDiscBeingDragged() {
return discIsDragging;
}
/**
* This method is Used by VisualizerWindow class.
*/
public void reAddVisualizer() {
visualizerStackPane.getChildren().add(0, visualizerStackController);
}
/**
* This method is making the visualizer of the player.
*
* @param side
* the side
*/
public void makeTheVisualizer(Side side) {
// Visualizer
visualizer = new XPlayerVisualizer(this);
visualizer.setShowFPS(Main.settingsWindow.getxPlayersSettingsController().getShowFPS().selectedProperty().get());
// Select the correct toggle
visualizerWindow.getVisualizerTypeGroup().selectToggle(visualizerWindow.getVisualizerTypeGroup().getToggles().get(visualizer.displayMode.get()));
// When displayMode is being updated
visualizer.displayMode.addListener((observable , oldValue , newValue) -> {
visualizerWindow.getVisualizerTypeGroup().selectToggle(visualizerWindow.getVisualizerTypeGroup().getToggles().get(newValue.intValue()));
visualizerStackController.replayLabelEffect( ( (RadioMenuItem) visualizerWindow.getVisualizerTypeGroup().getSelectedToggle() ).getText());
});
// -----------visualizerTypeGroup
visualizerWindow.getVisualizerTypeGroup().getToggles().forEach(toggle -> {
( (RadioMenuItem) toggle ).setOnAction(a -> visualizer.displayMode.set(visualizerWindow.getVisualizerTypeGroup().getToggles().indexOf(toggle)));
});
// VisualizerStackController
visualizerStackController.getChildren().add(0, visualizer);
visualizerStackController.visibleProperty().bind(visualizerVisible.selectedProperty());
visualizerStackController.addListenersToButtons(this);
// Add VisualizerStackController to the VisualizerStackPane
visualizerStackPane.getChildren().add(0, visualizerStackController);
// maximizeVisualizer
maximizeVisualizer.disableProperty().bind(visualizerVisible.selectedProperty().not());
maximizeVisualizer.setOnAction(e -> visualizerWindow.displayVisualizer());
maximizeVisualizer.visibleProperty().bind(visualizerWindow.getStage().showingProperty().not().and(visualizerStackPane.hoverProperty()));
// visualizerVisible
visualizerVisible.visibleProperty().bind(maximizeVisualizer.visibleProperty());
visualizerVisible.selectedProperty().addListener((observable , oldValue , newValue) -> {
if (newValue) // true?
visualizerVisible.setGraphic(eye);
else
visualizerVisible.setGraphic(eyeDisabled);
});
// visualizerVisibleLabel
visualizerVisibleLabel.visibleProperty().bind(visualizerVisible.selectedProperty().not());
// visualizerMaximizedHBox
visualizerMaximizedHBox.visibleProperty().bind(visualizerWindow.getStage().showingProperty());
// visualizerMinimize
visualizerMinimize.setOnMouseReleased(m -> visualizerWindow.removeVisualizer());
// visualizerRequestFocus
visualizerRequestFocus.setOnMouseReleased(m -> visualizerWindow.getStage().requestFocus());
// playerStatusLabel
playerStatusLabel.visibleProperty().bind(visualizer.getAnimationService().runningProperty().not());
buildSettings(side);
}
/**
* This method is making the disc of the player.
*
* @param width
* the width
* @param height
* the height
* @param color
* the color
* @param volume
* the volume
* @param side
* the side
*/
public void makeTheDisc(int width , int height , Color color , int volume , Side side) {
// initialize
disc = new DJDisc(width, height, color, volume, 125);
disc.addDJDiscListener(this);
// disc.set
// radialMenu
// radialMenu.setStrokeVisible(false)
// radialMenu.setBackgroundMouseOnColor(color)
disc.getChildren().add(radialMenu.getRadialMenuButton());
radialMenu.getRadialMenuButton().setPrefSize(width, height);
// Canvas Mouse Moving
disc.getCanvas().setOnMouseMoved(m -> {
// File is either corrupted or error or no File entered yet
if (xPlayerModel.getDuration() == 0 || xPlayerModel.getDuration() == -1)
disc.getCanvas().setCursor(noSeekCursor);
// !discIsDragging
else if (!discIsDragging)
disc.getCanvas().setCursor(Cursor.OPEN_HAND);
});
// Canvas Mouse Released
disc.getCanvas().setOnMouseReleased(m -> {
// PrimaryMouseButton
if (m.getButton() == MouseButton.PRIMARY) {
// discIsDragging and MouseButton==Primary
// and duration!=0 and duration!=-1
if (discIsDragging && xPlayerModel.getDuration() != 0 && xPlayerModel.getDuration() != -1) {
// Try to seek
seek(xPlayerModel.getCurrentAngleTime() - xPlayerModel.getCurrentTime());
}
// SecondaryMouseButton
} else if (m.getButton() == MouseButton.SECONDARY)
discIsDragging = false;
});
// Canvas Mouse Dragging
disc.getCanvas().setOnMouseDragged(m -> {
// MouseButton==Primary || Secondary
if (m.getButton() == MouseButton.PRIMARY || m.getButton() == MouseButton.SECONDARY)
// RadialMenu!showing and duration!=0 and duration!=-1
if (!radialMenu.isHidden() && xPlayerModel.getDuration() != 0 && xPlayerModel.getDuration() != -1) {
// System.out.println("Entered Dragging...");
// Set the cursor
disc.getCanvas().setCursor(Cursor.CLOSED_HAND);
// Try to do the dragging
discIsDragging = true;
xPlayerModel.setCurrentAngleTime(disc.getValue(xPlayerModel.getDuration()));
disc.calculateAngleByMouse(m, xPlayerModel.getCurrentAngleTime(), xPlayerModel.getDuration());
}
});
diskStackPane.getChildren().add(disc);
}
/**
* needs to be deleted.
*
* @param side
* the side
* @deprecated
*/
@Deprecated
private void buildSettings(Side side) {
// BorderPane
BorderPane pane = new BorderPane();
pane.setStyle("-fx-padding:5px;");
// AnalyserBox
// analyserBox = new AnalyserBox(301, 100);
// pane.setCenter(analyserBox)
// Equalizer
equalizer = new XPlayerEqualizer(this);
playerExtraSettings.getEqualizerTab().setContent(new ScrollPane(equalizer));
// PlayList
//xPlayerSettingsController.playListTab.setContent(xPlayList);
// XplayerTabs
/*
* playerTabs = new XPlayerTabs(key); Button tabs = new Button("Tabs")
* tabs.setId("button"); box.getChildren().add(tabs); tabs.setOnAction(e
* -> playerTabs.show(firstLayerGridPane))
*/
// pane.setBottom(box)
// firstLayerGridPane.add(pane, side == Side.LEFT ? 0 : 1, 2)
}
/**
* When the audio starts , fast configure it's settings
*
* @param ignoreStartImmediately
*/
public void configureMediaSettings(boolean ignoreStartImmediately) {
// Start immediately?
if (!ignoreStartImmediately && !Main.settingsWindow.getxPlayersSettingsController().getStartImmediately().isSelected())
pause();
else {
play();
resume();
}
// Mute?
xPlayer.setMute(radialMenu.mute.isSelected());
System.out.println("Mute is Selected? " + radialMenu.mute.isSelected());
// Volume
controlVolume();
// Sets Pan value. Line should be opened before calling this method.
// Linear scale : -1.0 <--> +1.0
xPlayer.setPan(equalizer.panFilter.getValue(200));
// Represents a control for the relative balance of a stereo signal
// between two stereo speakers. The valid range of values is -1.0 (left
// channel only) to 1.0 (right channel only). The default is 0.0
// (centered).
xPlayer.setBalance(equalizer.balanceFilter.getValue(200));
// Audio is MP3?
if (!"mp3".equals(xPlayerModel.songExtensionProperty().get()))
equalizer.setDisable(true);
else {
xPlayer.setEqualizer(xPlayerModel.getEqualizerArray(), 32);
equalizer.setDisable(false);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public void opened(Object dataSource , Map<String,Object> map) {
// some code here
}
float progress;
@Override
public void progress(int nEncodedBytes , long microSecondsPosition , byte[] pcmdata , Map<String,Object> properties) {
visualizer.writeDSP(pcmdata);
if (!isDiscBeingDragged()) {
// previousTime = xPlayerUI.xPlayer.currentTime
// .MP3 OR .WAV
String extension = xPlayerModel.songExtensionProperty().get();
if ("mp3".equals(extension) || "wav".equals(extension)) {
// Calculate the progress until now
progress = ( nEncodedBytes > 0 && xPlayer.getTotalBytes() > 0 ) ? ( nEncodedBytes * 1.0f / xPlayer.getTotalBytes() * 1.0f ) : -1.0f;
// System.out.println(progress*100+"%")
if (visualizerWindow.isVisible())
Platform.runLater(() -> visualizerWindow.getProgressBar().setProgress(progress));
// find the current time in seconds
xPlayerModel.setCurrentTime((int) ( xPlayerModel.getDuration() * progress ));
// System.out.println((double) xPlayerModel.getDuration() *
// progress)
// .WHATEVER MUSIC FILE*
} else
xPlayerModel.setCurrentTime((int) ( microSecondsPosition / 1000000 ));
String millisecondsFormat = InfoTool.millisecondsToTime(microSecondsPosition / 1000);
// System.out.println(milliFormat)
// Paint the Disc
if (!xPlayer.isStopped()) {
// Update the disc Angle
disc.calculateAngleByValue(xPlayerModel.getCurrentTime(), xPlayerModel.getDuration(), false);
// Update the disc time
disc.updateTimeDirectly(xPlayerModel.getCurrentTime(), xPlayerModel.getDuration(), millisecondsFormat);
}
// if (!visualizer.isRunning())
// Platform.runLater(this::resumeCode);
}
// System.out.println(xPlayer.currentTime)
}
@Override
public void statusUpdated(StreamPlayerEvent streamPlayerEvent) {
// Status.OPENED
if (streamPlayerEvent.getPlayerStatus() == Status.OPENED && xPlayer.getSourceDataLine() != null) {
visualizer.setupDSP(xPlayer.getSourceDataLine());
visualizer.startDSP(xPlayer.getSourceDataLine());
Platform.runLater(() -> mediaFileMarquee.setText(InfoTool.getFileName(xPlayerModel.songPathProperty().get())));
// Status.RESUMED
} else if (streamPlayerEvent.getPlayerStatus() == Status.RESUMED) {
Platform.runLater(() -> {
playerStatusLabel.setText("Player is Resumed ");
resumeCode();
});
// Status.PLAYING
} else if (streamPlayerEvent.getPlayerStatus() == Status.PLAYING) {
Platform.runLater(this::resumeCode);
// Status.PAUSED
} else if (streamPlayerEvent.getPlayerStatus() == Status.PAUSED) {
Platform.runLater(() -> {
playerStatusLabel.setText("Player is Paused ");
pauseCode();
});
// Status.STOPPED
} else if (streamPlayerEvent.getPlayerStatus() == Status.STOPPED) {
visualizer.stopDSP();
Platform.runLater(() -> {
// SeekService running?
if (seekService.isRunning()) {
// oh yeah
} else {
// Set time to 0 to not have problems with SeekService
xPlayerModel.setCurrentTime(0);
// Change Marquee text
mediaFileMarquee.setText("Player is Stopped");
playerStatusLabel.setText(mediaFileMarquee.textProperty().get());
disc.calculateAngleByValue(0, 0, true);
disc.repaint();
// disk
disc.stopRotation();
disc.stopFade();
// Visualizer
visualizer.stopVisualizer();
// Play Image
// radialMenu.resumeOrPause.setGraphic(radialMenu.playImageView);
// Notification
ActionTool.showNotification("Player " + this.getKey(), "Player[ " + this.getKey() + " ] has stopped...", Duration.millis(500), NotificationType.SIMPLE);
}
});
// Status.SEEKING
} else if (streamPlayerEvent.getPlayerStatus() == Status.SEEKING) {
Platform.runLater(() -> playerStatusLabel.setText("Player is SEEKING "));
// Status.SEEKED
} else if (streamPlayerEvent.getPlayerStatus() == Status.SEEKED) {
//TODO i need to add code here
}
}
@Override
public void volumeChanged(int volume) {
controlVolume();
}
/**
* Replay the current song
*/
public void replaySong() {
if (xPlayerModel.songExtensionProperty().get() != null)
playService.startPlayService(xPlayerModel.songPathProperty().get());
else
ActionTool.showNotification("No Previous File", "Drag and Drop or Add a File or URL on this player.", Duration.millis(1500), NotificationType.INFORMATION);
// if (thisSong instanceof URL)
// return playSong(((URL) thisSong).toString(), totalTime);
// else if (thisSong instanceof File)
// return playSong(((File) thisSong).getAbsolutePath(), totalTime);
}
/**
* Play the current song.
*
* @param absolutePath
* The absolute path of the file
*/
public void playSong(String absolutePath) {
playService.startPlayService(absolutePath);
}
//---------------------------------------------------Player Actions------------------------------------------------------------------
/**
* Tries to skip forward or backward
*
* @param seconds
* Seconds to seek
*/
public void seek(int seconds) {
boolean ok = false;
if (seconds == 0)
return;
//
if (seconds < 0 && ( seconds + xPlayerModel.getCurrentTime() >= 0 )) { //negative seek
System.out.println("Skipping backwards ..." + seconds + "] seconds");
ok = true;
} else if (seconds > 0 && ( seconds + xPlayerModel.getCurrentTime() <= xPlayerModel.getDuration() )) { //positive seek
System.out.println("Skipping forward ..." + seconds + "] seconds");
ok = true;
}
//Ok/?
if (ok) {
// Add or Remove
xPlayerModel.setCurrentAngleTime(xPlayerModel.getCurrentTime() + seconds);
// //Seek
// System.out.println("Original: "
// + (xPlayerModel.getCurrentAngleTime()) * (xPlayer.getTotalBytes() / xPlayerModel.getDuration())
// + " With double:" + (long) (((float) xPlayerModel.getCurrentAngleTime())
// * (xPlayer.getTotalBytes() / (float) xPlayerModel.getDuration())))
//Start the Service
seekService.startSeekService((long) ( ( (float) xPlayerModel.getCurrentAngleTime() ) * ( xPlayer.getTotalBytes() / (float) xPlayerModel.getDuration() ) ), false);
}
}
/**
* This method is used to seek to a specific time of the audio
*
* @param seconds
*/
public void seekTo(int seconds) {
if (seconds < 0 || seconds >= xPlayerModel.getDuration())
return;
// Set
xPlayerModel.setCurrentAngleTime(seconds);
//Seek To
seekService.startSeekService( ( xPlayerModel.getCurrentAngleTime() ) * ( xPlayer.getTotalBytes() / xPlayerModel.getDuration() ), true);
}
/**
* Mute the player.
*/
public void mute() {
radialMenu.mute.setSelected(true);
xPlayer.setMute(true);
}
/**
* UnMute the player.
*/
public void unMute() {
radialMenu.mute.setSelected(false);
xPlayer.setMute(false);
}
/**
* Starts the player
*/
public void play() {
try {
xPlayer.play();
} catch (StreamPlayerException ex) {
ex.printStackTrace();
}
}
/**
* Resume the player.
*/
public void resume() {
xPlayer.resume();
}
/**
* Pause the player.
*/
public void pause() {
xPlayer.pause();
}
/**
* Stop the player.
*/
public void stop() {
xPlayer.stop();
}
/**
* Reverse Play with Pause or the opposite.
*/
public void reversePlayAndPause() {
if (xPlayer.isPlaying()) // playing?
pause();
else if (xPlayer.isPaused()) // paused?
resume();
else if (xPlayer.isStopped() || xPlayer.isUnknown())
replaySong();
}
/**
* If the player is paused it resume it else if it is stopped it replays the
* Media
*/
public void playOrReplay() {
if (xPlayer.isPaused()) // paused?
resume();
else if (xPlayer.isStopped() || xPlayer.isUnknown())
replaySong();
}
/**
* @return the xPlayerWindow
*/
public XPlayerWindow getxPlayerWindow() {
return xPlayerWindow;
}
/**
* @return the playerExtraSettings
*/
public XPlayerExtraSettings getPlayerExtraSettings() {
return playerExtraSettings;
}
/**
* @return the xPlayerModel
*/
public XPlayerModel getxPlayerModel() {
return xPlayerModel;
}
/**
* @return the xPlayer
*/
public XPlayer getxPlayer() {
return xPlayer;
}
/**
* @return the radialMenu
*/
public XPlayerRadialMenu getRadialMenu() {
return radialMenu;
}
/**
* @return the visualizerWindow
*/
public VisualizerWindowController getVisualizerWindow() {
return visualizerWindow;
}
/**
* @return the visualizerStackController
*/
public VisualizerStackController getVisualizerStackController() {
return visualizerStackController;
}
/**
* @return the visualizer
*/
public XPlayerVisualizer getVisualizer() {
return visualizer;
}
/**
* @return the equalizer
*/
public XPlayerEqualizer getEqualizer() {
return equalizer;
}
/**
* @return the disc
*/
public DJDisc getDisc() {
return disc;
}
/**
* @return the xPlayerPlayList
*/
public XPlayerPlaylist getxPlayerPlayList() {
return xPlayerPlayList;
}
}