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

View File

@ -33,7 +33,8 @@ public final class PlayerMessage {
* *
* @param messageType The message type. * @param messageType The message type.
* @param payload The message payload. * @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; void handleMessage(int messageType, Object payload) throws ExoPlaybackException;
} }