add get/setPlaybackSpeed and listener callback

This change deprecates the PlaybackParameters and remove the skipSilenceField from the PlaybackParameters. This implies that enabling and disabling skipping silences needs to be done on the Player.AudioComponent after this change.

After submission of the change, all Player API changes are done which are required to bring playbackSpeed and skipSilenceEnabled in the converged Player API state.

PiperOrigin-RevId: 300420843
This commit is contained in:
bachinger 2020-03-11 22:31:57 +00:00 committed by Oliver Woodman
parent 7b82a3c889
commit 683cb0260e
15 changed files with 202 additions and 106 deletions

View File

@ -406,16 +406,32 @@ public final class CastPlayer extends BasePlayer {
flushNotifications();
}
/** @deprecated Use {@link #setPlaybackSpeed(float)} instead. */
@SuppressWarnings("deprecation")
@Deprecated
@Override
public void setPlaybackParameters(@Nullable PlaybackParameters playbackParameters) {
// Unsupported by the RemoteMediaClient API. Do nothing.
}
/** @deprecated Use {@link #getPlaybackSpeed()} instead. */
@SuppressWarnings("deprecation")
@Deprecated
@Override
public PlaybackParameters getPlaybackParameters() {
return PlaybackParameters.DEFAULT;
}
@Override
public void setPlaybackSpeed(float playbackSpeed) {
// Unsupported by the RemoteMediaClient API. Do nothing.
}
@Override
public float getPlaybackSpeed() {
return Player.DEFAULT_PLAYBACK_SPEED;
}
@Override
public void stop(boolean reset) {
playbackState = STATE_IDLE;

View File

@ -78,8 +78,8 @@ import java.util.concurrent.TimeoutException;
@DiscontinuityReason private int pendingDiscontinuityReason;
@PlayWhenReadyChangeReason private int pendingPlayWhenReadyChangeReason;
private boolean foregroundMode;
private int pendingSetPlaybackParametersAcks;
private PlaybackParameters playbackParameters;
private int pendingSetPlaybackSpeedAcks;
private float playbackSpeed;
private SeekParameters seekParameters;
private ShuffleOrder shuffleOrder;
@ -132,7 +132,7 @@ import java.util.concurrent.TimeoutException;
new TrackSelection[renderers.length],
null);
period = new Timeline.Period();
playbackParameters = PlaybackParameters.DEFAULT;
playbackSpeed = Player.DEFAULT_PLAYBACK_SPEED;
seekParameters = SeekParameters.DEFAULT;
maskingWindowIndex = C.INDEX_UNSET;
eventHandler =
@ -535,24 +535,44 @@ import java.util.concurrent.TimeoutException;
notifyListeners(listener -> listener.onPositionDiscontinuity(DISCONTINUITY_REASON_SEEK));
}
/** @deprecated Use {@link #setPlaybackSpeed(float)} instead. */
@SuppressWarnings("deprecation")
@Deprecated
@Override
public void setPlaybackParameters(@Nullable PlaybackParameters playbackParameters) {
if (playbackParameters == null) {
playbackParameters = PlaybackParameters.DEFAULT;
setPlaybackSpeed(
playbackParameters != null ? playbackParameters.speed : Player.DEFAULT_PLAYBACK_SPEED);
}
if (this.playbackParameters.equals(playbackParameters)) {
/** @deprecated Use {@link #getPlaybackSpeed()} instead. */
@SuppressWarnings("deprecation")
@Deprecated
@Override
public PlaybackParameters getPlaybackParameters() {
return new PlaybackParameters(playbackSpeed);
}
@SuppressWarnings("deprecation")
@Override
public void setPlaybackSpeed(float playbackSpeed) {
Assertions.checkState(playbackSpeed > 0);
if (this.playbackSpeed == playbackSpeed) {
return;
}
pendingSetPlaybackParametersAcks++;
this.playbackParameters = playbackParameters;
pendingSetPlaybackSpeedAcks++;
this.playbackSpeed = playbackSpeed;
PlaybackParameters playbackParameters = new PlaybackParameters(playbackSpeed);
internalPlayer.setPlaybackParameters(playbackParameters);
PlaybackParameters playbackParametersToNotify = playbackParameters;
notifyListeners(listener -> listener.onPlaybackParametersChanged(playbackParametersToNotify));
notifyListeners(
listener -> {
listener.onPlaybackParametersChanged(playbackParameters);
listener.onPlaybackSpeedChanged(playbackSpeed);
});
}
@Override
public PlaybackParameters getPlaybackParameters() {
return playbackParameters;
public float getPlaybackSpeed() {
return playbackSpeed;
}
@Override
@ -764,8 +784,8 @@ import java.util.concurrent.TimeoutException;
case ExoPlayerImplInternal.MSG_PLAYBACK_INFO_CHANGED:
handlePlaybackInfo((ExoPlayerImplInternal.PlaybackInfoUpdate) msg.obj);
break;
case ExoPlayerImplInternal.MSG_PLAYBACK_PARAMETERS_CHANGED:
handlePlaybackParameters((PlaybackParameters) msg.obj, /* operationAck= */ msg.arg1 != 0);
case ExoPlayerImplInternal.MSG_PLAYBACK_SPEED_CHANGED:
handlePlaybackSpeed((Float) msg.obj, /* operationAck= */ msg.arg1 != 0);
break;
default:
throw new IllegalStateException();
@ -781,15 +801,19 @@ import java.util.concurrent.TimeoutException;
}
}
private void handlePlaybackParameters(
PlaybackParameters playbackParameters, boolean operationAck) {
@SuppressWarnings("deprecation")
private void handlePlaybackSpeed(float playbackSpeed, boolean operationAck) {
if (operationAck) {
pendingSetPlaybackParametersAcks--;
pendingSetPlaybackSpeedAcks--;
}
if (pendingSetPlaybackParametersAcks == 0) {
if (!this.playbackParameters.equals(playbackParameters)) {
this.playbackParameters = playbackParameters;
notifyListeners(listener -> listener.onPlaybackParametersChanged(playbackParameters));
if (pendingSetPlaybackSpeedAcks == 0) {
if (this.playbackSpeed != playbackSpeed) {
this.playbackSpeed = playbackSpeed;
notifyListeners(
listener -> {
listener.onPlaybackParametersChanged(new PlaybackParameters(playbackSpeed));
listener.onPlaybackSpeedChanged(playbackSpeed);
});
}
}
}

View File

@ -64,7 +64,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
// External messages
public static final int MSG_PLAYBACK_INFO_CHANGED = 0;
public static final int MSG_PLAYBACK_PARAMETERS_CHANGED = 1;
public static final int MSG_PLAYBACK_SPEED_CHANGED = 1;
// Internal messages
private static final int MSG_PREPARE = 0;
@ -1902,7 +1902,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
throws ExoPlaybackException {
eventHandler
.obtainMessage(
MSG_PLAYBACK_PARAMETERS_CHANGED, acknowledgeCommand ? 1 : 0, 0, playbackParameters)
MSG_PLAYBACK_SPEED_CHANGED, acknowledgeCommand ? 1 : 0, 0, playbackParameters.speed)
.sendToTarget();
updateTrackSelectionPlaybackSpeed(playbackParameters.speed);
for (Renderer renderer : renderers) {

View File

@ -19,8 +19,11 @@ import androidx.annotation.Nullable;
import com.google.android.exoplayer2.util.Assertions;
/**
* The parameters that apply to playback.
* @deprecated Use {@link Player#setPlaybackSpeed(float)} and {@link
* Player.AudioComponent#setSkipSilenceEnabled(boolean)} instead.
*/
@SuppressWarnings("deprecation")
@Deprecated
public final class PlaybackParameters {
/** The default playback parameters: real-time playback with no silence skipping. */
@ -29,9 +32,6 @@ public final class PlaybackParameters {
/** The factor by which playback will be sped up. */
public final float speed;
/** Whether to skip silence in the input. */
public final boolean skipSilence;
private final int scaledUsPerMs;
/**
@ -40,20 +40,8 @@ public final class PlaybackParameters {
* @param speed The factor by which playback will be sped up. Must be greater than zero.
*/
public PlaybackParameters(float speed) {
this(speed, /* skipSilence= */ false);
}
/**
* Creates new playback parameters that set the playback speed and whether to skip silence in the
* audio stream.
*
* @param speed The factor by which playback will be sped up. Must be greater than zero.
* @param skipSilence Whether to skip silences in the audio stream.
*/
public PlaybackParameters(float speed, boolean skipSilence) {
Assertions.checkArgument(speed > 0);
this.speed = speed;
this.skipSilence = skipSilence;
scaledUsPerMs = Math.round(speed * 1000f);
}
@ -77,16 +65,11 @@ public final class PlaybackParameters {
return false;
}
PlaybackParameters other = (PlaybackParameters) obj;
return this.speed == other.speed
&& this.skipSilence == other.skipSilence;
return this.speed == other.speed;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + Float.floatToRawIntBits(speed);
result = 31 * result + (skipSilence ? 1 : 0);
return result;
return Float.floatToRawIntBits(speed);
}
}

View File

@ -515,15 +515,21 @@ public interface Player {
default void onPositionDiscontinuity(@DiscontinuityReason int reason) {}
/**
* Called when the current playback parameters change. The playback parameters may change due to
* a call to {@link #setPlaybackParameters(PlaybackParameters)}, or the player itself may change
* them (for example, if audio playback switches to passthrough mode, where speed adjustment is
* no longer possible).
*
* @param playbackParameters The playback parameters.
* @deprecated Use {@link #onPlaybackSpeedChanged(float)} and {@link
* AudioListener#onSkipSilenceEnabledChanged(boolean)} instead.
*/
@SuppressWarnings("deprecation")
@Deprecated
default void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {}
/**
* Called when the current playback speed changes. The normal playback speed is 1. The speed may
* change due to a call to {@link #setPlaybackSpeed(float)}, or the player itself may change it
* (for example, if audio playback switches to passthrough mode, where speed adjustment is no
* longer possible).
*/
default void onPlaybackSpeedChanged(float playbackSpeed) {}
/**
* Called when all pending seek requests have been processed by the player. This is guaranteed
* to happen after any necessary changes to the player state were reported to {@link
@ -701,6 +707,9 @@ public interface Player {
/** Timeline changed as a result of a dynamic update introduced by the played media. */
int TIMELINE_CHANGE_REASON_SOURCE_UPDATE = 1;
/** The default playback speed. */
float DEFAULT_PLAYBACK_SPEED = 1.0f;
/** Returns the component of this player for audio output, or null if audio is not supported. */
@Nullable
AudioComponent getAudioComponent();
@ -913,24 +922,39 @@ public interface Player {
void next();
/**
* Attempts to set the playback parameters. Passing {@code null} sets the parameters to the
* default, {@link PlaybackParameters#DEFAULT}, which means there is no speed or pitch adjustment.
*
* <p>Playback parameters changes may cause the player to buffer. {@link
* EventListener#onPlaybackParametersChanged(PlaybackParameters)} will be called whenever the
* currently active playback parameters change.
*
* @param playbackParameters The playback parameters, or {@code null} to use the defaults.
* @deprecated Use {@link #setPlaybackSpeed(float)} or {@link
* AudioComponent#setSkipSilenceEnabled(boolean)} instead.
*/
@SuppressWarnings("deprecation")
@Deprecated
void setPlaybackParameters(@Nullable PlaybackParameters playbackParameters);
/**
* Returns the currently active playback parameters.
*
* @see EventListener#onPlaybackParametersChanged(PlaybackParameters)
* @deprecated Use {@link #getPlaybackSpeed()} or {@link AudioComponent#getSkipSilenceEnabled()}
* instead.
*/
@SuppressWarnings("deprecation")
@Deprecated
PlaybackParameters getPlaybackParameters();
/**
* Attempts to set the playback speed.
*
* <p>Playback speed changes may cause the player to buffer. {@link
* EventListener#onPlaybackSpeedChanged(float)} will be called whenever the currently active
* playback speed change.
*
* @param playbackSpeed The playback speed.
*/
void setPlaybackSpeed(float playbackSpeed);
/**
* Returns the currently active playback speed.
*
* @see EventListener#onPlaybackSpeedChanged(float)
*/
float getPlaybackSpeed();
/**
* Stops playback without resetting the player. Use {@link #pause()} rather than this method if
* the intention is to pause playback.

View File

@ -853,23 +853,19 @@ public class SimpleExoPlayer extends BasePlayer
this.priorityTaskManager = priorityTaskManager;
}
/**
* Sets the {@link PlaybackParams} governing audio playback.
*
* @deprecated Use {@link #setPlaybackParameters(PlaybackParameters)}.
* @param params The {@link PlaybackParams}, or null to clear any previously set parameters.
*/
/** @deprecated Use {@link #setPlaybackSpeed(float)} instead. */
@SuppressWarnings("deprecation")
@Deprecated
@RequiresApi(23)
public void setPlaybackParams(@Nullable PlaybackParams params) {
PlaybackParameters playbackParameters;
float playbackSpeed;
if (params != null) {
params.allowDefaults();
playbackParameters = new PlaybackParameters(params.getSpeed());
playbackSpeed = params.getSpeed();
} else {
playbackParameters = null;
playbackSpeed = 1.0f;
}
setPlaybackParameters(playbackParameters);
setPlaybackSpeed(playbackSpeed);
}
/** Returns the video format currently being played, or null if no video is being played. */
@ -1390,26 +1386,39 @@ public class SimpleExoPlayer extends BasePlayer
player.seekTo(windowIndex, positionMs);
}
/**
* @deprecated Use {@link #setPlaybackSpeed(float)} and {@link #setSkipSilenceEnabled(boolean)}
* instead.
*/
@SuppressWarnings("deprecation")
@Deprecated
@Override
public void setPlaybackParameters(@Nullable PlaybackParameters playbackParameters) {
verifyApplicationThread();
boolean newSkipSilenceEnabled =
playbackParameters != null
? playbackParameters.skipSilence
: PlaybackParameters.DEFAULT.skipSilence;
if (skipSilenceEnabled != newSkipSilenceEnabled) {
skipSilenceEnabled = newSkipSilenceEnabled;
notifySkipSilenceEnabledChanged();
}
player.setPlaybackParameters(playbackParameters);
}
/** @deprecated Use {@link #getPlaybackSpeed()} and {@link #getSkipSilenceEnabled()} instead. */
@SuppressWarnings("deprecation")
@Deprecated
@Override
public PlaybackParameters getPlaybackParameters() {
verifyApplicationThread();
return player.getPlaybackParameters();
}
@Override
public void setPlaybackSpeed(float playbackSpeed) {
verifyApplicationThread();
player.setPlaybackSpeed(playbackSpeed);
}
@Override
public float getPlaybackSpeed() {
verifyApplicationThread();
return player.getPlaybackSpeed();
}
@Override
public void setSeekParameters(@Nullable SeekParameters seekParameters) {
verifyApplicationThread();

View File

@ -531,6 +531,12 @@ public class AnalyticsCollector
}
}
/**
* @deprecated Use {@link #onPlaybackSpeedChanged(float)} and {@link
* #onSkipSilenceEnabledChanged(boolean)} instead.
*/
@SuppressWarnings("deprecation")
@Deprecated
@Override
public final void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime();
@ -539,6 +545,14 @@ public class AnalyticsCollector
}
}
@Override
public void onPlaybackSpeedChanged(float playbackSpeed) {
EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime();
for (AnalyticsListener listener : listeners) {
listener.onPlaybackSpeedChanged(eventTime, playbackSpeed);
}
}
@Override
public final void onSeekProcessed() {
if (isSeeking) {

View File

@ -197,14 +197,22 @@ public interface AnalyticsListener {
default void onSeekProcessed(EventTime eventTime) {}
/**
* Called when the playback parameters changed.
*
* @param eventTime The event time.
* @param playbackParameters The new playback parameters.
* @deprecated Use {@link #onPlaybackSpeedChanged(EventTime, float)} and {@link
* #onSkipSilenceEnabledChanged(EventTime, boolean)} instead.
*/
@SuppressWarnings("deprecation")
@Deprecated
default void onPlaybackParametersChanged(
EventTime eventTime, PlaybackParameters playbackParameters) {}
/**
* Called when the playback speed changes.
*
* @param eventTime The event time.
* @param playbackSpeed The playback speed.
*/
default void onPlaybackSpeedChanged(EventTime eventTime, float playbackSpeed) {}
/**
* Called when the repeat mode changed.
*

View File

@ -276,6 +276,7 @@ public interface AudioSink {
void setPlaybackParameters(PlaybackParameters playbackParameters);
/** @deprecated Use {@link #getPlaybackSpeed()} and {@link #getSkipSilenceEnabled()} instead. */
@SuppressWarnings("deprecation")
@Deprecated
PlaybackParameters getPlaybackParameters();

View File

@ -158,12 +158,11 @@ public final class DefaultAudioSink implements AudioSink {
* @deprecated Use {@link #applyPlaybackSpeed(float)} and {@link
* #applySkipSilenceEnabled(boolean)} instead.
*/
@SuppressWarnings("deprecation")
@Deprecated
@Override
public PlaybackParameters applyPlaybackParameters(PlaybackParameters playbackParameters) {
return new PlaybackParameters(
applyPlaybackSpeed(playbackParameters.speed),
applySkipSilenceEnabled(playbackParameters.skipSilence));
return new PlaybackParameters(applyPlaybackSpeed(playbackParameters.speed));
}
@Override
@ -866,19 +865,20 @@ public final class DefaultAudioSink implements AudioSink {
* @deprecated Use {@link #setPlaybackSpeed(float)} and {@link #setSkipSilenceEnabled(boolean)}
* instead.
*/
@SuppressWarnings("deprecation")
@Deprecated
@Override
public void setPlaybackParameters(PlaybackParameters playbackParameters) {
setPlaybackSpeedAndSkipSilence(playbackParameters.speed, playbackParameters.skipSilence);
setPlaybackSpeedAndSkipSilence(playbackParameters.speed, getSkipSilenceEnabled());
}
/** @deprecated Use {@link #getPlaybackSpeed()} and {@link #getSkipSilenceEnabled()} instead. */
@SuppressWarnings("deprecation")
@Deprecated
@Override
public PlaybackParameters getPlaybackParameters() {
MediaPositionParameters mediaPositionParameters = getMediaPositionParameters();
return new PlaybackParameters(
mediaPositionParameters.playbackSpeed, mediaPositionParameters.skipSilence);
return new PlaybackParameters(mediaPositionParameters.playbackSpeed);
}
@Override

View File

@ -99,18 +99,19 @@ public class ForwardingAudioSink implements AudioSink {
* @deprecated Use {@link #setPlaybackSpeed(float)} and {@link #setSkipSilenceEnabled(boolean)}
* instead.
*/
@SuppressWarnings("deprecation")
@Deprecated
@Override
public void setPlaybackParameters(PlaybackParameters playbackParameters) {
sink.setPlaybackSpeed(playbackParameters.speed);
sink.setSkipSilenceEnabled(playbackParameters.skipSilence);
sink.setPlaybackParameters(playbackParameters);
}
/** @deprecated Use {@link #getPlaybackSpeed()} and {@link #getSkipSilenceEnabled()} instead. */
@SuppressWarnings("deprecation")
@Deprecated
@Override
public PlaybackParameters getPlaybackParameters() {
return new PlaybackParameters(sink.getPlaybackSpeed(), sink.getSkipSilenceEnabled());
return sink.getPlaybackParameters();
}
@Override

View File

@ -149,9 +149,12 @@ public class EventLogger implements AnalyticsListener {
logd(
eventTime,
"playbackParameters",
Util.formatInvariant(
"speed=%.2f, skipSilence=%s",
playbackParameters.speed, playbackParameters.skipSilence));
Util.formatInvariant("speed=%.2f", playbackParameters.speed));
}
@Override
public void onPlaybackSpeedChanged(EventTime eventTime, float playbackSpeed) {
logd(eventTime, "playbackSpeed", Float.toString(playbackSpeed));
}
@Override

View File

@ -26,7 +26,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.RenderersFactory;
@ -76,7 +75,7 @@ public final class AnalyticsCollectorTest {
private static final int EVENT_POSITION_DISCONTINUITY = 2;
private static final int EVENT_SEEK_STARTED = 3;
private static final int EVENT_SEEK_PROCESSED = 4;
private static final int EVENT_PLAYBACK_PARAMETERS_CHANGED = 5;
private static final int EVENT_PLAYBACK_SPEED_CHANGED = 5;
private static final int EVENT_REPEAT_MODE_CHANGED = 6;
private static final int EVENT_SHUFFLE_MODE_CHANGED = 7;
private static final int EVENT_LOADING_CHANGED = 8;
@ -1464,10 +1463,10 @@ public final class AnalyticsCollectorTest {
reportedEvents.add(new ReportedEvent(EVENT_SEEK_PROCESSED, eventTime));
}
@SuppressWarnings("deprecation")
@Override
public void onPlaybackParametersChanged(
EventTime eventTime, PlaybackParameters playbackParameters) {
reportedEvents.add(new ReportedEvent(EVENT_PLAYBACK_PARAMETERS_CHANGED, eventTime));
public void onPlaybackSpeedChanged(EventTime eventTime, float playbackSpeed) {
reportedEvents.add(new ReportedEvent(EVENT_PLAYBACK_SPEED_CHANGED, eventTime));
}
@Override

View File

@ -622,9 +622,7 @@ public abstract class Action {
super(
tag,
"SetPlaybackParameters:"
+ (playbackParameters == null
? "null"
: playbackParameters.speed + ":" + playbackParameters.skipSilence));
+ (playbackParameters == null ? "null" : playbackParameters.speed));
this.playbackParameters = playbackParameters;
}

View File

@ -256,16 +256,32 @@ public abstract class StubExoPlayer extends BasePlayer implements ExoPlayer {
throw new UnsupportedOperationException();
}
/** @deprecated Use {@link #setPlaybackSpeed(float)} instead. */
@SuppressWarnings("deprecation")
@Deprecated
@Override
public void setPlaybackParameters(@Nullable PlaybackParameters playbackParameters) {
throw new UnsupportedOperationException();
}
/** @deprecated Use {@link #getPlaybackSpeed()} instead. */
@SuppressWarnings("deprecation")
@Deprecated
@Override
public PlaybackParameters getPlaybackParameters() {
throw new UnsupportedOperationException();
}
@Override
public void setPlaybackSpeed(float playbackSpeed) {
throw new UnsupportedOperationException();
}
@Override
public float getPlaybackSpeed() {
throw new UnsupportedOperationException();
}
@Override
public void setSeekParameters(@Nullable SeekParameters seekParameters) {
throw new UnsupportedOperationException();