/
TrackScheduler.java
81 lines (70 loc) · 2.44 KB
/
TrackScheduler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package net.dv8tion.discord.music;
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 java.util.concurrent.BlockingQueue;
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 boolean repeating = false;
final AudioPlayer player;
final BlockingQueue<AudioTrack> queue;
AudioTrack lastTrack;
/**
* @param player The audio player this scheduler uses
*/
public TrackScheduler(AudioPlayer player)
{
this.player = player;
this.queue = new LinkedBlockingQueue<>();
}
/**
* 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);
}
}
/**
* 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)
{
this.lastTrack = track;
// Only start the next track if the end reason is suitable for it (FINISHED or LOAD_FAILED)
if (endReason.mayStartNext)
{
if (repeating)
player.startTrack(lastTrack.makeClone(), false);
else
nextTrack();
}
}
public boolean isRepeating()
{
return repeating;
}
public void setRepeating(boolean repeating)
{
this.repeating = repeating;
}
}