/** * Creates an {@link ExoPlayer} instance. * * @param renderers The {@link Renderer}s that will be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. * @param bandwidthMeter The {@link BandwidthMeter} that will be used by the instance. * @param looper The {@link Looper} which must be used for all calls to the player and which is * used to call listeners on. */ public static ExoPlayer newInstance( Renderer[] renderers, TrackSelector trackSelector, LoadControl loadControl, BandwidthMeter bandwidthMeter, Looper looper) { return new ExoPlayerImpl( renderers, trackSelector, loadControl, bandwidthMeter, Clock.DEFAULT, looper); }
@Override public void addListener(Player.EventListener listener) { verifyApplicationThread(); player.addListener(listener); }
@Override @Deprecated @SuppressWarnings("deprecation") public void blockingSendMessages(ExoPlayerMessage... messages) { player.blockingSendMessages(messages); }
@Override public long getBufferedPosition() { if (isPlayingAd()) { return playbackInfo.loadingMediaPeriodId.equals(playbackInfo.periodId) ? C.usToMs(playbackInfo.bufferedPositionUs) : getDuration(); } return getContentBufferedPosition(); }
@Override public long getDuration() { if (isPlayingAd()) { MediaPeriodId periodId = playbackInfo.periodId; playbackInfo.timeline.getPeriodByUid(periodId.periodUid, period); long adDurationUs = period.getAdDurationUs(periodId.adGroupIndex, periodId.adIndexInAdGroup); return C.usToMs(adDurationUs); } return getContentDuration(); }
@Override public PlayerMessage createMessage(PlayerMessage.Target target) { verifyApplicationThread(); return player.createMessage(target); }
@Override public Looper getApplicationLooper() { return player.getApplicationLooper(); }
@Override public long getBufferedPosition() { verifyApplicationThread(); return player.getBufferedPosition(); }
@Override public int getCurrentAdGroupIndex() { verifyApplicationThread(); return player.getCurrentAdGroupIndex(); }
@Override public long getContentPosition() { verifyApplicationThread(); return player.getContentPosition(); }
@Override public long getContentBufferedPosition() { verifyApplicationThread(); return player.getContentBufferedPosition(); }
@Override @Deprecated @SuppressWarnings("deprecation") public void sendMessages(ExoPlayerMessage... messages) { for (ExoPlayerMessage message : messages) { createMessage(message.target).setType(message.messageType).setPayload(message.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(); } }
/** @deprecated Use {@link com.google.android.exoplayer2.video.VideoListener}. */ @Deprecated public interface VideoListener extends com.google.android.exoplayer2.video.VideoListener {}
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; }
private void sendVolumeToRenderers() { float scaledVolume = audioVolume * audioFocusManager.getVolumeMultiplier(); for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_AUDIO) { player.createMessage(renderer).setType(C.MSG_SET_VOLUME).setPayload(scaledVolume).send(); } } }
@Override public void setAuxEffectInfo(AuxEffectInfo auxEffectInfo) { verifyApplicationThread(); for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_AUDIO) { player .createMessage(renderer) .setType(C.MSG_SET_AUX_EFFECT_INFO) .setPayload(auxEffectInfo) .send(); } } }
@Override public void setCameraMotionListener(CameraMotionListener listener) { verifyApplicationThread(); cameraMotionListener = listener; for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_CAMERA_MOTION) { player .createMessage(renderer) .setType(C.MSG_SET_CAMERA_MOTION_LISTENER) .setPayload(listener) .send(); } } }
@Override public void setVideoFrameMetadataListener(VideoFrameMetadataListener listener) { verifyApplicationThread(); videoFrameMetadataListener = listener; for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { player .createMessage(renderer) .setType(C.MSG_SET_VIDEO_FRAME_METADATA_LISTENER) .setPayload(listener) .send(); } } }
@Override public void clearVideoFrameMetadataListener(VideoFrameMetadataListener listener) { verifyApplicationThread(); if (videoFrameMetadataListener != listener) { return; } for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { player .createMessage(renderer) .setType(C.MSG_SET_VIDEO_FRAME_METADATA_LISTENER) .setPayload(null) .send(); } } }