/** * Detach the currently active listener, so no useless reference would be kept and no events would be sent there. */ public void detach() { activeListener = null; markerTracker.trigger(ENDED); }
/** * Check a timecode which was reached by normal playback, trigger REACHED if necessary. * @param timecode Timecode which was reached by normal playback. */ public void checkPlaybackTimecode(long timecode) { TrackMarker marker = current.get(); if (marker != null && timecode >= marker.timecode) { trigger(marker, REACHED); } }
/** * Check a timecode which was reached by seeking, trigger BYPASSED if necessary. * @param timecode Timecode which was reached by seeking. */ public void checkSeekTimecode(long timecode) { TrackMarker marker = current.get(); if (marker != null && timecode >= marker.timecode) { trigger(marker, BYPASSED); } }
/** * Set a new track position marker. * @param marker Marker * @param currentTimecode Current timecode of the track when this marker is set */ public void set(TrackMarker marker, long currentTimecode) { TrackMarker previous = current.getAndSet(marker); if (previous != null) { previous.handler.handle(marker != null ? OVERWRITTEN : REMOVED); } if (marker != null && currentTimecode >= marker.timecode) { trigger(marker, LATE); } }
private boolean handlePlaybackInterrupt(InterruptedException interruption, SeekExecutor seekExecutor) { Thread.interrupted(); if (checkStopped()) { markerTracker.trigger(STOPPED); return false; } SeekResult seekResult = checkPendingSeek(seekExecutor); if (seekResult != SeekResult.NO_SEEK) { // Double-check, might have received a stop request while seeking if (checkStopped()) { markerTracker.trigger(STOPPED); return false; } else { return seekResult == SeekResult.INTERNAL_SEEK; } } else if (interruption != null) { Thread.currentThread().interrupt(); throw new FriendlyException("The track was unexpectedly terminated.", SUSPICIOUS, interruption); } else { return true; } }
@Override public void stop() { frameBuffer.lockBuffer(); frameBuffer.setTerminateOnEmpty(); frameBuffer.clear(); markerTracker.trigger(STOPPED); remoteNodeManager.onTrackEnd(null, track, AudioTrackEndReason.STOPPED); }
markerTracker.trigger(ENDED); state.set(AudioTrackState.FINISHED);