Skip to content

Commit

Permalink
Add back support for setting audio pitch
Browse files Browse the repository at this point in the history
To play slow motion streams where the audio has been recorded at
slower speeds, it is necessary to be able to resample (rather than
time-stretch) the audio. This change undeprecates back the previously
deprecated PlaybackParameters class to allow apps to set pitch.

PiperOrigin-RevId: 328703116
  • Loading branch information
andrewlewis authored and ojw28 committed Aug 27, 2020
1 parent 8b3422b commit 74c493f
Show file tree
Hide file tree
Showing 35 changed files with 466 additions and 448 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -458,32 +458,16 @@ public void seekTo(int windowIndex, long positionMs) {
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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import com.google.android.exoplayer2.ControlDispatcher;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.audio.AudioAttributes;
Expand Down Expand Up @@ -383,11 +384,11 @@ public AudioAttributesCompat getAudioAttributes() {
}

public void setPlaybackSpeed(float playbackSpeed) {
player.setPlaybackSpeed(playbackSpeed);
player.setPlaybackParameters(new PlaybackParameters(playbackSpeed));
}

public float getPlaybackSpeed() {
return player.getPlaybackSpeed();
return player.getPlaybackParameters().speed;
}

public void reset() {
Expand Down Expand Up @@ -483,8 +484,8 @@ private void handleShuffleMode(boolean shuffleModeEnabled) {
listener.onShuffleModeChanged(Utils.getShuffleMode(shuffleModeEnabled));
}

private void handlePlaybackSpeedChanged(float playbackSpeed) {
listener.onPlaybackSpeedChanged(playbackSpeed);
private void handlePlaybackParametersChanged(PlaybackParameters playbackParameters) {
listener.onPlaybackSpeedChanged(playbackParameters.speed);
}

private void handleTimelineChanged(Timeline timeline) {
Expand Down Expand Up @@ -627,8 +628,8 @@ public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {
}

@Override
public void onPlaybackSpeedChanged(float playbackSpeed) {
handlePlaybackSpeedChanged(playbackSpeed);
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
handlePlaybackParametersChanged(playbackParameters);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import com.google.android.exoplayer2.DefaultControlDispatcher;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayerLibraryInfo;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.util.Assertions;
Expand Down Expand Up @@ -127,8 +128,8 @@ public final class MediaSessionConnector {
@PlaybackActions public static final long DEFAULT_PLAYBACK_ACTIONS = ALL_PLAYBACK_ACTIONS;

/**
* The name of the {@link PlaybackStateCompat} float extra with the value of {@link
* Player#getPlaybackSpeed()}.
* The name of the {@link PlaybackStateCompat} float extra with the value of {@code
* Player.getPlaybackParameters().speed}.
*/
public static final String EXTRAS_SPEED = "EXO_SPEED";

Expand Down Expand Up @@ -765,7 +766,7 @@ public final void invalidateMediaSessionPlaybackState() {
queueNavigator != null
? queueNavigator.getActiveQueueItemId(player)
: MediaSessionCompat.QueueItem.UNKNOWN_ID;
float playbackSpeed = player.getPlaybackSpeed();
float playbackSpeed = player.getPlaybackParameters().speed;
extras.putFloat(EXTRAS_SPEED, playbackSpeed);
float sessionPlaybackSpeed = player.isPlaying() ? playbackSpeed : 0f;
builder
Expand Down Expand Up @@ -1134,7 +1135,7 @@ public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) {
}

@Override
public void onPlaybackSpeedChanged(float playbackSpeed) {
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
invalidateMediaSessionPlaybackState();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,34 +27,34 @@
*/
/* package */ final class DefaultMediaClock implements MediaClock {

/** Listener interface to be notified of changes to the active playback speed. */
public interface PlaybackSpeedListener {
/** Listener interface to be notified of changes to the active playback parameters. */
public interface PlaybackParametersListener {

/**
* Called when the active playback speed changed. Will not be called for {@link
* #setPlaybackSpeed(float)}.
* Called when the active playback parameters changed. Will not be called for {@link
* #setPlaybackParameters(PlaybackParameters)}.
*
* @param newPlaybackSpeed The newly active playback speed.
* @param newPlaybackParameters The newly active playback parameters.
*/
void onPlaybackSpeedChanged(float newPlaybackSpeed);
void onPlaybackParametersChanged(PlaybackParameters newPlaybackParameters);
}

private final StandaloneMediaClock standaloneClock;
private final PlaybackSpeedListener listener;
private final PlaybackParametersListener listener;

@Nullable private Renderer rendererClockSource;
@Nullable private MediaClock rendererClock;
private boolean isUsingStandaloneClock;
private boolean standaloneClockIsStarted;

/**
* Creates a new instance with listener for playback speed changes and a {@link Clock} to use for
* the standalone clock implementation.
* Creates a new instance with a listener for playback parameters changes and a {@link Clock} to
* use for the standalone clock implementation.
*
* @param listener A {@link PlaybackSpeedListener} to listen for playback speed changes.
* @param listener A {@link PlaybackParametersListener} to listen for playback parameters changes.
* @param clock A {@link Clock}.
*/
public DefaultMediaClock(PlaybackSpeedListener listener, Clock clock) {
public DefaultMediaClock(PlaybackParametersListener listener, Clock clock) {
this.listener = listener;
this.standaloneClock = new StandaloneMediaClock(clock);
isUsingStandaloneClock = true;
Expand Down Expand Up @@ -102,7 +102,7 @@ public void onRendererEnabled(Renderer renderer) throws ExoPlaybackException {
}
this.rendererClock = rendererMediaClock;
this.rendererClockSource = renderer;
rendererClock.setPlaybackSpeed(standaloneClock.getPlaybackSpeed());
rendererClock.setPlaybackParameters(standaloneClock.getPlaybackParameters());
}
}

Expand Down Expand Up @@ -140,19 +140,19 @@ public long getPositionUs() {
}

@Override
public void setPlaybackSpeed(float playbackSpeed) {
public void setPlaybackParameters(PlaybackParameters playbackParameters) {
if (rendererClock != null) {
rendererClock.setPlaybackSpeed(playbackSpeed);
playbackSpeed = rendererClock.getPlaybackSpeed();
rendererClock.setPlaybackParameters(playbackParameters);
playbackParameters = rendererClock.getPlaybackParameters();
}
standaloneClock.setPlaybackSpeed(playbackSpeed);
standaloneClock.setPlaybackParameters(playbackParameters);
}

@Override
public float getPlaybackSpeed() {
public PlaybackParameters getPlaybackParameters() {
return rendererClock != null
? rendererClock.getPlaybackSpeed()
: standaloneClock.getPlaybackSpeed();
? rendererClock.getPlaybackParameters()
: standaloneClock.getPlaybackParameters();
}

private void syncClocks(boolean isReadingAhead) {
Expand Down Expand Up @@ -180,10 +180,10 @@ private void syncClocks(boolean isReadingAhead) {
}
// Continuously sync stand-alone clock to renderer clock so that it can take over if needed.
standaloneClock.resetPosition(rendererClockPositionUs);
float playbackSpeed = rendererClock.getPlaybackSpeed();
if (playbackSpeed != standaloneClock.getPlaybackSpeed()) {
standaloneClock.setPlaybackSpeed(playbackSpeed);
listener.onPlaybackSpeedChanged(playbackSpeed);
PlaybackParameters playbackParameters = rendererClock.getPlaybackParameters();
if (!playbackParameters.equals(standaloneClock.getPlaybackParameters())) {
standaloneClock.setPlaybackParameters(playbackParameters);
listener.onPlaybackParametersChanged(playbackParameters);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -619,32 +619,17 @@ public void seekTo(int windowIndex, long positionMs) {
/* seekProcessed= */ true);
}

/** @deprecated Use {@link #setPlaybackSpeed(float)} instead. */
@SuppressWarnings("deprecation")
@Deprecated
@Override
public void setPlaybackParameters(@Nullable PlaybackParameters playbackParameters) {
setPlaybackSpeed(
playbackParameters != null ? playbackParameters.speed : Player.DEFAULT_PLAYBACK_SPEED);
}

/** @deprecated Use {@link #getPlaybackSpeed()} instead. */
@SuppressWarnings("deprecation")
@Deprecated
@Override
public PlaybackParameters getPlaybackParameters() {
return new PlaybackParameters(playbackInfo.playbackSpeed);
}

@Override
public void setPlaybackSpeed(float playbackSpeed) {
checkState(playbackSpeed > 0);
if (playbackInfo.playbackSpeed == playbackSpeed) {
if (playbackParameters == null) {
playbackParameters = PlaybackParameters.DEFAULT;
}
if (playbackInfo.playbackParameters.equals(playbackParameters)) {
return;
}
PlaybackInfo newPlaybackInfo = playbackInfo.copyWithPlaybackSpeed(playbackSpeed);
PlaybackInfo newPlaybackInfo = playbackInfo.copyWithPlaybackParameters(playbackParameters);
pendingOperationAcks++;
internalPlayer.setPlaybackSpeed(playbackSpeed);
internalPlayer.setPlaybackParameters(playbackParameters);
updatePlaybackInfo(
newPlaybackInfo,
/* positionDiscontinuity= */ false,
Expand All @@ -655,8 +640,8 @@ public void setPlaybackSpeed(float playbackSpeed) {
}

@Override
public float getPlaybackSpeed() {
return playbackInfo.playbackSpeed;
public PlaybackParameters getPlaybackParameters() {
return playbackInfo.playbackParameters;
}

@Override
Expand Down Expand Up @@ -1366,7 +1351,7 @@ private static final class PlaybackInfoUpdate implements Runnable {
private final boolean playWhenReadyChanged;
private final boolean playbackSuppressionReasonChanged;
private final boolean isPlayingChanged;
private final boolean playbackSpeedChanged;
private final boolean playbackParametersChanged;
private final boolean offloadSchedulingEnabledChanged;

public PlaybackInfoUpdate(
Expand Down Expand Up @@ -1405,7 +1390,8 @@ public PlaybackInfoUpdate(
playbackSuppressionReasonChanged =
previousPlaybackInfo.playbackSuppressionReason != playbackInfo.playbackSuppressionReason;
isPlayingChanged = isPlaying(previousPlaybackInfo) != isPlaying(playbackInfo);
playbackSpeedChanged = previousPlaybackInfo.playbackSpeed != playbackInfo.playbackSpeed;
playbackParametersChanged =
!previousPlaybackInfo.playbackParameters.equals(playbackInfo.playbackParameters);
offloadSchedulingEnabledChanged =
previousPlaybackInfo.offloadSchedulingEnabled != playbackInfo.offloadSchedulingEnabled;
}
Expand Down Expand Up @@ -1473,13 +1459,11 @@ public void run() {
invokeAll(
listenerSnapshot, listener -> listener.onIsPlayingChanged(isPlaying(playbackInfo)));
}
if (playbackSpeedChanged) {
PlaybackParameters playbackParameters = new PlaybackParameters(playbackInfo.playbackSpeed);
if (playbackParametersChanged) {
invokeAll(
listenerSnapshot,
listener -> {
listener.onPlaybackSpeedChanged(playbackInfo.playbackSpeed);
listener.onPlaybackParametersChanged(playbackParameters);
listener.onPlaybackParametersChanged(playbackInfo.playbackParameters);
});
}
if (seekProcessed) {
Expand Down
Loading

0 comments on commit 74c493f

Please sign in to comment.