Ensures that every query creates a submission to the service.
This is the only way that a Future will work, even if it doesn't do anything.
This commit is contained in:
@@ -1,30 +1,24 @@
|
||||
package edu.regis.universeplayer;
|
||||
|
||||
import edu.regis.universeplayer.data.Queue;
|
||||
import edu.regis.universeplayer.data.*;
|
||||
import edu.regis.universeplayer.gui.Interface;
|
||||
import edu.regis.universeplayer.player.PlayerManager;
|
||||
import org.apache.commons.cli.*;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.*;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.net.Socket;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
import java.util.concurrent.ForkJoinTask;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.swing.JOptionPane;
|
||||
|
||||
import edu.regis.universeplayer.data.AlbumProvider;
|
||||
import edu.regis.universeplayer.data.CompiledSongProvider;
|
||||
import edu.regis.universeplayer.data.DefaultAlbumProvider;
|
||||
import edu.regis.universeplayer.data.InternetSongProvider;
|
||||
import edu.regis.universeplayer.data.LocalSongProvider;
|
||||
import edu.regis.universeplayer.data.Queue;
|
||||
import edu.regis.universeplayer.data.Song;
|
||||
import edu.regis.universeplayer.data.SongProvider;
|
||||
import edu.regis.universeplayer.gui.Interface;
|
||||
import edu.regis.universeplayer.player.PlayerManager;
|
||||
|
||||
/**
|
||||
* A centralized spot to link up all of the components.
|
||||
*
|
||||
|
||||
@@ -151,14 +151,14 @@ public class LocalPlayer implements Player<LocalSong>, MediaPlayerEventListener
|
||||
this.player.mediaPlayer().submit(() -> this.player.mediaPlayer()
|
||||
.controls()
|
||||
.play());
|
||||
return new AbstractTask<>()
|
||||
return this.service.submit(new AbstractTask<>()
|
||||
{
|
||||
@Override
|
||||
protected boolean exec()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -168,14 +168,14 @@ public class LocalPlayer implements Player<LocalSong>, MediaPlayerEventListener
|
||||
.submit(() -> this.player.mediaPlayer()
|
||||
.controls()
|
||||
.pause());
|
||||
return new AbstractTask<>()
|
||||
return this.service.submit(new AbstractTask<>()
|
||||
{
|
||||
@Override
|
||||
protected boolean exec()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -216,14 +216,14 @@ public class LocalPlayer implements Player<LocalSong>, MediaPlayerEventListener
|
||||
.submit(() -> this.player.mediaPlayer()
|
||||
.controls()
|
||||
.stop());
|
||||
return new AbstractTask<>()
|
||||
return this.service.submit(new AbstractTask<>()
|
||||
{
|
||||
@Override
|
||||
protected boolean exec()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -233,14 +233,14 @@ public class LocalPlayer implements Player<LocalSong>, MediaPlayerEventListener
|
||||
.submit(() -> this.player.mediaPlayer()
|
||||
.controls()
|
||||
.setTime((long) (time * 1000)));
|
||||
return new AbstractTask<>()
|
||||
return this.service.submit(new AbstractTask<>()
|
||||
{
|
||||
@Override
|
||||
protected boolean exec()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.concurrent.CancellationException;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
import java.util.concurrent.ForkJoinTask;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@@ -252,30 +253,53 @@ public class PlayerManager implements PlaybackListener
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads up a requested song and immedietally begins playback.
|
||||
*
|
||||
* @param song - The song to load.
|
||||
* @return The task that handles the request.
|
||||
*/
|
||||
public ForkJoinTask<Void> playSong(Song song)
|
||||
{
|
||||
if (this.currentSong != null)
|
||||
return ForkJoinPool.commonPool().submit(new AbstractTask<Void>()
|
||||
{
|
||||
this.currentPlayer.stopSong();
|
||||
@Override
|
||||
protected boolean exec()
|
||||
{
|
||||
if (currentSong != null)
|
||||
{
|
||||
currentPlayer.stopSong().join();
|
||||
}
|
||||
this.currentSong = null;
|
||||
this.currentPlayer = this.getCompatiblePlayer(song);
|
||||
if (this.currentPlayer == null)
|
||||
currentSong = null;
|
||||
currentPlayer = getCompatiblePlayer(song);
|
||||
if (currentPlayer == null)
|
||||
{
|
||||
throw new IllegalArgumentException("Unknown song type " + song
|
||||
.getClass());
|
||||
}
|
||||
this.currentSong = song;
|
||||
return this.currentPlayer.loadSong(song);
|
||||
currentSong = song;
|
||||
currentPlayer.loadSong(song).join();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtains the playback status of the current player.
|
||||
*
|
||||
* @return A task containing the status, or EMPTY if no player is being
|
||||
* used.
|
||||
*/
|
||||
public ForkJoinTask<PlaybackStatus> getStatus()
|
||||
{
|
||||
if (this.currentPlayer != null)
|
||||
{
|
||||
return this.currentPlayer.getStatus();
|
||||
}
|
||||
return new AbstractTask<>()
|
||||
/*
|
||||
* If we have no player, then we return EMPTY.
|
||||
*/
|
||||
return ForkJoinPool.commonPool().submit(new AbstractTask<>()
|
||||
{
|
||||
@Override
|
||||
protected boolean exec()
|
||||
@@ -283,16 +307,29 @@ public class PlayerManager implements PlaybackListener
|
||||
complete(PlaybackStatus.EMPTY);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Seeks to the specified time stamp.
|
||||
*
|
||||
* @param time - The time to seek to, in seconds.
|
||||
* @return The task running this task.
|
||||
*/
|
||||
public ForkJoinTask<Void> seek(float time)
|
||||
{
|
||||
if (this.currentPlayer != null)
|
||||
{
|
||||
return this.currentPlayer.seek(time);
|
||||
}
|
||||
return null;
|
||||
return ForkJoinPool.commonPool().submit(new AbstractTask<>()
|
||||
{
|
||||
@Override
|
||||
protected boolean exec()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public ForkJoinTask<Void> play()
|
||||
@@ -301,7 +338,14 @@ public class PlayerManager implements PlaybackListener
|
||||
{
|
||||
return this.currentPlayer.play();
|
||||
}
|
||||
return null;
|
||||
return ForkJoinPool.commonPool().submit(new AbstractTask<>()
|
||||
{
|
||||
@Override
|
||||
protected boolean exec()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public ForkJoinTask<Void> pause()
|
||||
@@ -310,7 +354,14 @@ public class PlayerManager implements PlaybackListener
|
||||
{
|
||||
return this.currentPlayer.pause();
|
||||
}
|
||||
return null;
|
||||
return ForkJoinPool.commonPool().submit(new AbstractTask<>()
|
||||
{
|
||||
@Override
|
||||
protected boolean exec()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public ForkJoinTask<Void> toggle()
|
||||
@@ -319,7 +370,14 @@ public class PlayerManager implements PlaybackListener
|
||||
{
|
||||
return this.currentPlayer.togglePlayback();
|
||||
}
|
||||
return null;
|
||||
return ForkJoinPool.commonPool().submit(new AbstractTask<>()
|
||||
{
|
||||
@Override
|
||||
protected boolean exec()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public ForkJoinTask<Void> stopSong()
|
||||
@@ -329,7 +387,14 @@ public class PlayerManager implements PlaybackListener
|
||||
this.currentSong = null;
|
||||
return this.currentPlayer.stopSong();
|
||||
}
|
||||
return null;
|
||||
return ForkJoinPool.commonPool().submit(new AbstractTask<>()
|
||||
{
|
||||
@Override
|
||||
protected boolean exec()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void addPlaybackListener(PlaybackListener listener)
|
||||
@@ -369,6 +434,7 @@ public class PlayerManager implements PlaybackListener
|
||||
|
||||
/**
|
||||
* Sends an error to the browser player.
|
||||
*
|
||||
* @param forward - Whether the error should be thrown in a foreground
|
||||
* script or a background script.
|
||||
* @return The command future.
|
||||
|
||||
Reference in New Issue
Block a user