package xplayer.services; import java.util.logging.Level; import application.Main; import javafx.concurrent.Service; import javafx.concurrent.Task; import javafx.scene.Cursor; import xplayer.presenter.XPlayerController; import xplayer.streamplayer.StreamPlayerException; /** * This Service is used to skip the Audio of XPlayer to different time. * * @author GOXR3PLUS */ public class XPlayerSeekService extends Service<Boolean> { /** The bytes to be skipped */ long bytes; /** * I am using this variables when i want to stop the player and go to a * specific time for example at 1 m and 32 seconds :) */ boolean stopPlayer; /** * Determines if the Service is locked , if yes it can't be used . */ private volatile boolean locked; private final XPlayerController xPlayerController; /** * Constructor. */ public XPlayerSeekService(XPlayerController xPlayerController) { this.xPlayerController = xPlayerController; setOnSucceeded(s -> done()); setOnFailed(f -> done()); } /** * Start the Service. * * @param bytes1 * Bytes to skip * @param stopPlayer1 */ public void startSeekService(long bytes1 , boolean stopPlayer1) { if (locked || isRunning() || xPlayerController.getxPlayerModel().songPathProperty().get() == null) return; //System.out.println(bytes) //StopPlayer this.stopPlayer = stopPlayer1; // Bytes to Skip this.bytes = bytes1; // Create Binding xPlayerController.getFxLabel().textProperty().bind(messageProperty()); xPlayerController.getFxRegion().visibleProperty().bind(runningProperty()); // lock the Service locked = true; // Restart restart(); } /** * When the Service is done. */ private void done() { // Remove the unidirectional binding xPlayerController.getFxLabel().textProperty().unbind(); xPlayerController.getFxRegion().visibleProperty().unbind(); xPlayerController.getFxRegion().setVisible(false); // Stop disc dragging! xPlayerController.discIsDragging = false; // Put the appropriate Cursor xPlayerController.getDisc().getCanvas().setCursor(Cursor.OPEN_HAND); // Recalculate Angle and paint again Disc xPlayerController.getDisc().calculateAngleByValue(xPlayerController.getxPlayerModel().getCurrentTime(), xPlayerController.getxPlayerModel().getDuration(), true); xPlayerController.getDisc().repaint(); // unlock the Service locked = false; } @Override protected Task<Boolean> createTask() { return new Task<Boolean>() { @Override protected Boolean call() throws Exception { boolean succeded = true; // ----------------------- Seek the Media updateMessage("Skipping the Audio"); //Stop? if (stopPlayer) xPlayerController.getxPlayer().stop(); // GO // if (bytes != 0) { // and xPlayer.isPausedOrPlaying()) Main.logger.info("Seek Service Started.."); // CurrentTime xPlayerController.getxPlayerModel().setCurrentTime(xPlayerController.getxPlayerModel().getCurrentAngleTime()); try { xPlayerController.getxPlayer().seek(bytes); } catch (StreamPlayerException ex) { xPlayerController.logger.log(Level.WARNING, "", ex); succeded = false; } // } // ----------------------- Play Audio if (!xPlayerController.getxPlayer().isPausedOrPlaying()) { xPlayerController.getxPlayer().play(); //xPlayer.pause(); } // ----------------------- Configuration updateMessage("Applying Settings ..."); // Configure Media Settings if (xPlayerController.getxPlayer().isPausedOrPlaying()) xPlayerController.configureMediaSettings(true); return succeded; } }; } }