From 35d7dad047ce5f5f277be33ddec528b4b72c1455 Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 25 May 2016 05:41:29 -0700 Subject: [PATCH] Clean up SimpleExoPlayer. - Simplify setSurface by always blocking when the surface is being cleared. - Add analogous setVolume API. - Support setting of playback params for extension audio decoders. We can probably use this to add a setPlaybackRate API to SimpleExoPlayer for API level 23 and above only, but we'd probably want to make sure it works properly when there's no audio track too, so some thought will be required. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=123204581 --- .../exoplayer/demo/PlayerActivity.java | 2 +- .../java/com/google/android/exoplayer/C.java | 18 +++++++- .../MediaCodecAudioTrackRenderer.java | 20 +-------- .../android/exoplayer/SimpleExoPlayer.java | 41 ++++++++++--------- .../extensions/AudioDecoderTrackRenderer.java | 23 +++++------ 5 files changed, 52 insertions(+), 52 deletions(-) diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java b/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java index 9fc0dbce4f..ebe460b91e 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java @@ -553,7 +553,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, @Override public void surfaceDestroyed(SurfaceHolder holder) { if (player != null) { - player.blockingClearSurface(); + player.setSurface(null); } } diff --git a/library/src/main/java/com/google/android/exoplayer/C.java b/library/src/main/java/com/google/android/exoplayer/C.java index ac6d7aae83..ab0562935f 100644 --- a/library/src/main/java/com/google/android/exoplayer/C.java +++ b/library/src/main/java/com/google/android/exoplayer/C.java @@ -230,10 +230,26 @@ public interface C { UUID PLAYREADY_UUID = new UUID(0x9A04F07998404286L, 0xAB92E65BE0885F95L); /** - * The type of a message that can be passed to an video {@link TrackRenderer} via + * The type of a message that can be passed to a video {@link TrackRenderer} via * {@link ExoPlayer#sendMessage} or {@link ExoPlayer#blockingSendMessage}. The message object * should be the target {@link Surface}, or null. */ int MSG_SET_SURFACE = 1; + /** + * The type of a message that can be passed to an audio {@link TrackRenderer} via + * {@link ExoPlayer#sendMessage} or {@link ExoPlayer#blockingSendMessage}. The message object + * should be a {@link Float} with 0 being silence and 1 being unity gain. + */ + int MSG_SET_VOLUME = 1; + + /** + * The type of a message that can be passed to an audio {@link TrackRenderer} via + * {@link ExoPlayer#sendMessage} or {@link ExoPlayer#blockingSendMessage}. The message object + * should be a {@link android.media.PlaybackParams}, which will be used to configure the + * underlying {@link android.media.AudioTrack}. The message object should not be modified by the + * caller after it has been passed + */ + int MSG_SET_PLAYBACK_PARAMS = 2; + } diff --git a/library/src/main/java/com/google/android/exoplayer/MediaCodecAudioTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/MediaCodecAudioTrackRenderer.java index 224cb9546a..5e236510e1 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaCodecAudioTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaCodecAudioTrackRenderer.java @@ -41,22 +41,6 @@ import java.nio.ByteBuffer; @TargetApi(16) public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer implements MediaClock { - /** - * The type of a message that can be passed to an instance of this class via - * {@link ExoPlayer#sendMessage} or {@link ExoPlayer#blockingSendMessage}. The message object - * should be a {@link Float} with 0 being silence and 1 being unity gain. - */ - public static final int MSG_SET_VOLUME = 1; - - /** - * The type of a message that can be passed to an instance of this class via - * {@link ExoPlayer#sendMessage} or {@link ExoPlayer#blockingSendMessage}. The message object - * should be a {@link android.media.PlaybackParams}, which will be used to configure the - * underlying {@link android.media.AudioTrack}. The message object should not be modified by the - * caller after it has been passed - */ - public static final int MSG_SET_PLAYBACK_PARAMS = 2; - private final EventDispatcher eventDispatcher; private final AudioTrack audioTrack; @@ -411,10 +395,10 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer implem @Override public void handleMessage(int messageType, Object message) throws ExoPlaybackException { switch (messageType) { - case MSG_SET_VOLUME: + case C.MSG_SET_VOLUME: audioTrack.setVolume((Float) message); break; - case MSG_SET_PLAYBACK_PARAMS: + case C.MSG_SET_PLAYBACK_PARAMS: audioTrack.setPlaybackParams((PlaybackParams) message); break; default: diff --git a/library/src/main/java/com/google/android/exoplayer/SimpleExoPlayer.java b/library/src/main/java/com/google/android/exoplayer/SimpleExoPlayer.java index ec7424c4d2..e09e2fd282 100644 --- a/library/src/main/java/com/google/android/exoplayer/SimpleExoPlayer.java +++ b/library/src/main/java/com/google/android/exoplayer/SimpleExoPlayer.java @@ -27,6 +27,7 @@ import com.google.android.exoplayer.text.TextTrackRenderer; import com.google.android.exoplayer.upstream.BandwidthMeter; import com.google.android.exoplayer.upstream.DefaultBandwidthMeter; +import android.annotation.TargetApi; import android.content.Context; import android.media.AudioManager; import android.media.MediaCodec; @@ -43,6 +44,7 @@ import java.util.List; *

* Instances of this class can be obtained from {@link ExoPlayerFactory}. */ +@TargetApi(16) public final class SimpleExoPlayer implements ExoPlayer { /** @@ -88,7 +90,6 @@ public final class SimpleExoPlayer implements ExoPlayer { private final ComponentListener componentListener; private final Handler mainHandler; - private Surface surface; private Format videoFormat; private Format audioFormat; @@ -144,16 +145,29 @@ public final class SimpleExoPlayer implements ExoPlayer { * @param surface The {@link Surface}. */ public void setSurface(Surface surface) { - this.surface = surface; - pushSurface(false); + for (TrackRenderer renderer : renderers) { + if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { + if (surface == null) { + // Block to ensure that the surface is not accessed after the method returns. + player.blockingSendMessage(renderer, C.MSG_SET_SURFACE, null); + } else { + player.sendMessage(renderer, C.MSG_SET_SURFACE, surface); + } + } + } } /** - * Clears the {@link Surface} onto which video will be rendered. + * Sets the audio volume, with 0 being silence and 1 being unity gain. + * + * @param volume The volume. */ - public void blockingClearSurface() { - surface = null; - pushSurface(true); + public void setVolume(float volume) { + for (TrackRenderer renderer : renderers) { + if (renderer.getTrackType() == C.TRACK_TYPE_AUDIO) { + player.sendMessage(renderer, C.MSG_SET_VOLUME, volume); + } + } } /** @@ -278,7 +292,6 @@ public final class SimpleExoPlayer implements ExoPlayer { @Override public void release() { - surface = null; player.release(); } @@ -314,18 +327,6 @@ public final class SimpleExoPlayer implements ExoPlayer { // Internal methods. - private void pushSurface(boolean blockForSurfacePush) { - for (TrackRenderer renderer : renderers) { - if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { - if (blockForSurfacePush) { - player.blockingSendMessage(renderer, C.MSG_SET_SURFACE, surface); - } else { - player.sendMessage(renderer, C.MSG_SET_SURFACE, surface); - } - } - } - } - private void buildRenderers(Context context, DrmSessionManager drmSessionManager, ArrayList renderersList) { MediaCodecVideoTrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer(context, diff --git a/library/src/main/java/com/google/android/exoplayer/extensions/AudioDecoderTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/extensions/AudioDecoderTrackRenderer.java index 6c3b8dbd54..17bfda2a52 100644 --- a/library/src/main/java/com/google/android/exoplayer/extensions/AudioDecoderTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/extensions/AudioDecoderTrackRenderer.java @@ -21,7 +21,6 @@ import com.google.android.exoplayer.C; import com.google.android.exoplayer.CodecCounters; import com.google.android.exoplayer.DecoderInputBuffer; import com.google.android.exoplayer.ExoPlaybackException; -import com.google.android.exoplayer.ExoPlayer; import com.google.android.exoplayer.Format; import com.google.android.exoplayer.FormatHolder; import com.google.android.exoplayer.MediaClock; @@ -30,6 +29,7 @@ import com.google.android.exoplayer.TrackStream; import com.google.android.exoplayer.audio.AudioTrack; import com.google.android.exoplayer.util.MimeTypes; +import android.media.PlaybackParams; import android.os.Handler; import android.os.SystemClock; @@ -38,13 +38,6 @@ import android.os.SystemClock; */ public abstract class AudioDecoderTrackRenderer extends TrackRenderer implements MediaClock { - /** - * The type of a message that can be passed to an instance of this class via - * {@link ExoPlayer#sendMessage} or {@link ExoPlayer#blockingSendMessage}. The message object - * should be a {@link Float} with 0 being silence and 1 being unity gain. - */ - public static final int MSG_SET_VOLUME = 1; - public final CodecCounters codecCounters = new CodecCounters(); private final EventDispatcher eventDispatcher; @@ -355,10 +348,16 @@ public abstract class AudioDecoderTrackRenderer extends TrackRenderer implements @Override public void handleMessage(int messageType, Object message) throws ExoPlaybackException { - if (messageType == MSG_SET_VOLUME) { - audioTrack.setVolume((Float) message); - } else { - super.handleMessage(messageType, message); + switch (messageType) { + case C.MSG_SET_VOLUME: + audioTrack.setVolume((Float) message); + break; + case C.MSG_SET_PLAYBACK_PARAMS: + audioTrack.setPlaybackParams((PlaybackParams) message); + break; + default: + super.handleMessage(messageType, message); + break; } }