Skip to content

Commit 74c493f

Browse files
andrewlewisojw28
authored andcommitted
Add back support for setting audio pitch
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
1 parent 8b3422b commit 74c493f

35 files changed

Lines changed: 466 additions & 448 deletions

File tree

‎extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java‎

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -458,32 +458,16 @@ public void seekTo(int windowIndex, long positionMs) {
458458
flushNotifications();
459459
}
460460

461-
/** @deprecated Use {@link #setPlaybackSpeed(float)} instead. */
462-
@SuppressWarnings("deprecation")
463-
@Deprecated
464461
@Override
465462
public void setPlaybackParameters(@Nullable PlaybackParameters playbackParameters) {
466463
// Unsupported by the RemoteMediaClient API. Do nothing.
467464
}
468465

469-
/** @deprecated Use {@link #getPlaybackSpeed()} instead. */
470-
@SuppressWarnings("deprecation")
471-
@Deprecated
472466
@Override
473467
public PlaybackParameters getPlaybackParameters() {
474468
return PlaybackParameters.DEFAULT;
475469
}
476470

477-
@Override
478-
public void setPlaybackSpeed(float playbackSpeed) {
479-
// Unsupported by the RemoteMediaClient API. Do nothing.
480-
}
481-
482-
@Override
483-
public float getPlaybackSpeed() {
484-
return Player.DEFAULT_PLAYBACK_SPEED;
485-
}
486-
487471
@Override
488472
public void stop(boolean reset) {
489473
playbackState = STATE_IDLE;

‎extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.google.android.exoplayer2.ControlDispatcher;
2727
import com.google.android.exoplayer2.ExoPlaybackException;
2828
import com.google.android.exoplayer2.MediaItem;
29+
import com.google.android.exoplayer2.PlaybackParameters;
2930
import com.google.android.exoplayer2.Player;
3031
import com.google.android.exoplayer2.Timeline;
3132
import com.google.android.exoplayer2.audio.AudioAttributes;
@@ -383,11 +384,11 @@ public AudioAttributesCompat getAudioAttributes() {
383384
}
384385

385386
public void setPlaybackSpeed(float playbackSpeed) {
386-
player.setPlaybackSpeed(playbackSpeed);
387+
player.setPlaybackParameters(new PlaybackParameters(playbackSpeed));
387388
}
388389

389390
public float getPlaybackSpeed() {
390-
return player.getPlaybackSpeed();
391+
return player.getPlaybackParameters().speed;
391392
}
392393

393394
public void reset() {
@@ -483,8 +484,8 @@ private void handleShuffleMode(boolean shuffleModeEnabled) {
483484
listener.onShuffleModeChanged(Utils.getShuffleMode(shuffleModeEnabled));
484485
}
485486

486-
private void handlePlaybackSpeedChanged(float playbackSpeed) {
487-
listener.onPlaybackSpeedChanged(playbackSpeed);
487+
private void handlePlaybackParametersChanged(PlaybackParameters playbackParameters) {
488+
listener.onPlaybackSpeedChanged(playbackParameters.speed);
488489
}
489490

490491
private void handleTimelineChanged(Timeline timeline) {
@@ -627,8 +628,8 @@ public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {
627628
}
628629

629630
@Override
630-
public void onPlaybackSpeedChanged(float playbackSpeed) {
631-
handlePlaybackSpeedChanged(playbackSpeed);
631+
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
632+
handlePlaybackParametersChanged(playbackParameters);
632633
}
633634

634635
@Override

‎extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.google.android.exoplayer2.DefaultControlDispatcher;
3939
import com.google.android.exoplayer2.ExoPlaybackException;
4040
import com.google.android.exoplayer2.ExoPlayerLibraryInfo;
41+
import com.google.android.exoplayer2.PlaybackParameters;
4142
import com.google.android.exoplayer2.Player;
4243
import com.google.android.exoplayer2.Timeline;
4344
import com.google.android.exoplayer2.util.Assertions;
@@ -127,8 +128,8 @@ public final class MediaSessionConnector {
127128
@PlaybackActions public static final long DEFAULT_PLAYBACK_ACTIONS = ALL_PLAYBACK_ACTIONS;
128129

129130
/**
130-
* The name of the {@link PlaybackStateCompat} float extra with the value of {@link
131-
* Player#getPlaybackSpeed()}.
131+
* The name of the {@link PlaybackStateCompat} float extra with the value of {@code
132+
* Player.getPlaybackParameters().speed}.
132133
*/
133134
public static final String EXTRAS_SPEED = "EXO_SPEED";
134135

@@ -765,7 +766,7 @@ public final void invalidateMediaSessionPlaybackState() {
765766
queueNavigator != null
766767
? queueNavigator.getActiveQueueItemId(player)
767768
: MediaSessionCompat.QueueItem.UNKNOWN_ID;
768-
float playbackSpeed = player.getPlaybackSpeed();
769+
float playbackSpeed = player.getPlaybackParameters().speed;
769770
extras.putFloat(EXTRAS_SPEED, playbackSpeed);
770771
float sessionPlaybackSpeed = player.isPlaying() ? playbackSpeed : 0f;
771772
builder
@@ -1134,7 +1135,7 @@ public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) {
11341135
}
11351136

11361137
@Override
1137-
public void onPlaybackSpeedChanged(float playbackSpeed) {
1138+
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
11381139
invalidateMediaSessionPlaybackState();
11391140
}
11401141

‎library/core/src/main/java/com/google/android/exoplayer2/DefaultMediaClock.java‎

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,34 +27,34 @@
2727
*/
2828
/* package */ final class DefaultMediaClock implements MediaClock {
2929

30-
/** Listener interface to be notified of changes to the active playback speed. */
31-
public interface PlaybackSpeedListener {
30+
/** Listener interface to be notified of changes to the active playback parameters. */
31+
public interface PlaybackParametersListener {
3232

3333
/**
34-
* Called when the active playback speed changed. Will not be called for {@link
35-
* #setPlaybackSpeed(float)}.
34+
* Called when the active playback parameters changed. Will not be called for {@link
35+
* #setPlaybackParameters(PlaybackParameters)}.
3636
*
37-
* @param newPlaybackSpeed The newly active playback speed.
37+
* @param newPlaybackParameters The newly active playback parameters.
3838
*/
39-
void onPlaybackSpeedChanged(float newPlaybackSpeed);
39+
void onPlaybackParametersChanged(PlaybackParameters newPlaybackParameters);
4040
}
4141

4242
private final StandaloneMediaClock standaloneClock;
43-
private final PlaybackSpeedListener listener;
43+
private final PlaybackParametersListener listener;
4444

4545
@Nullable private Renderer rendererClockSource;
4646
@Nullable private MediaClock rendererClock;
4747
private boolean isUsingStandaloneClock;
4848
private boolean standaloneClockIsStarted;
4949

5050
/**
51-
* Creates a new instance with listener for playback speed changes and a {@link Clock} to use for
52-
* the standalone clock implementation.
51+
* Creates a new instance with a listener for playback parameters changes and a {@link Clock} to
52+
* use for the standalone clock implementation.
5353
*
54-
* @param listener A {@link PlaybackSpeedListener} to listen for playback speed changes.
54+
* @param listener A {@link PlaybackParametersListener} to listen for playback parameters changes.
5555
* @param clock A {@link Clock}.
5656
*/
57-
public DefaultMediaClock(PlaybackSpeedListener listener, Clock clock) {
57+
public DefaultMediaClock(PlaybackParametersListener listener, Clock clock) {
5858
this.listener = listener;
5959
this.standaloneClock = new StandaloneMediaClock(clock);
6060
isUsingStandaloneClock = true;
@@ -102,7 +102,7 @@ public void onRendererEnabled(Renderer renderer) throws ExoPlaybackException {
102102
}
103103
this.rendererClock = rendererMediaClock;
104104
this.rendererClockSource = renderer;
105-
rendererClock.setPlaybackSpeed(standaloneClock.getPlaybackSpeed());
105+
rendererClock.setPlaybackParameters(standaloneClock.getPlaybackParameters());
106106
}
107107
}
108108

@@ -140,19 +140,19 @@ public long getPositionUs() {
140140
}
141141

142142
@Override
143-
public void setPlaybackSpeed(float playbackSpeed) {
143+
public void setPlaybackParameters(PlaybackParameters playbackParameters) {
144144
if (rendererClock != null) {
145-
rendererClock.setPlaybackSpeed(playbackSpeed);
146-
playbackSpeed = rendererClock.getPlaybackSpeed();
145+
rendererClock.setPlaybackParameters(playbackParameters);
146+
playbackParameters = rendererClock.getPlaybackParameters();
147147
}
148-
standaloneClock.setPlaybackSpeed(playbackSpeed);
148+
standaloneClock.setPlaybackParameters(playbackParameters);
149149
}
150150

151151
@Override
152-
public float getPlaybackSpeed() {
152+
public PlaybackParameters getPlaybackParameters() {
153153
return rendererClock != null
154-
? rendererClock.getPlaybackSpeed()
155-
: standaloneClock.getPlaybackSpeed();
154+
? rendererClock.getPlaybackParameters()
155+
: standaloneClock.getPlaybackParameters();
156156
}
157157

158158
private void syncClocks(boolean isReadingAhead) {
@@ -180,10 +180,10 @@ private void syncClocks(boolean isReadingAhead) {
180180
}
181181
// Continuously sync stand-alone clock to renderer clock so that it can take over if needed.
182182
standaloneClock.resetPosition(rendererClockPositionUs);
183-
float playbackSpeed = rendererClock.getPlaybackSpeed();
184-
if (playbackSpeed != standaloneClock.getPlaybackSpeed()) {
185-
standaloneClock.setPlaybackSpeed(playbackSpeed);
186-
listener.onPlaybackSpeedChanged(playbackSpeed);
183+
PlaybackParameters playbackParameters = rendererClock.getPlaybackParameters();
184+
if (!playbackParameters.equals(standaloneClock.getPlaybackParameters())) {
185+
standaloneClock.setPlaybackParameters(playbackParameters);
186+
listener.onPlaybackParametersChanged(playbackParameters);
187187
}
188188
}
189189

‎library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java‎

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -619,32 +619,17 @@ public void seekTo(int windowIndex, long positionMs) {
619619
/* seekProcessed= */ true);
620620
}
621621

622-
/** @deprecated Use {@link #setPlaybackSpeed(float)} instead. */
623-
@SuppressWarnings("deprecation")
624-
@Deprecated
625622
@Override
626623
public void setPlaybackParameters(@Nullable PlaybackParameters playbackParameters) {
627-
setPlaybackSpeed(
628-
playbackParameters != null ? playbackParameters.speed : Player.DEFAULT_PLAYBACK_SPEED);
629-
}
630-
631-
/** @deprecated Use {@link #getPlaybackSpeed()} instead. */
632-
@SuppressWarnings("deprecation")
633-
@Deprecated
634-
@Override
635-
public PlaybackParameters getPlaybackParameters() {
636-
return new PlaybackParameters(playbackInfo.playbackSpeed);
637-
}
638-
639-
@Override
640-
public void setPlaybackSpeed(float playbackSpeed) {
641-
checkState(playbackSpeed > 0);
642-
if (playbackInfo.playbackSpeed == playbackSpeed) {
624+
if (playbackParameters == null) {
625+
playbackParameters = PlaybackParameters.DEFAULT;
626+
}
627+
if (playbackInfo.playbackParameters.equals(playbackParameters)) {
643628
return;
644629
}
645-
PlaybackInfo newPlaybackInfo = playbackInfo.copyWithPlaybackSpeed(playbackSpeed);
630+
PlaybackInfo newPlaybackInfo = playbackInfo.copyWithPlaybackParameters(playbackParameters);
646631
pendingOperationAcks++;
647-
internalPlayer.setPlaybackSpeed(playbackSpeed);
632+
internalPlayer.setPlaybackParameters(playbackParameters);
648633
updatePlaybackInfo(
649634
newPlaybackInfo,
650635
/* positionDiscontinuity= */ false,
@@ -655,8 +640,8 @@ public void setPlaybackSpeed(float playbackSpeed) {
655640
}
656641

657642
@Override
658-
public float getPlaybackSpeed() {
659-
return playbackInfo.playbackSpeed;
643+
public PlaybackParameters getPlaybackParameters() {
644+
return playbackInfo.playbackParameters;
660645
}
661646

662647
@Override
@@ -1366,7 +1351,7 @@ private static final class PlaybackInfoUpdate implements Runnable {
13661351
private final boolean playWhenReadyChanged;
13671352
private final boolean playbackSuppressionReasonChanged;
13681353
private final boolean isPlayingChanged;
1369-
private final boolean playbackSpeedChanged;
1354+
private final boolean playbackParametersChanged;
13701355
private final boolean offloadSchedulingEnabledChanged;
13711356

13721357
public PlaybackInfoUpdate(
@@ -1405,7 +1390,8 @@ public PlaybackInfoUpdate(
14051390
playbackSuppressionReasonChanged =
14061391
previousPlaybackInfo.playbackSuppressionReason != playbackInfo.playbackSuppressionReason;
14071392
isPlayingChanged = isPlaying(previousPlaybackInfo) != isPlaying(playbackInfo);
1408-
playbackSpeedChanged = previousPlaybackInfo.playbackSpeed != playbackInfo.playbackSpeed;
1393+
playbackParametersChanged =
1394+
!previousPlaybackInfo.playbackParameters.equals(playbackInfo.playbackParameters);
14091395
offloadSchedulingEnabledChanged =
14101396
previousPlaybackInfo.offloadSchedulingEnabled != playbackInfo.offloadSchedulingEnabled;
14111397
}
@@ -1473,13 +1459,11 @@ public void run() {
14731459
invokeAll(
14741460
listenerSnapshot, listener -> listener.onIsPlayingChanged(isPlaying(playbackInfo)));
14751461
}
1476-
if (playbackSpeedChanged) {
1477-
PlaybackParameters playbackParameters = new PlaybackParameters(playbackInfo.playbackSpeed);
1462+
if (playbackParametersChanged) {
14781463
invokeAll(
14791464
listenerSnapshot,
14801465
listener -> {
1481-
listener.onPlaybackSpeedChanged(playbackInfo.playbackSpeed);
1482-
listener.onPlaybackParametersChanged(playbackParameters);
1466+
listener.onPlaybackParametersChanged(playbackInfo.playbackParameters);
14831467
});
14841468
}
14851469
if (seekProcessed) {

0 commit comments

Comments
 (0)