Wait for seek completion

This commit is contained in:
Martin Fietz 2015-10-16 15:00:41 +02:00
parent bcef62d11e
commit 860741a7bb

View File

@ -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() {