@Override @Deprecated @SuppressWarnings("deprecation") public void sendMessages(ExoPlayerMessage... messages) { for (ExoPlayerMessage message : messages) { createMessage(message.target).setType(message.messageType).setPayload(message.message).send(); } }
@Override public PlayerMessage createMessage(PlayerMessage.Target target) { return new PlayerMessage( /* sender= */ this, target, Timeline.EMPTY, /* defaultWindowIndex= */ 0, handler); }
private void deliverMessage(PlayerMessage message) throws ExoPlaybackException { if (message.isCanceled()) { return; } try { message.getTarget().handleMessage(message.getType(), message.getPayload()); } finally { message.markAsProcessed(/* isDelivered= */ true); } }
@Override protected void doActionImpl( final SimpleExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) { if (target instanceof PlayerTarget) { ((PlayerTarget) target).setPlayer(player); } PlayerMessage message = player.createMessage(target); if (windowIndex != C.INDEX_UNSET) { message.setPosition(windowIndex, positionMs); } else { message.setPosition(positionMs); } message.setHandler(new Handler()); message.setDeleteAfterDelivery(deleteAfterDelivery); message.send(); } }
@Override @Deprecated @SuppressWarnings("deprecation") public void blockingSendMessages(ExoPlayerMessage... messages) { List<PlayerMessage> playerMessages = new ArrayList<>(); for (ExoPlayerMessage message : messages) { playerMessages.add( createMessage(message.target) .setType(message.messageType) .setPayload(message.message) .send()); } boolean wasInterrupted = false; for (PlayerMessage message : playerMessages) { boolean blockMessage = true; while (blockMessage) { try { message.blockUntilDelivered(); blockMessage = false; } catch (InterruptedException e) { wasInterrupted = true; } } } if (wasInterrupted) { // Restore the interrupted status. Thread.currentThread().interrupt(); } }
.setPosition(windowIndex, positionMs) .send(); (messageType, payload) -> nextAction.schedule(player, trackSelector, surface, handler)) .setPosition(windowIndex, positionMs) .setHandler(testThreadHandler) .send(); player.setPlayWhenReady(true);
@Override public void run(SimpleExoPlayer player) { message.set( player .createMessage(target) .setPosition(/* positionMs= */ 50) .setDeleteAfterDelivery(/* deleteAfterDelivery= */ false) .send()); } })
@Override public void run(SimpleExoPlayer player) { message.set( player.createMessage(target).setPosition(/* positionMs= */ 50).send()); } })
@Override protected void doActionImpl( SimpleExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) { player .createMessage( (messageType, payload) -> { throw exception; }) .send(); } }
private void resolvePendingMessagePositions() { for (int i = pendingMessages.size() - 1; i >= 0; i--) { if (!resolvePendingMessagePosition(pendingMessages.get(i))) { // Unable to resolve a new position for the message. Remove it. pendingMessages.get(i).message.markAsProcessed(/* isDelivered= */ false); pendingMessages.remove(i); } } // Re-sort messages by playback order. Collections.sort(pendingMessages); }
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); } else if (mediaSource == null || pendingPrepareCount > 0) { // Still waiting for initial timeline to resolve position. pendingMessages.add(new PendingMessageInfo(message)); } else { PendingMessageInfo pendingMessageInfo = new PendingMessageInfo(message); if (resolvePendingMessagePosition(pendingMessageInfo)) { pendingMessages.add(pendingMessageInfo); // Ensure new message is inserted according to playback order. Collections.sort(pendingMessages); } else { message.markAsProcessed(/* isDelivered= */ false); } } }
.executeRunnable(() -> message.get().cancel()) .play() .build(); .start() .blockUntilEnded(TIMEOUT_MS); assertThat(message.get().isCanceled()).isTrue(); assertThat(target.messageCount).isEqualTo(0);
&& nextInfo.resolvedPeriodTimeUs <= newPeriodPositionUs) { sendMessageToTarget(nextInfo.message); if (nextInfo.message.getDeleteAfterDelivery() || nextInfo.message.isCanceled()) { pendingMessages.remove(nextPendingMessageIndex); } else {
/** * This was pulled from the <i>Deprecated</i> ExoPlayerImpl#blockingSendMessages method * * @param messages The messages */ protected void blockingSendMessages(List<PlayerMessage> messages) { boolean wasInterrupted = false; for (PlayerMessage message : messages) { boolean blockMessage = true; while (blockMessage) { try { message.blockUntilDelivered(); blockMessage = false; } catch (InterruptedException e) { wasInterrupted = true; } } } if (wasInterrupted) { // Restore the interrupted status. Thread.currentThread().interrupt(); } }
private void setVideoSurfaceInternal(@Nullable Surface surface, boolean ownsSurface) { // Note: We don't turn this method into a no-op if the surface is being replaced with itself // so as to ensure onRenderedFirstFrame callbacks are still called in this case. List<PlayerMessage> messages = new ArrayList<>(); for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { messages.add( player.createMessage(renderer).setType(C.MSG_SET_SURFACE).setPayload(surface).send()); } } if (this.surface != null && this.surface != surface) { // We're replacing a surface. Block to ensure that it's not accessed after the method returns. try { for (PlayerMessage message : messages) { message.blockUntilDelivered(); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // If we created the previous surface, we are responsible for releasing it. if (this.ownsSurface) { this.surface.release(); } } this.surface = surface; this.ownsSurface = ownsSurface; }
@Override protected void doActionImpl( final SimpleExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) { if (target instanceof PlayerTarget) { ((PlayerTarget) target).setPlayer(player); } PlayerMessage message = player.createMessage(target); if (windowIndex != C.INDEX_UNSET) { message.setPosition(windowIndex, positionMs); } else { message.setPosition(positionMs); } message.setHandler(new Handler()); message.setDeleteAfterDelivery(deleteAfterDelivery); message.send(); } }
.setPosition(windowIndex, positionMs) .send(); (messageType, payload) -> nextAction.schedule(player, trackSelector, surface, handler)) .setPosition(windowIndex, positionMs) .setHandler(testThreadHandler) .send(); player.setPlayWhenReady(true);
@Override protected void doActionImpl( SimpleExoPlayer player, DefaultTrackSelector trackSelector, Surface surface) { player .createMessage( (messageType, payload) -> { throw exception; }) .send(); } }
/** * Cancels the message delivery. * * @return This message. * @throws IllegalStateException If this method is called before {@link #send()}. */ public synchronized PlayerMessage cancel() { Assertions.checkState(isSent); isCanceled = true; markAsProcessed(/* isDelivered= */ false); return this; }
.executeRunnable(() -> message.get().cancel()) .play() .build(); .start() .blockUntilEnded(TIMEOUT_MS); assertThat(message.get().isCanceled()).isTrue(); assertThat(target.messageCount).isEqualTo(1);