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;
|
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.apache.commons.cli.*;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
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.net.Socket;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ForkJoinPool;
|
import java.util.concurrent.ForkJoinPool;
|
||||||
import java.util.concurrent.ForkJoinTask;
|
import java.util.concurrent.ForkJoinTask;
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import java.util.stream.Collectors;
|
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.
|
* 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()
|
this.player.mediaPlayer().submit(() -> this.player.mediaPlayer()
|
||||||
.controls()
|
.controls()
|
||||||
.play());
|
.play());
|
||||||
return new AbstractTask<>()
|
return this.service.submit(new AbstractTask<>()
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
protected boolean exec()
|
protected boolean exec()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -168,14 +168,14 @@ public class LocalPlayer implements Player<LocalSong>, MediaPlayerEventListener
|
|||||||
.submit(() -> this.player.mediaPlayer()
|
.submit(() -> this.player.mediaPlayer()
|
||||||
.controls()
|
.controls()
|
||||||
.pause());
|
.pause());
|
||||||
return new AbstractTask<>()
|
return this.service.submit(new AbstractTask<>()
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
protected boolean exec()
|
protected boolean exec()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -216,14 +216,14 @@ public class LocalPlayer implements Player<LocalSong>, MediaPlayerEventListener
|
|||||||
.submit(() -> this.player.mediaPlayer()
|
.submit(() -> this.player.mediaPlayer()
|
||||||
.controls()
|
.controls()
|
||||||
.stop());
|
.stop());
|
||||||
return new AbstractTask<>()
|
return this.service.submit(new AbstractTask<>()
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
protected boolean exec()
|
protected boolean exec()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -233,14 +233,14 @@ public class LocalPlayer implements Player<LocalSong>, MediaPlayerEventListener
|
|||||||
.submit(() -> this.player.mediaPlayer()
|
.submit(() -> this.player.mediaPlayer()
|
||||||
.controls()
|
.controls()
|
||||||
.setTime((long) (time * 1000)));
|
.setTime((long) (time * 1000)));
|
||||||
return new AbstractTask<>()
|
return this.service.submit(new AbstractTask<>()
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
protected boolean exec()
|
protected boolean exec()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.concurrent.CancellationException;
|
import java.util.concurrent.CancellationException;
|
||||||
|
import java.util.concurrent.ForkJoinPool;
|
||||||
import java.util.concurrent.ForkJoinTask;
|
import java.util.concurrent.ForkJoinTask;
|
||||||
import java.util.concurrent.TimeUnit;
|
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)
|
public ForkJoinTask<Void> playSong(Song song)
|
||||||
{
|
{
|
||||||
if (this.currentSong != null)
|
return ForkJoinPool.commonPool().submit(new AbstractTask<Void>()
|
||||||
{
|
{
|
||||||
this.currentPlayer.stopSong();
|
@Override
|
||||||
}
|
protected boolean exec()
|
||||||
this.currentSong = null;
|
{
|
||||||
this.currentPlayer = this.getCompatiblePlayer(song);
|
if (currentSong != null)
|
||||||
if (this.currentPlayer == null)
|
{
|
||||||
{
|
currentPlayer.stopSong().join();
|
||||||
throw new IllegalArgumentException("Unknown song type " + song
|
}
|
||||||
.getClass());
|
currentSong = null;
|
||||||
}
|
currentPlayer = getCompatiblePlayer(song);
|
||||||
this.currentSong = song;
|
if (currentPlayer == null)
|
||||||
return this.currentPlayer.loadSong(song);
|
{
|
||||||
|
throw new IllegalArgumentException("Unknown song type " + song
|
||||||
|
.getClass());
|
||||||
|
}
|
||||||
|
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()
|
public ForkJoinTask<PlaybackStatus> getStatus()
|
||||||
{
|
{
|
||||||
if (this.currentPlayer != null)
|
if (this.currentPlayer != null)
|
||||||
{
|
{
|
||||||
return this.currentPlayer.getStatus();
|
return this.currentPlayer.getStatus();
|
||||||
}
|
}
|
||||||
return new AbstractTask<>()
|
/*
|
||||||
|
* If we have no player, then we return EMPTY.
|
||||||
|
*/
|
||||||
|
return ForkJoinPool.commonPool().submit(new AbstractTask<>()
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
protected boolean exec()
|
protected boolean exec()
|
||||||
@@ -283,16 +307,29 @@ public class PlayerManager implements PlaybackListener
|
|||||||
complete(PlaybackStatus.EMPTY);
|
complete(PlaybackStatus.EMPTY);
|
||||||
return true;
|
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)
|
public ForkJoinTask<Void> seek(float time)
|
||||||
{
|
{
|
||||||
if (this.currentPlayer != null)
|
if (this.currentPlayer != null)
|
||||||
{
|
{
|
||||||
return this.currentPlayer.seek(time);
|
return this.currentPlayer.seek(time);
|
||||||
}
|
}
|
||||||
return null;
|
return ForkJoinPool.commonPool().submit(new AbstractTask<>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
protected boolean exec()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public ForkJoinTask<Void> play()
|
public ForkJoinTask<Void> play()
|
||||||
@@ -301,7 +338,14 @@ public class PlayerManager implements PlaybackListener
|
|||||||
{
|
{
|
||||||
return this.currentPlayer.play();
|
return this.currentPlayer.play();
|
||||||
}
|
}
|
||||||
return null;
|
return ForkJoinPool.commonPool().submit(new AbstractTask<>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
protected boolean exec()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public ForkJoinTask<Void> pause()
|
public ForkJoinTask<Void> pause()
|
||||||
@@ -310,7 +354,14 @@ public class PlayerManager implements PlaybackListener
|
|||||||
{
|
{
|
||||||
return this.currentPlayer.pause();
|
return this.currentPlayer.pause();
|
||||||
}
|
}
|
||||||
return null;
|
return ForkJoinPool.commonPool().submit(new AbstractTask<>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
protected boolean exec()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public ForkJoinTask<Void> toggle()
|
public ForkJoinTask<Void> toggle()
|
||||||
@@ -319,7 +370,14 @@ public class PlayerManager implements PlaybackListener
|
|||||||
{
|
{
|
||||||
return this.currentPlayer.togglePlayback();
|
return this.currentPlayer.togglePlayback();
|
||||||
}
|
}
|
||||||
return null;
|
return ForkJoinPool.commonPool().submit(new AbstractTask<>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
protected boolean exec()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public ForkJoinTask<Void> stopSong()
|
public ForkJoinTask<Void> stopSong()
|
||||||
@@ -329,7 +387,14 @@ public class PlayerManager implements PlaybackListener
|
|||||||
this.currentSong = null;
|
this.currentSong = null;
|
||||||
return this.currentPlayer.stopSong();
|
return this.currentPlayer.stopSong();
|
||||||
}
|
}
|
||||||
return null;
|
return ForkJoinPool.commonPool().submit(new AbstractTask<>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
protected boolean exec()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addPlaybackListener(PlaybackListener listener)
|
public void addPlaybackListener(PlaybackListener listener)
|
||||||
@@ -369,6 +434,7 @@ public class PlayerManager implements PlaybackListener
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends an error to the browser player.
|
* Sends an error to the browser player.
|
||||||
|
*
|
||||||
* @param forward - Whether the error should be thrown in a foreground
|
* @param forward - Whether the error should be thrown in a foreground
|
||||||
* script or a background script.
|
* script or a background script.
|
||||||
* @return The command future.
|
* @return The command future.
|
||||||
|
|||||||
Reference in New Issue
Block a user