Wait for seek completion
This commit is contained in:
parent
bcef62d11e
commit
860741a7bb
@ -25,6 +25,7 @@ import com.bumptech.glide.request.target.Target;
|
|||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.LinkedBlockingDeque;
|
import java.util.concurrent.LinkedBlockingDeque;
|
||||||
import java.util.concurrent.RejectedExecutionHandler;
|
import java.util.concurrent.RejectedExecutionHandler;
|
||||||
import java.util.concurrent.ThreadPoolExecutor;
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
@ -78,6 +79,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
|
|||||||
* have to wait until these operations have finished.
|
* have to wait until these operations have finished.
|
||||||
*/
|
*/
|
||||||
private final ReentrantLock playerLock;
|
private final ReentrantLock playerLock;
|
||||||
|
private CountDownLatch seekLatch;
|
||||||
|
|
||||||
private final PSMPCallback callback;
|
private final PSMPCallback callback;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
@ -290,11 +292,11 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
|
|||||||
builder.putString(MediaMetadataCompat.METADATA_KEY_ART_URI, p.getImageUri().toString());
|
builder.putString(MediaMetadataCompat.METADATA_KEY_ART_URI, p.getImageUri().toString());
|
||||||
try {
|
try {
|
||||||
Bitmap art = Glide.with(context)
|
Bitmap art = Glide.with(context)
|
||||||
.load(p.getImageUri())
|
.load(p.getImageUri())
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY)
|
.diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY)
|
||||||
.into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
|
.into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
|
||||||
.get();
|
.get();
|
||||||
builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, art);
|
builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, art);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.e(TAG, Log.getStackTraceString(e));
|
Log.e(TAG, Log.getStackTraceString(e));
|
||||||
@ -332,11 +334,11 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
|
|||||||
acquireWifiLockIfNecessary();
|
acquireWifiLockIfNecessary();
|
||||||
setSpeed(Float.parseFloat(UserPreferences.getPlaybackSpeed()));
|
setSpeed(Float.parseFloat(UserPreferences.getPlaybackSpeed()));
|
||||||
|
|
||||||
if (media.getPosition() > 0) {
|
if (playerStatus == PlayerStatus.PREPARED && media.getPosition() > 0) {
|
||||||
int newPosition = RewindAfterPauseUtils.calculatePositionWithRewind(
|
int newPosition = RewindAfterPauseUtils.calculatePositionWithRewind(
|
||||||
media.getPosition(),
|
media.getPosition(),
|
||||||
media.getLastPlayedTime());
|
media.getLastPlayedTime());
|
||||||
mediaPlayer.seekTo(newPosition);
|
seekToSync(newPosition);
|
||||||
}
|
}
|
||||||
mediaPlayer.start();
|
mediaPlayer.start();
|
||||||
|
|
||||||
@ -438,7 +440,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (media.getPosition() > 0) {
|
if (media.getPosition() > 0) {
|
||||||
mediaPlayer.seekTo(media.getPosition());
|
seekToSync(media.getPosition());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (media.getDuration() == 0) {
|
if (media.getDuration() == 0) {
|
||||||
@ -498,8 +500,13 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
|
|||||||
statusBeforeSeeking = playerStatus;
|
statusBeforeSeeking = playerStatus;
|
||||||
setPlayerStatus(PlayerStatus.SEEKING, media);
|
setPlayerStatus(PlayerStatus.SEEKING, media);
|
||||||
}
|
}
|
||||||
|
seekLatch = new CountDownLatch(1);
|
||||||
mediaPlayer.seekTo(t);
|
mediaPlayer.seekTo(t);
|
||||||
|
try {
|
||||||
|
seekLatch.await(10, TimeUnit.SECONDS);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
} else if (playerStatus == PlayerStatus.INITIALIZED) {
|
} else if (playerStatus == PlayerStatus.INITIALIZED) {
|
||||||
media.setPosition(t);
|
media.setPosition(t);
|
||||||
startWhenPrepared.set(false);
|
startWhenPrepared.set(false);
|
||||||
@ -1142,16 +1149,18 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
|
|||||||
};
|
};
|
||||||
|
|
||||||
private final void genericSeekCompleteListener() {
|
private final void genericSeekCompleteListener() {
|
||||||
executor.submit(new Runnable() {
|
Thread t = new Thread(() -> {
|
||||||
@Override
|
Log.d(TAG, "genericSeekCompleteListener");
|
||||||
public void run() {
|
if(seekLatch != null) {
|
||||||
playerLock.lock();
|
seekLatch.countDown();
|
||||||
if (playerStatus == PlayerStatus.SEEKING) {
|
|
||||||
setPlayerStatus(statusBeforeSeeking, media);
|
|
||||||
}
|
|
||||||
playerLock.unlock();
|
|
||||||
}
|
}
|
||||||
|
playerLock.lock();
|
||||||
|
if (playerStatus == PlayerStatus.SEEKING) {
|
||||||
|
setPlayerStatus(statusBeforeSeeking, media);
|
||||||
|
}
|
||||||
|
playerLock.unlock();
|
||||||
});
|
});
|
||||||
|
t.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MediaSessionCompat.Callback sessionCallback = new MediaSessionCompat.Callback() {
|
private final MediaSessionCompat.Callback sessionCallback = new MediaSessionCompat.Callback() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user