/** * Performs a seek if it scheduled. * @param seekExecutor Callback for performing a seek on the track * @return True if a seek was performed */ private SeekResult checkPendingSeek(SeekExecutor seekExecutor) { if (!audioTrack.isSeekable()) { return SeekResult.NO_SEEK; } long seekPosition; synchronized (actionSynchronizer) { seekPosition = queuedSeek.get(); if (seekPosition == -1) { return SeekResult.NO_SEEK; } log.debug("Track {} interrupted for seeking to {}.", audioTrack.getIdentifier(), seekPosition); applySeekState(seekPosition); } if (seekExecutor != null) { try { seekExecutor.performSeek(seekPosition); } catch (Exception e) { throw ExceptionTools.wrapUnfriendlyExceptions("Something went wrong when seeking to a position.", FAULT, e); } return SeekResult.INTERNAL_SEEK; } else { return SeekResult.EXTERNAL_SEEK; } }