Replace message delay with send at time in playback loop.
This removes the need to calculate the time needed to run the doSomeWork method. Consequently, we can use both the real Clock/Handler and the FakeClock without changing the way the playback loop works and without violating the interfaces of Clock or Handler. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=180665647
This commit is contained in:
parent
a29fb7b989
commit
2bc734afec
@ -117,6 +117,7 @@ import java.util.Collections;
|
|||||||
private final DefaultMediaClock mediaClock;
|
private final DefaultMediaClock mediaClock;
|
||||||
private final PlaybackInfoUpdate playbackInfoUpdate;
|
private final PlaybackInfoUpdate playbackInfoUpdate;
|
||||||
private final ArrayList<CustomMessageInfo> customMessageInfos;
|
private final ArrayList<CustomMessageInfo> customMessageInfos;
|
||||||
|
private final Clock clock;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private SeekParameters seekParameters;
|
private SeekParameters seekParameters;
|
||||||
@ -159,6 +160,7 @@ import java.util.Collections;
|
|||||||
this.shuffleModeEnabled = shuffleModeEnabled;
|
this.shuffleModeEnabled = shuffleModeEnabled;
|
||||||
this.eventHandler = eventHandler;
|
this.eventHandler = eventHandler;
|
||||||
this.player = player;
|
this.player = player;
|
||||||
|
this.clock = clock;
|
||||||
|
|
||||||
backBufferDurationUs = loadControl.getBackBufferDurationUs();
|
backBufferDurationUs = loadControl.getBackBufferDurationUs();
|
||||||
retainBackBufferFromKeyframe = loadControl.retainBackBufferFromKeyframe();
|
retainBackBufferFromKeyframe = loadControl.retainBackBufferFromKeyframe();
|
||||||
@ -541,7 +543,7 @@ import java.util.Collections;
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void doSomeWork() throws ExoPlaybackException, IOException {
|
private void doSomeWork() throws ExoPlaybackException, IOException {
|
||||||
long operationStartTimeMs = SystemClock.elapsedRealtime();
|
long operationStartTimeMs = clock.uptimeMillis();
|
||||||
updatePeriods();
|
updatePeriods();
|
||||||
if (playingPeriodHolder == null) {
|
if (playingPeriodHolder == null) {
|
||||||
// We're still waiting for the first period to be prepared.
|
// We're still waiting for the first period to be prepared.
|
||||||
@ -632,7 +634,7 @@ import java.util.Collections;
|
|||||||
|
|
||||||
private void scheduleNextWork(long thisOperationStartTimeMs, long intervalMs) {
|
private void scheduleNextWork(long thisOperationStartTimeMs, long intervalMs) {
|
||||||
handler.removeMessages(MSG_DO_SOME_WORK);
|
handler.removeMessages(MSG_DO_SOME_WORK);
|
||||||
handler.sendEmptyMessageDelayed(MSG_DO_SOME_WORK, intervalMs, thisOperationStartTimeMs);
|
handler.sendEmptyMessageAtTime(MSG_DO_SOME_WORK, thisOperationStartTimeMs + intervalMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void seekToInternal(SeekPosition seekPosition) throws ExoPlaybackException {
|
private void seekToInternal(SeekPosition seekPosition) throws ExoPlaybackException {
|
||||||
|
@ -30,14 +30,13 @@ public interface Clock {
|
|||||||
*/
|
*/
|
||||||
Clock DEFAULT = new SystemClock();
|
Clock DEFAULT = new SystemClock();
|
||||||
|
|
||||||
/**
|
/** @see android.os.SystemClock#elapsedRealtime() */
|
||||||
* @see android.os.SystemClock#elapsedRealtime()
|
|
||||||
*/
|
|
||||||
long elapsedRealtime();
|
long elapsedRealtime();
|
||||||
|
|
||||||
/**
|
/** @see android.os.SystemClock#uptimeMillis() */
|
||||||
* @see android.os.SystemClock#sleep(long)
|
long uptimeMillis();
|
||||||
*/
|
|
||||||
|
/** @see android.os.SystemClock#sleep(long) */
|
||||||
void sleep(long sleepTimeMs);
|
void sleep(long sleepTimeMs);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -43,18 +43,8 @@ public interface HandlerWrapper {
|
|||||||
/** @see Handler#sendEmptyMessage(int). */
|
/** @see Handler#sendEmptyMessage(int). */
|
||||||
boolean sendEmptyMessage(int what);
|
boolean sendEmptyMessage(int what);
|
||||||
|
|
||||||
/**
|
/** @see Handler#sendEmptyMessageAtTime(int, long). */
|
||||||
* Variant of {@code Handler#sendEmptyMessageDelayed(int, long)} which also takes a reference time
|
boolean sendEmptyMessageAtTime(int what, long uptimeMs);
|
||||||
* measured by {@code android.os.SystemClock#elapsedRealtime()} to which the delay is added.
|
|
||||||
*
|
|
||||||
* @param what The message identifier.
|
|
||||||
* @param delayMs The delay in milliseconds to send the message. This delay is added to the {@code
|
|
||||||
* referenceTimeMs}.
|
|
||||||
* @param referenceTimeMs The time which the delay is added to. Always measured with {@code
|
|
||||||
* android.os.SystemClock#elapsedRealtime()}.
|
|
||||||
* @return Whether the message was successfully enqueued on the Handler thread.
|
|
||||||
*/
|
|
||||||
boolean sendEmptyMessageDelayed(int what, long delayMs, long referenceTimeMs);
|
|
||||||
|
|
||||||
/** @see Handler#removeMessages(int). */
|
/** @see Handler#removeMessages(int). */
|
||||||
void removeMessages(int what);
|
void removeMessages(int what);
|
||||||
|
@ -30,6 +30,11 @@ import android.support.annotation.Nullable;
|
|||||||
return android.os.SystemClock.elapsedRealtime();
|
return android.os.SystemClock.elapsedRealtime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long uptimeMillis() {
|
||||||
|
return android.os.SystemClock.uptimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sleep(long sleepTimeMs) {
|
public void sleep(long sleepTimeMs) {
|
||||||
android.os.SystemClock.sleep(sleepTimeMs);
|
android.os.SystemClock.sleep(sleepTimeMs);
|
||||||
|
@ -17,7 +17,6 @@ package com.google.android.exoplayer2.util;
|
|||||||
|
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.os.SystemClock;
|
|
||||||
|
|
||||||
/** The standard implementation of {@link HandlerWrapper}. */
|
/** The standard implementation of {@link HandlerWrapper}. */
|
||||||
/* package */ final class SystemHandlerWrapper implements HandlerWrapper {
|
/* package */ final class SystemHandlerWrapper implements HandlerWrapper {
|
||||||
@ -59,14 +58,8 @@ import android.os.SystemClock;
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean sendEmptyMessageDelayed(int what, long delayMs, long referenceTimeMs) {
|
public boolean sendEmptyMessageAtTime(int what, long uptimeMs) {
|
||||||
long targetMessageTime = referenceTimeMs + delayMs;
|
return handler.sendEmptyMessageAtTime(what, uptimeMs);
|
||||||
long remainingDelayMs = targetMessageTime - SystemClock.elapsedRealtime();
|
|
||||||
if (remainingDelayMs <= 0) {
|
|
||||||
return handler.sendEmptyMessage(what);
|
|
||||||
} else {
|
|
||||||
return handler.sendEmptyMessageDelayed(what, remainingDelayMs);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -67,6 +67,11 @@ public class FakeClock implements Clock {
|
|||||||
return currentTimeMs;
|
return currentTimeMs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long uptimeMillis() {
|
||||||
|
return elapsedRealtime();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void sleep(long sleepTimeMs) {
|
public synchronized void sleep(long sleepTimeMs) {
|
||||||
if (sleepTimeMs <= 0) {
|
if (sleepTimeMs <= 0) {
|
||||||
@ -90,15 +95,23 @@ public class FakeClock implements Clock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Adds a handler post to list of pending messages. */
|
/** Adds a handler post to list of pending messages. */
|
||||||
protected synchronized void addDelayedHandlerMessage(
|
protected synchronized boolean addHandlerMessageAtTime(
|
||||||
HandlerWrapper handler, Runnable runnable, long delayMs) {
|
HandlerWrapper handler, Runnable runnable, long timeMs) {
|
||||||
handlerMessages.add(new HandlerMessageData(currentTimeMs + delayMs, handler, runnable));
|
if (timeMs <= currentTimeMs) {
|
||||||
|
return handler.post(runnable);
|
||||||
|
}
|
||||||
|
handlerMessages.add(new HandlerMessageData(timeMs, handler, runnable));
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Adds an empty handler message to list of pending messages. */
|
/** Adds an empty handler message to list of pending messages. */
|
||||||
protected synchronized void addDelayedHandlerMessage(
|
protected synchronized boolean addHandlerMessageAtTime(
|
||||||
HandlerWrapper handler, int message, long delayMs) {
|
HandlerWrapper handler, int message, long timeMs) {
|
||||||
handlerMessages.add(new HandlerMessageData(currentTimeMs + delayMs, handler, message));
|
if (timeMs <= currentTimeMs) {
|
||||||
|
return handler.sendEmptyMessage(message);
|
||||||
|
}
|
||||||
|
handlerMessages.add(new HandlerMessageData(timeMs, handler, message));
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Message data saved to send messages or execute runnables at a later time on a Handler. */
|
/** Message data saved to send messages or execute runnables at a later time on a Handler. */
|
||||||
@ -177,14 +190,8 @@ public class FakeClock implements Clock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean sendEmptyMessageDelayed(int what, long delayMs, long referenceTimeMs) {
|
public boolean sendEmptyMessageAtTime(int what, long uptimeMs) {
|
||||||
// Ignore referenceTimeMs measured by SystemClock and just send with requested delay.
|
return addHandlerMessageAtTime(this, what, uptimeMs);
|
||||||
if (delayMs <= 0) {
|
|
||||||
return handler.sendEmptyMessage(what);
|
|
||||||
} else {
|
|
||||||
addDelayedHandlerMessage(this, what, delayMs);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -204,12 +211,7 @@ public class FakeClock implements Clock {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean postDelayed(Runnable runnable, long delayMs) {
|
public boolean postDelayed(Runnable runnable, long delayMs) {
|
||||||
if (delayMs <= 0) {
|
return addHandlerMessageAtTime(this, runnable, uptimeMillis() + delayMs);
|
||||||
return handler.post(runnable);
|
|
||||||
} else {
|
|
||||||
addDelayedHandlerMessage(this, runnable, delayMs);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user