diff --git a/app/build.gradle b/app/build.gradle index 20d6ab003..6593da2a9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -96,7 +96,7 @@ ext { checkstyleVersion = '8.38' stethoVersion = '1.5.1' leakCanaryVersion = '2.5' - exoPlayerVersion = '2.11.8' + exoPlayerVersion = '2.12.3' androidxLifecycleVersion = '2.2.0' androidxRoomVersion = '2.3.0-alpha03' groupieVersion = '2.8.1' diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index ab93d8742..f8e0732b3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -601,7 +601,8 @@ public final class Player implements final PlaybackParameters savedParameters = retrievePlaybackParametersFromPrefs(this); final float playbackSpeed = savedParameters.speed; final float playbackPitch = savedParameters.pitch; - final boolean playbackSkipSilence = savedParameters.skipSilence; + final boolean playbackSkipSilence = getPrefs().getBoolean(getContext().getString( + R.string.playback_skip_silence_key), getPlaybackSkipSilence()); final boolean samePlayQueue = playQueue != null && playQueue.equals(newQueue); final int repeatMode = intent.getIntExtra(REPEAT_MODE, getRepeatMode()); @@ -1516,7 +1517,8 @@ public final class Player implements } public boolean getPlaybackSkipSilence() { - return getPlaybackParameters().skipSilence; + return !exoPlayerIsNull() && simpleExoPlayer.getAudioComponent() != null + && simpleExoPlayer.getAudioComponent().getSkipSilenceEnabled(); } public PlaybackParameters getPlaybackParameters() { @@ -1541,7 +1543,10 @@ public final class Player implements savePlaybackParametersToPrefs(this, roundedSpeed, roundedPitch, skipSilence); simpleExoPlayer.setPlaybackParameters( - new PlaybackParameters(roundedSpeed, roundedPitch, skipSilence)); + new PlaybackParameters(roundedSpeed, roundedPitch)); + if (simpleExoPlayer.getAudioComponent() != null) { + simpleExoPlayer.getAudioComponent().setSkipSilenceEnabled(skipSilence); + } } //endregion @@ -2417,6 +2422,7 @@ public final class Player implements case ExoPlaybackException.TYPE_OUT_OF_MEMORY: case ExoPlaybackException.TYPE_REMOTE: case ExoPlaybackException.TYPE_RENDERER: + case ExoPlaybackException.TYPE_TIMEOUT: default: showUnrecoverableError(error); onPlaybackShutdown(); @@ -3439,7 +3445,7 @@ public final class Player implements final List availableLanguages = new ArrayList<>(textTracks.length); for (int i = 0; i < textTracks.length; i++) { final TrackGroup textTrack = textTracks.get(i); - if (textTrack.length > 0 && textTrack.getFormat(0) != null) { + if (textTrack.length > 0) { availableLanguages.add(textTrack.getFormat(0).language); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java b/app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java index 0604e6ae8..ba9a2f1ec 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java @@ -80,12 +80,14 @@ public class LoadController implements LoadControl { } @Override - public boolean shouldContinueLoading(final long bufferedDurationUs, + public boolean shouldContinueLoading(final long playbackPositionUs, + final long bufferedDurationUs, final float playbackSpeed) { if (!preloadingEnabled) { return false; } - return internalLoadControl.shouldContinueLoading(bufferedDurationUs, playbackSpeed); + return internalLoadControl.shouldContinueLoading( + playbackPositionUs, bufferedDurationUs, playbackSpeed); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index e07be0c21..4324fcd0a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -495,9 +495,7 @@ public final class PlayerHelper { R.string.playback_speed_key), player.getPlaybackSpeed()); final float pitch = player.getPrefs().getFloat(player.getContext().getString( R.string.playback_pitch_key), player.getPlaybackPitch()); - final boolean skipSilence = player.getPrefs().getBoolean(player.getContext().getString( - R.string.playback_skip_silence_key), player.getPlaybackSkipSilence()); - return new PlaybackParameters(speed, pitch, skipSilence); + return new PlaybackParameters(speed, pitch); } public static void savePlaybackParametersToPrefs(final Player player, diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java b/app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java index c09a44c08..7594f3a16 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java @@ -5,6 +5,7 @@ import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.source.BaseMediaSource; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.upstream.Allocator; @@ -54,6 +55,14 @@ public class FailedMediaSource extends BaseMediaSource implements ManagedMediaSo return System.currentTimeMillis() >= retryTimestamp; } + /** + * Returns the {@link MediaItem} whose media is provided by the source. + */ + @Override + public MediaItem getMediaItem() { + return MediaItem.fromUri(playQueueItem.getUrl()); + } + @Override public void maybeThrowSourceInfoRefreshError() throws IOException { throw new IOException(error); diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java b/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java index cdbf8609b..746a97581 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java @@ -5,6 +5,8 @@ import android.os.Handler; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSourceEventListener; @@ -83,6 +85,38 @@ public class LoadedMediaSource implements ManagedMediaSource { source.removeEventListener(eventListener); } + /** + * Adds a {@link DrmSessionEventListener} to the list of listeners which are notified of DRM + * events for this media source. + * + * @param handler A handler on the which listener events will be posted. + * @param eventListener The listener to be added. + */ + @Override + public void addDrmEventListener(final Handler handler, + final DrmSessionEventListener eventListener) { + source.addDrmEventListener(handler, eventListener); + } + + /** + * Removes a {@link DrmSessionEventListener} from the list of listeners which are notified of + * DRM events for this media source. + * + * @param eventListener The listener to be removed. + */ + @Override + public void removeDrmEventListener(final DrmSessionEventListener eventListener) { + source.removeDrmEventListener(eventListener); + } + + /** + * Returns the {@link MediaItem} whose media is provided by the source. + */ + @Override + public MediaItem getMediaItem() { + return source.getMediaItem(); + } + @Override public boolean shouldBeReplacedWith(@NonNull final PlayQueueItem newIdentity, final boolean isInterruptable) { diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasource/PlaceholderMediaSource.java b/app/src/main/java/org/schabi/newpipe/player/mediasource/PlaceholderMediaSource.java index f73a219d7..1cd855627 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasource/PlaceholderMediaSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasource/PlaceholderMediaSource.java @@ -3,6 +3,7 @@ package org.schabi.newpipe.player.mediasource; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.source.BaseMediaSource; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.upstream.Allocator; @@ -11,6 +12,14 @@ import com.google.android.exoplayer2.upstream.TransferListener; import org.schabi.newpipe.player.playqueue.PlayQueueItem; public class PlaceholderMediaSource extends BaseMediaSource implements ManagedMediaSource { + /** + * Returns the {@link MediaItem} whose media is provided by the source. + */ + @Override + public MediaItem getMediaItem() { + return null; + } + // Do nothing, so this will stall the playback @Override public void maybeThrowSourceInfoRefreshError() { }