1
1
package com .sedmelluq .discord .lavaplayer .track ;
2
2
3
- import java .util .concurrent .atomic .AtomicReference ;
3
+ import java .util .Collections ;
4
+ import java .util .List ;
5
+ import java .util .concurrent .CopyOnWriteArrayList ;
4
6
5
7
import static com .sedmelluq .discord .lavaplayer .track .TrackMarkerHandler .MarkerState .*;
6
8
7
9
/**
8
10
* Tracks the state of a track position marker.
9
11
*/
10
12
public class TrackMarkerTracker {
11
- private final AtomicReference <TrackMarker > current = new AtomicReference <>();
13
+ private final List <TrackMarker > markerList = new CopyOnWriteArrayList <>();
12
14
13
15
/**
14
- * Set a new track position marker.
16
+ * Set a new track position marker. This removes all previously set markers.
15
17
*
16
18
* @param marker Marker
17
19
* @param currentTimecode Current timecode of the track when this marker is set
18
20
*/
19
21
public void set (TrackMarker marker , long currentTimecode ) {
20
- TrackMarker previous = current .getAndSet (marker );
22
+ if (marker == null ) {
23
+ trigger (REMOVED );
24
+ } else {
25
+ trigger (OVERWRITTEN );
21
26
22
- if (previous != null ) {
23
- previous .handler .handle (marker != null ? OVERWRITTEN : REMOVED );
27
+ add (marker , currentTimecode );
24
28
}
29
+ }
25
30
26
- if (marker != null && currentTimecode >= marker .timecode ) {
27
- trigger (marker , LATE );
31
+ public void add (TrackMarker marker , long currentTimecode ) {
32
+ if (marker != null ) {
33
+ if (currentTimecode >= marker .timecode ) {
34
+ marker .handler .handle (LATE );
35
+ } else {
36
+ markerList .add (marker );
37
+ }
28
38
}
29
39
}
30
40
41
+ public void remove (TrackMarker marker ) {
42
+ trigger (marker , REMOVED );
43
+ }
44
+
31
45
/**
32
- * Remove the current marker.
46
+ * Removes the first marker in the list.
47
+ *
48
+ * @return The removed marker. Null if there are no markers.
33
49
*
34
- * @return The removed marker .
50
+ * @deprecated Use {@link #getMarkers()} and {@link #clear()} instead .
35
51
*/
52
+ @ Deprecated
36
53
public TrackMarker remove () {
37
- return current .getAndSet (null );
54
+ if (markerList .isEmpty ()) {
55
+ return null ;
56
+ }
57
+
58
+ return markerList .remove (0 );
59
+ }
60
+
61
+ /**
62
+ * @return The current unmodifiable list of timecode markers stored in this tracker.
63
+ * @see #add(TrackMarker, long)
64
+ * @see #remove(TrackMarker)
65
+ * @see #clear()
66
+ */
67
+ public List <TrackMarker > getMarkers () {
68
+ return Collections .unmodifiableList (markerList );
69
+ }
70
+
71
+ public void clear () {
72
+ markerList .clear ();
38
73
}
39
74
40
75
/**
41
- * Trigger and remove the marker with the specified state.
76
+ * Triggers and removes all markers with the specified state.
42
77
*
43
78
* @param state The state of the marker to pass to the handler.
44
79
*/
45
80
public void trigger (TrackMarkerHandler .MarkerState state ) {
46
- TrackMarker marker = current .getAndSet (null );
47
-
48
- if (marker != null ) {
81
+ for (TrackMarker marker : markerList ) {
49
82
marker .handler .handle (state );
50
83
}
84
+
85
+ this .clear ();
51
86
}
52
87
53
88
/**
@@ -56,10 +91,10 @@ public void trigger(TrackMarkerHandler.MarkerState state) {
56
91
* @param timecode Timecode which was reached by normal playback.
57
92
*/
58
93
public void checkPlaybackTimecode (long timecode ) {
59
- TrackMarker marker = current . get ();
60
-
61
- if ( marker != null && timecode >= marker . timecode ) {
62
- trigger ( marker , REACHED );
94
+ for ( TrackMarker marker : markerList ) {
95
+ if ( marker != null && timecode >= marker . timecode ) {
96
+ trigger ( marker , REACHED );
97
+ }
63
98
}
64
99
}
65
100
@@ -69,15 +104,15 @@ public void checkPlaybackTimecode(long timecode) {
69
104
* @param timecode Timecode which was reached by seeking.
70
105
*/
71
106
public void checkSeekTimecode (long timecode ) {
72
- TrackMarker marker = current . get ();
73
-
74
- if ( marker != null && timecode >= marker . timecode ) {
75
- trigger ( marker , BYPASSED );
107
+ for ( TrackMarker marker : markerList ) {
108
+ if ( marker != null && timecode >= marker . timecode ) {
109
+ trigger ( marker , BYPASSED );
110
+ }
76
111
}
77
112
}
78
113
79
114
private void trigger (TrackMarker marker , TrackMarkerHandler .MarkerState state ) {
80
- if (current . compareAndSet (marker , null )) {
115
+ if (markerList . remove (marker )) {
81
116
marker .handler .handle (state );
82
117
}
83
118
}
0 commit comments