Add a getter for sleeping for offload

This allows wakelock releases to be state based
instead of transition based.

#exo-offload

PiperOrigin-RevId: 337286501
This commit is contained in:
krocard 2020-10-15 13:05:50 +01:00 committed by Oliver Woodman
parent d97dd8d5eb
commit e589d7238a
5 changed files with 35 additions and 8 deletions

View File

@ -631,7 +631,7 @@ public interface ExoPlayer extends Player {
boolean getPauseAtEndOfMediaItems(); 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. * rarely as possible when playing an audio stream using audio offload.
* *
* <p>Only use this scheduling mode if the player is not displaying anything to the user. For * <p>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 {
* <li>The {@link AudioSink} is playing with an offload {@link AudioTrack}. * <li>The {@link AudioSink} is playing with an offload {@link AudioTrack}.
* </ul> * </ul>
* *
* <p>The state where ExoPlayer main loop has been paused to save power during offload playback
* can be queried with {@link #experimentalIsSleepingForOffload()}.
*
* <p>This method is experimental, and will be renamed or removed in a future release. * <p>This method is experimental, and will be renamed or removed in a future release.
* *
* @param offloadSchedulingEnabled Whether to enable offload scheduling. * @param offloadSchedulingEnabled Whether to enable offload scheduling.
*/ */
void experimentalSetOffloadSchedulingEnabled(boolean offloadSchedulingEnabled); 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();
} }

View File

@ -208,6 +208,11 @@ import java.util.concurrent.TimeoutException;
internalPlayer.experimentalSetOffloadSchedulingEnabled(offloadSchedulingEnabled); internalPlayer.experimentalSetOffloadSchedulingEnabled(offloadSchedulingEnabled);
} }
@Override
public boolean experimentalIsSleepingForOffload() {
return playbackInfo.sleepingForOffload;
}
@Override @Override
@Nullable @Nullable
public AudioComponent getAudioComponent() { public AudioComponent getAudioComponent() {

View File

@ -732,9 +732,16 @@ public class SimpleExoPlayer extends BasePlayer
@Override @Override
public void experimentalSetOffloadSchedulingEnabled(boolean offloadSchedulingEnabled) { public void experimentalSetOffloadSchedulingEnabled(boolean offloadSchedulingEnabled) {
verifyApplicationThread();
player.experimentalSetOffloadSchedulingEnabled(offloadSchedulingEnabled); player.experimentalSetOffloadSchedulingEnabled(offloadSchedulingEnabled);
} }
@Override
public boolean experimentalIsSleepingForOffload() {
verifyApplicationThread();
return player.experimentalIsSleepingForOffload();
}
@Override @Override
@Nullable @Nullable
public AudioComponent getAudioComponent() { public AudioComponent getAudioComponent() {
@ -2154,7 +2161,9 @@ public class SimpleExoPlayer extends BasePlayer
switch (playbackState) { switch (playbackState) {
case Player.STATE_READY: case Player.STATE_READY:
case Player.STATE_BUFFERING: 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()); wifiLockManager.setStayAwake(getPlayWhenReady());
break; break;
case Player.STATE_ENDED: case Player.STATE_ENDED:
@ -2495,12 +2504,7 @@ public class SimpleExoPlayer extends BasePlayer
@Override @Override
public void onExperimentalSleepingForOffloadChanged(boolean sleepingForOffload) { public void onExperimentalSleepingForOffloadChanged(boolean sleepingForOffload) {
if (sleepingForOffload) {
// The wifi lock is not released to avoid interrupting downloads.
wakeLockManager.setStayAwake(false);
} else {
updateWakeAndWifiLock(); updateWakeAndWifiLock();
} }
} }
}
} }

View File

@ -8327,6 +8327,7 @@ public final class ExoPlayerTest {
sleepRenderer.sleepOnNextRender(); sleepRenderer.sleepOnNextRender();
runUntilSleepingForOffload(player, /* expectedSleepForOffload= */ true); runUntilSleepingForOffload(player, /* expectedSleepForOffload= */ true);
assertThat(player.experimentalIsSleepingForOffload()).isTrue();
} }
@Test @Test
@ -8345,6 +8346,7 @@ public final class ExoPlayerTest {
player.experimentalSetOffloadSchedulingEnabled(false); // Force the player to exit offload sleep player.experimentalSetOffloadSchedulingEnabled(false); // Force the player to exit offload sleep
runUntilSleepingForOffload(player, /* expectedSleepForOffload= */ false); runUntilSleepingForOffload(player, /* expectedSleepForOffload= */ false);
assertThat(player.experimentalIsSleepingForOffload()).isFalse();
runUntilPlaybackState(player, Player.STATE_ENDED); runUntilPlaybackState(player, Player.STATE_ENDED);
} }
@ -8362,6 +8364,7 @@ public final class ExoPlayerTest {
sleepRenderer.wakeup(); sleepRenderer.wakeup();
runUntilSleepingForOffload(player, /* expectedSleepForOffload= */ false); runUntilSleepingForOffload(player, /* expectedSleepForOffload= */ false);
assertThat(player.experimentalIsSleepingForOffload()).isFalse();
runUntilPlaybackState(player, Player.STATE_ENDED); runUntilPlaybackState(player, Player.STATE_ENDED);
} }

View File

@ -460,4 +460,9 @@ public abstract class StubExoPlayer extends BasePlayer implements ExoPlayer {
public void experimentalSetOffloadSchedulingEnabled(boolean offloadSchedulingEnabled) { public void experimentalSetOffloadSchedulingEnabled(boolean offloadSchedulingEnabled) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
public boolean experimentalIsSleepingForOffload() {
throw new UnsupportedOperationException();
}
} }