From 839890d7079e5f284e883bdc9050992159f2024f Mon Sep 17 00:00:00 2001 From: Ryan Heise Date: Thu, 2 Jan 2020 12:01:43 +1100 Subject: [PATCH] Improve seek behaviour --- .../com/ryanheise/just_audio/AudioPlayer.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/com/ryanheise/just_audio/AudioPlayer.java b/android/src/main/java/com/ryanheise/just_audio/AudioPlayer.java index 29f549e..862dc03 100644 --- a/android/src/main/java/com/ryanheise/just_audio/AudioPlayer.java +++ b/android/src/main/java/com/ryanheise/just_audio/AudioPlayer.java @@ -63,6 +63,7 @@ public class AudioPlayer implements MethodCallHandler, Player.EventListener { private Long seekPos; private Result prepareResult; private Result seekResult; + private boolean seekProcessed; private MediaSource mediaSource; private SimpleExoPlayer player; @@ -101,6 +102,9 @@ public class AudioPlayer implements MethodCallHandler, Player.EventListener { prepareResult = null; transition(PlaybackState.stopped); } + if (seekProcessed) { + completeSeek(); + } break; case Player.STATE_BUFFERING: // TODO: use this instead of checkForDiscontinuity. @@ -116,14 +120,22 @@ public class AudioPlayer implements MethodCallHandler, Player.EventListener { @Override public void onSeekProcessed() { if (seekResult != null) { - seekPos = null; - transition(stateBeforeSeek); - seekResult.success(null); - stateBeforeSeek = null; - seekResult = null; + seekProcessed = true; + if (player.getPlaybackState() == Player.STATE_READY) { + completeSeek(); + } } } + private void completeSeek() { + seekProcessed = false; + seekPos = null; + transition(stateBeforeSeek); + seekResult.success(null); + stateBeforeSeek = null; + seekResult = null; + } + private void checkForDiscontinuity() { final long now = System.currentTimeMillis(); final long position = getCurrentPosition(); @@ -332,8 +344,12 @@ public class AudioPlayer implements MethodCallHandler, Player.EventListener { if (state == PlaybackState.none || state == PlaybackState.connecting) { throw new IllegalStateException("Cannot call seek from none none/connecting states"); } + if (seekResult != null) { + seekResult.success(null); + } seekPos = position; seekResult = result; + seekProcessed = false; if (stateBeforeSeek == null) { stateBeforeSeek = state; }