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