From e589d7238a54a60a9621ccedca7566941a9ee024 Mon Sep 17 00:00:00 2001 From: krocard Date: Thu, 15 Oct 2020 13:05:50 +0100 Subject: [PATCH] Add a getter for sleeping for offload This allows wakelock releases to be state based instead of transition based. #exo-offload PiperOrigin-RevId: 337286501 --- .../google/android/exoplayer2/ExoPlayer.java | 12 +++++++++++- .../android/exoplayer2/ExoPlayerImpl.java | 5 +++++ .../android/exoplayer2/SimpleExoPlayer.java | 18 +++++++++++------- .../android/exoplayer2/ExoPlayerTest.java | 3 +++ .../exoplayer2/testutil/StubExoPlayer.java | 5 +++++ 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 1bf52ebf29..9adab4d9b2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -631,7 +631,7 @@ public interface ExoPlayer extends Player { boolean getPauseAtEndOfMediaItems(); /** - * Sets whether audio offload scheduling is enabled. If enabled, ExoPlayer's main loop will as + * Sets whether audio offload scheduling is enabled. If enabled, ExoPlayer's main loop will run as * rarely as possible when playing an audio stream using audio offload. * *

Only use this scheduling mode if the player is not displaying anything to the user. For @@ -660,9 +660,19 @@ public interface ExoPlayer extends Player { *

  • The {@link AudioSink} is playing with an offload {@link AudioTrack}. * * + *

    The state where ExoPlayer main loop has been paused to save power during offload playback + * can be queried with {@link #experimentalIsSleepingForOffload()}. + * *

    This method is experimental, and will be renamed or removed in a future release. * * @param offloadSchedulingEnabled Whether to enable offload scheduling. */ void experimentalSetOffloadSchedulingEnabled(boolean offloadSchedulingEnabled); + + /** + * Returns whether the player has paused its main loop to save power in offload scheduling mode. + * + * @see #experimentalSetOffloadSchedulingEnabled(boolean) + */ + boolean experimentalIsSleepingForOffload(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 9820d061aa..4fdd80b561 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -208,6 +208,11 @@ import java.util.concurrent.TimeoutException; internalPlayer.experimentalSetOffloadSchedulingEnabled(offloadSchedulingEnabled); } + @Override + public boolean experimentalIsSleepingForOffload() { + return playbackInfo.sleepingForOffload; + } + @Override @Nullable public AudioComponent getAudioComponent() { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index aa79459e06..147f277b8a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -732,9 +732,16 @@ public class SimpleExoPlayer extends BasePlayer @Override public void experimentalSetOffloadSchedulingEnabled(boolean offloadSchedulingEnabled) { + verifyApplicationThread(); player.experimentalSetOffloadSchedulingEnabled(offloadSchedulingEnabled); } + @Override + public boolean experimentalIsSleepingForOffload() { + verifyApplicationThread(); + return player.experimentalIsSleepingForOffload(); + } + @Override @Nullable public AudioComponent getAudioComponent() { @@ -2154,7 +2161,9 @@ public class SimpleExoPlayer extends BasePlayer switch (playbackState) { case Player.STATE_READY: case Player.STATE_BUFFERING: - wakeLockManager.setStayAwake(getPlayWhenReady()); + boolean isSleeping = experimentalIsSleepingForOffload(); + wakeLockManager.setStayAwake(getPlayWhenReady() && !isSleeping); + // The wifi lock is not released while sleeping to avoid interrupting downloads. wifiLockManager.setStayAwake(getPlayWhenReady()); break; case Player.STATE_ENDED: @@ -2495,12 +2504,7 @@ public class SimpleExoPlayer extends BasePlayer @Override public void onExperimentalSleepingForOffloadChanged(boolean sleepingForOffload) { - if (sleepingForOffload) { - // The wifi lock is not released to avoid interrupting downloads. - wakeLockManager.setStayAwake(false); - } else { - updateWakeAndWifiLock(); - } + updateWakeAndWifiLock(); } } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 831e66a019..27aa7f3b00 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -8327,6 +8327,7 @@ public final class ExoPlayerTest { sleepRenderer.sleepOnNextRender(); runUntilSleepingForOffload(player, /* expectedSleepForOffload= */ true); + assertThat(player.experimentalIsSleepingForOffload()).isTrue(); } @Test @@ -8345,6 +8346,7 @@ public final class ExoPlayerTest { player.experimentalSetOffloadSchedulingEnabled(false); // Force the player to exit offload sleep runUntilSleepingForOffload(player, /* expectedSleepForOffload= */ false); + assertThat(player.experimentalIsSleepingForOffload()).isFalse(); runUntilPlaybackState(player, Player.STATE_ENDED); } @@ -8362,6 +8364,7 @@ public final class ExoPlayerTest { sleepRenderer.wakeup(); runUntilSleepingForOffload(player, /* expectedSleepForOffload= */ false); + assertThat(player.experimentalIsSleepingForOffload()).isFalse(); runUntilPlaybackState(player, Player.STATE_ENDED); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index 858f7319b8..96cd5d660e 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -460,4 +460,9 @@ public abstract class StubExoPlayer extends BasePlayer implements ExoPlayer { public void experimentalSetOffloadSchedulingEnabled(boolean offloadSchedulingEnabled) { throw new UnsupportedOperationException(); } + + @Override + public boolean experimentalIsSleepingForOffload() { + throw new UnsupportedOperationException(); + } }