Propagate failures handling messages on the playback thread

This restores functionality that was lost when we added
support for general timed message delivery.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=187866807
This commit is contained in:
olly 2018-03-05 08:00:58 -08:00 committed by Oliver Woodman
parent d8d3bd7b3f
commit 110d6e4fdf
2 changed files with 21 additions and 17 deletions

View File

@ -339,7 +339,7 @@ import java.util.Collections;
}
maybeNotifyPlaybackInfoChanged();
} catch (ExoPlaybackException e) {
Log.e(TAG, "Renderer error.", e);
Log.e(TAG, "Playback error.", e);
stopInternal(/* reset= */ false, /* acknowledgeStop= */ false);
eventHandler.obtainMessage(MSG_ERROR, e).sendToTarget();
maybeNotifyPlaybackInfoChanged();
@ -805,7 +805,7 @@ import java.util.Collections;
}
}
private void sendMessageInternal(PlayerMessage message) {
private void sendMessageInternal(PlayerMessage message) throws ExoPlaybackException {
if (message.getPositionMs() == C.TIME_UNSET) {
// If no delivery time is specified, trigger immediate message delivery.
sendMessageToTarget(message);
@ -824,7 +824,7 @@ import java.util.Collections;
}
}
private void sendMessageToTarget(PlayerMessage message) {
private void sendMessageToTarget(PlayerMessage message) throws ExoPlaybackException {
if (message.getHandler().getLooper() == handler.getLooper()) {
deliverMessage(message);
if (playbackInfo.playbackState == Player.STATE_READY
@ -838,22 +838,24 @@ import java.util.Collections;
}
private void sendMessageToTargetThread(final PlayerMessage message) {
message
.getHandler()
.post(
new Runnable() {
@Override
public void run() {
deliverMessage(message);
}
});
Handler handler = message.getHandler();
handler.post(
new Runnable() {
@Override
public void run() {
try {
deliverMessage(message);
} catch (ExoPlaybackException e) {
Log.e(TAG, "Unexpected error delivering message on external thread.", e);
throw new RuntimeException(e);
}
}
});
}
private void deliverMessage(PlayerMessage message) {
private void deliverMessage(PlayerMessage message) throws ExoPlaybackException {
try {
message.getTarget().handleMessage(message.getType(), message.getPayload());
} catch (ExoPlaybackException e) {
eventHandler.obtainMessage(MSG_ERROR, e).sendToTarget();
} finally {
message.markAsProcessed(/* isDelivered= */ true);
}
@ -899,7 +901,8 @@ import java.util.Collections;
return true;
}
private void maybeTriggerPendingMessages(long oldPeriodPositionUs, long newPeriodPositionUs) {
private void maybeTriggerPendingMessages(long oldPeriodPositionUs, long newPeriodPositionUs)
throws ExoPlaybackException {
if (pendingMessages.isEmpty() || playbackInfo.periodId.isAd()) {
return;
}

View File

@ -33,7 +33,8 @@ public final class PlayerMessage {
*
* @param messageType The message type.
* @param payload The message payload.
* @throws ExoPlaybackException If an error occurred whilst handling the message.
* @throws ExoPlaybackException If an error occurred whilst handling the message. Should only be
* thrown by targets that handle messages on the playback thread.
*/
void handleMessage(int messageType, Object payload) throws ExoPlaybackException;
}