2017-10-22 23:48:13 +02:00
|
|
|
package net.Broken.audio;
|
|
|
|
|
|
|
|
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
|
|
|
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
|
|
|
|
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
|
|
|
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
|
|
|
|
import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
2017-11-04 18:27:18 +01:00
|
|
|
import java.util.concurrent.BlockingDeque;
|
2017-10-22 23:48:13 +02:00
|
|
|
import java.util.concurrent.BlockingQueue;
|
2017-11-04 18:27:18 +01:00
|
|
|
import java.util.concurrent.LinkedBlockingDeque;
|
2017-10-22 23:48:13 +02:00
|
|
|
import java.util.concurrent.LinkedBlockingQueue;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This class schedules tracks for the audio player. It contains the queue of tracks.
|
|
|
|
*/
|
|
|
|
public class TrackScheduler extends AudioEventAdapter {
|
|
|
|
private final AudioPlayer player;
|
2017-11-04 18:27:18 +01:00
|
|
|
private final BlockingDeque<AudioTrack> queue;
|
2017-10-22 23:48:13 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @param player The audio player this scheduler uses
|
|
|
|
*/
|
|
|
|
public TrackScheduler(AudioPlayer player) {
|
|
|
|
this.player = player;
|
|
|
|
player.setVolume(25);
|
2017-11-04 18:27:18 +01:00
|
|
|
this.queue = new LinkedBlockingDeque<>();
|
2017-10-22 23:48:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add the next track to queue or play right away if nothing is in the queue.
|
|
|
|
*
|
|
|
|
* @param track The track to play or add to queue.
|
|
|
|
*/
|
|
|
|
public void queue(AudioTrack track) {
|
|
|
|
// Calling startTrack with the noInterrupt set to true will start the track only if nothing is currently playing. If
|
|
|
|
// something is playing, it returns false and does nothing. In that case the player was already playing so this
|
|
|
|
// track goes to the queue instead.
|
|
|
|
if (!player.startTrack(track, true)) {
|
|
|
|
queue.offer(track);
|
|
|
|
}
|
|
|
|
}
|
2017-11-04 18:27:18 +01:00
|
|
|
public void addNext(AudioTrack track) {
|
|
|
|
// Calling startTrack with the noInterrupt set to true will start the track only if nothing is currently playing. If
|
|
|
|
// something is playing, it returns false and does nothing. In that case the player was already playing so this
|
|
|
|
// track goes to the queue instead.
|
|
|
|
if (!player.startTrack(track, true)) {
|
|
|
|
queue.addFirst(track);
|
|
|
|
}
|
|
|
|
}
|
2017-10-22 23:48:13 +02:00
|
|
|
|
|
|
|
public void pause() {
|
|
|
|
player.setPaused(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void resume() {
|
|
|
|
player.setPaused(false);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public void stop(){
|
|
|
|
player.stopTrack();
|
|
|
|
player.destroy();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void flush(){
|
|
|
|
queue.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
public List<AudioTrackInfo> getList(){
|
|
|
|
// AudioTrack[] test = (AudioTrack[]) queue.toArray();
|
|
|
|
|
|
|
|
List<AudioTrackInfo> temp = new ArrayList<>();
|
|
|
|
Object[] test = queue.toArray();
|
|
|
|
for(Object track: test){
|
|
|
|
AudioTrack casted = (AudioTrack) track;
|
|
|
|
temp.add(casted.getInfo());
|
|
|
|
}
|
|
|
|
return temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
public AudioTrackInfo getInfo(){
|
|
|
|
return player.getPlayingTrack().getInfo();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Start the next track, stopping the current one if it is playing.
|
|
|
|
*/
|
|
|
|
public void nextTrack() {
|
|
|
|
// Start the next track, regardless of if something is already playing or not. In case queue was empty, we are
|
|
|
|
// giving null to startTrack, which is a valid argument and will simply stop the player.
|
|
|
|
player.startTrack(queue.poll(), false);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) {
|
|
|
|
// Only start the next track if the end reason is suitable for it (FINISHED or LOAD_FAILED)
|
|
|
|
if (endReason.mayStartNext) {
|
|
|
|
nextTrack();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|