diff --git a/libraries/common/src/main/java/androidx/media3/common/Player.java b/libraries/common/src/main/java/androidx/media3/common/Player.java index 7487910ebb..d37e70869f 100644 --- a/libraries/common/src/main/java/androidx/media3/common/Player.java +++ b/libraries/common/src/main/java/androidx/media3/common/Player.java @@ -714,7 +714,12 @@ public interface Player { */ default void onMediaMetadataChanged(MediaMetadata mediaMetadata) {} - /** Called when the playlist {@link MediaMetadata} changes. */ + /** + * Called when the playlist {@link MediaMetadata} changes. + * + *

{@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + */ default void onPlaylistMetadataChanged(MediaMetadata mediaMetadata) {} /** @@ -932,6 +937,9 @@ public interface Player { /** * Called when the audio session ID changes. * + *

{@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + * * @param audioSessionId The audio session ID. */ @UnstableApi @@ -940,6 +948,9 @@ public interface Player { /** * Called when the audio attributes change. * + *

{@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + * * @param audioAttributes The audio attributes. */ default void onAudioAttributesChanged(AudioAttributes audioAttributes) {} @@ -947,6 +958,9 @@ public interface Player { /** * Called when the volume changes. * + *

{@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + * * @param volume The new volume, with 0 being silence and 1 being unity gain. */ default void onVolumeChanged(float volume) {} @@ -954,19 +968,40 @@ public interface Player { /** * Called when skipping silences is enabled or disabled in the audio stream. * + *

{@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + * * @param skipSilenceEnabled Whether skipping silences in the audio stream is enabled. */ default void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {} - /** Called when the device information changes. */ + /** + * Called when the device information changes + * + *

{@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + * + * @param deviceInfo The new {@link DeviceInfo}. + */ default void onDeviceInfoChanged(DeviceInfo deviceInfo) {} - /** Called when the device volume or mute state changes. */ + /** + * Called when the device volume or mute state changes. + * + *

{@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + * + * @param volume The new device volume, with 0 being silence and 1 being unity gain. + * @param muted Whether the device is muted. + */ default void onDeviceVolumeChanged(int volume, boolean muted) {} /** * Called each time there's a change in the size of the video being rendered. * + *

{@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + * * @param videoSize The new size of the video. */ default void onVideoSizeChanged(VideoSize videoSize) {} @@ -975,6 +1010,9 @@ public interface Player { * Called each time there's a change in the size of the surface onto which the video is being * rendered. * + *

{@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + * * @param width The surface width in pixels. May be {@link C#LENGTH_UNSET} if unknown, or 0 if * the video is not rendered onto a surface. * @param height The surface height in pixels. May be {@link C#LENGTH_UNSET} if unknown, or 0 if @@ -985,6 +1023,9 @@ public interface Player { /** * Called when a frame is rendered for the first time since setting the surface, or since the * renderer was reset, or since the stream being rendered was changed. + * + *

{@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. */ default void onRenderedFirstFrame() {} @@ -994,6 +1035,9 @@ public interface Player { *

{@code cues} is in ascending order of priority. If any of the cue boxes overlap when * displayed, the {@link Cue} nearer the end of the list should be shown on top. * + *

{@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + * * @param cues The {@link Cue Cues}. May be empty. */ default void onCues(List cues) {} @@ -1001,6 +1045,9 @@ public interface Player { /** * Called when there is metadata associated with the current playback time. * + *

{@link #onEvents(Player, Events)} will also be called to report this event along with + * other events that happen in the same {@link Looper} message queue iteration. + * * @param metadata The metadata. */ @UnstableApi @@ -1252,6 +1299,17 @@ public interface Player { EVENT_SEEK_FORWARD_INCREMENT_CHANGED, EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED, EVENT_TRACK_SELECTION_PARAMETERS_CHANGED, + EVENT_AUDIO_ATTRIBUTES_CHANGED, + EVENT_AUDIO_SESSION_ID, + EVENT_VOLUME_CHANGED, + EVENT_SKIP_SILENCE_ENABLED_CHANGED, + EVENT_SURFACE_SIZE_CHANGED, + EVENT_VIDEO_SIZE_CHANGED, + EVENT_RENDERED_FIRST_FRAME, + EVENT_CUES, + EVENT_METADATA, + EVENT_DEVICE_INFO_CHANGED, + EVENT_DEVICE_VOLUME_CHANGED }) @interface Event {} /** {@link #getCurrentTimeline()} changed. */ @@ -1297,6 +1355,31 @@ public interface Player { int EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED = 18; /** {@link #getTrackSelectionParameters()} changed. */ int EVENT_TRACK_SELECTION_PARAMETERS_CHANGED = 19; + /** {@link #getAudioAttributes()} changed. */ + int EVENT_AUDIO_ATTRIBUTES_CHANGED = 20; + /** The audio session id was set. */ + int EVENT_AUDIO_SESSION_ID = 21; + /** {@link #getVolume()} changed. */ + int EVENT_VOLUME_CHANGED = 22; + /** Skipping silences in the audio stream is enabled or disabled. */ + int EVENT_SKIP_SILENCE_ENABLED_CHANGED = 23; + /** The size of the surface onto which the video is being rendered changed. */ + int EVENT_SURFACE_SIZE_CHANGED = 24; + /** {@link #getVideoSize()} changed. */ + int EVENT_VIDEO_SIZE_CHANGED = 25; + /** + * A frame is rendered for the first time since setting the surface, or since the renderer was + * reset, or since the stream being rendered was changed. + */ + int EVENT_RENDERED_FIRST_FRAME = 26; + /** {@link #getCurrentCues()} changed. */ + int EVENT_CUES = 27; + /** Metadata associated with the current playback time changed. */ + int EVENT_METADATA = 28; + /** {@link #getDeviceInfo()} changed. */ + int EVENT_DEVICE_INFO_CHANGED = 29; + /** {@link #getDeviceVolume()} changed. */ + int EVENT_DEVICE_VOLUME_CHANGED = 30; /** * Commands that can be executed on a {@code Player}. One of {@link #COMMAND_PLAY_PAUSE}, {@link diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java index bbaa2d85cc..b3343eec90 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java @@ -45,9 +45,20 @@ import static androidx.media3.common.Player.DISCONTINUITY_REASON_AUTO_TRANSITION import static androidx.media3.common.Player.DISCONTINUITY_REASON_INTERNAL; import static androidx.media3.common.Player.DISCONTINUITY_REASON_REMOVE; import static androidx.media3.common.Player.DISCONTINUITY_REASON_SEEK; +import static androidx.media3.common.Player.EVENT_AUDIO_ATTRIBUTES_CHANGED; +import static androidx.media3.common.Player.EVENT_AUDIO_SESSION_ID; +import static androidx.media3.common.Player.EVENT_CUES; +import static androidx.media3.common.Player.EVENT_DEVICE_INFO_CHANGED; +import static androidx.media3.common.Player.EVENT_DEVICE_VOLUME_CHANGED; import static androidx.media3.common.Player.EVENT_MEDIA_METADATA_CHANGED; +import static androidx.media3.common.Player.EVENT_METADATA; import static androidx.media3.common.Player.EVENT_PLAYLIST_METADATA_CHANGED; +import static androidx.media3.common.Player.EVENT_RENDERED_FIRST_FRAME; +import static androidx.media3.common.Player.EVENT_SKIP_SILENCE_ENABLED_CHANGED; +import static androidx.media3.common.Player.EVENT_SURFACE_SIZE_CHANGED; import static androidx.media3.common.Player.EVENT_TRACK_SELECTION_PARAMETERS_CHANGED; +import static androidx.media3.common.Player.EVENT_VIDEO_SIZE_CHANGED; +import static androidx.media3.common.Player.EVENT_VOLUME_CHANGED; import static androidx.media3.common.Player.MEDIA_ITEM_TRANSITION_REASON_AUTO; import static androidx.media3.common.Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED; import static androidx.media3.common.Player.MEDIA_ITEM_TRANSITION_REASON_REPEAT; @@ -191,8 +202,6 @@ import java.util.concurrent.TimeoutException; private final ExoPlayerImplInternal internalPlayer; private final ListenerSet listeners; - // TODO(b/187152483): Remove this once all events are dispatched via ListenerSet. - private final CopyOnWriteArraySet listenerArraySet; private final CopyOnWriteArraySet audioOffloadListeners; private final Timeline.Period period; private final Timeline.Window window; @@ -320,7 +329,6 @@ import java.util.concurrent.TimeoutException; applicationLooper, clock, (listener, flags) -> listener.onEvents(wrappingPlayer, new Events(flags))); - listenerArraySet = new CopyOnWriteArraySet<>(); audioOffloadListeners = new CopyOnWriteArraySet<>(); mediaSourceHolderSnapshots = new ArrayList<>(); shuffleOrder = new ShuffleOrder.DefaultShuffleOrder(/* length= */ 0); @@ -1346,27 +1354,28 @@ import java.util.concurrent.TimeoutException; } } - public void setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus) { + public void setAudioAttributes(AudioAttributes newAudioAttributes, boolean handleAudioFocus) { verifyApplicationThread(); if (playerReleased) { return; } - if (!Util.areEqual(this.audioAttributes, audioAttributes)) { - this.audioAttributes = audioAttributes; - sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_AUDIO_ATTRIBUTES, audioAttributes); - streamVolumeManager.setStreamType(Util.getStreamTypeForAudioUsage(audioAttributes.usage)); - // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener listener : listenerArraySet) { - listener.onAudioAttributesChanged(audioAttributes); - } + if (!Util.areEqual(this.audioAttributes, newAudioAttributes)) { + this.audioAttributes = newAudioAttributes; + sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_AUDIO_ATTRIBUTES, newAudioAttributes); + streamVolumeManager.setStreamType(Util.getStreamTypeForAudioUsage(newAudioAttributes.usage)); + // Queue event only and flush after updating playWhenReady in case both events are triggered. + listeners.queueEvent( + EVENT_AUDIO_ATTRIBUTES_CHANGED, + listener -> listener.onAudioAttributesChanged(newAudioAttributes)); } - audioFocusManager.setAudioAttributes(handleAudioFocus ? audioAttributes : null); + audioFocusManager.setAudioAttributes(handleAudioFocus ? newAudioAttributes : null); boolean playWhenReady = getPlayWhenReady(); @AudioFocusManager.PlayerCommand int playerCommand = audioFocusManager.updateAudioFocus(playWhenReady, getPlaybackState()); updatePlayWhenReady( playWhenReady, playerCommand, getPlayWhenReadyChangeReason(playWhenReady, playerCommand)); + listeners.flushEvents(); } public AudioAttributes getAudioAttributes() { @@ -1392,10 +1401,9 @@ import java.util.concurrent.TimeoutException; this.audioSessionId = audioSessionId; sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); sendRendererMessage(TRACK_TYPE_VIDEO, MSG_SET_AUDIO_SESSION_ID, audioSessionId); - // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener listener : listenerArraySet) { - listener.onAudioSessionIdChanged(audioSessionId); - } + int finalAudioSessionId = audioSessionId; + listeners.sendEvent( + EVENT_AUDIO_SESSION_ID, listener -> listener.onAudioSessionIdChanged(finalAudioSessionId)); } public int getAudioSessionId() { @@ -1419,10 +1427,8 @@ import java.util.concurrent.TimeoutException; } this.volume = volume; sendVolumeToRenderers(); - // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener listener : listenerArraySet) { - listener.onVolumeChanged(volume); - } + float finalVolume = volume; + listeners.sendEvent(EVENT_VOLUME_CHANGED, listener -> listener.onVolumeChanged(finalVolume)); } public float getVolume() { @@ -1433,14 +1439,16 @@ import java.util.concurrent.TimeoutException; return skipSilenceEnabled; } - public void setSkipSilenceEnabled(boolean skipSilenceEnabled) { + public void setSkipSilenceEnabled(boolean newSkipSilenceEnabled) { verifyApplicationThread(); - if (this.skipSilenceEnabled == skipSilenceEnabled) { + if (skipSilenceEnabled == newSkipSilenceEnabled) { return; } - this.skipSilenceEnabled = skipSilenceEnabled; - sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_SKIP_SILENCE_ENABLED, skipSilenceEnabled); - notifySkipSilenceEnabledChanged(); + skipSilenceEnabled = newSkipSilenceEnabled; + sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_SKIP_SILENCE_ENABLED, newSkipSilenceEnabled); + listeners.sendEvent( + EVENT_SKIP_SILENCE_ENABLED_CHANGED, + listener -> listener.onSkipSilenceEnabledChanged(newSkipSilenceEnabled)); } public AnalyticsCollector getAnalyticsCollector() { @@ -1552,14 +1560,12 @@ import java.util.concurrent.TimeoutException; // Don't verify application thread. We allow calls to this method from any thread. checkNotNull(listener); listeners.add(listener); - listenerArraySet.add(listener); } public void removeListener(Listener listener) { // Don't verify application thread. We allow calls to this method from any thread. checkNotNull(listener); listeners.remove(listener); - listenerArraySet.remove(listener); } public void setHandleWakeLock(boolean handleWakeLock) { @@ -2445,10 +2451,8 @@ import java.util.concurrent.TimeoutException; if (width != surfaceWidth || height != surfaceHeight) { surfaceWidth = width; surfaceHeight = height; - // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener listener : listenerArraySet) { - listener.onSurfaceSizeChanged(width, height); - } + listeners.sendEvent( + EVENT_SURFACE_SIZE_CHANGED, listener -> listener.onSurfaceSizeChanged(width, height)); } } @@ -2457,13 +2461,6 @@ import java.util.concurrent.TimeoutException; sendRendererMessage(TRACK_TYPE_AUDIO, MSG_SET_VOLUME, scaledVolume); } - private void notifySkipSilenceEnabledChanged() { - // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener listener : listenerArraySet) { - listener.onSkipSilenceEnabledChanged(skipSilenceEnabled); - } - } - private void updatePlayWhenReady( boolean playWhenReady, @AudioFocusManager.PlayerCommand int playerCommand, @@ -2670,22 +2667,17 @@ import java.util.concurrent.TimeoutException; } @Override - public void onVideoSizeChanged(VideoSize videoSize) { - ExoPlayerImpl.this.videoSize = videoSize; - // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener listener : listenerArraySet) { - listener.onVideoSizeChanged(videoSize); - } + public void onVideoSizeChanged(VideoSize newVideoSize) { + videoSize = newVideoSize; + listeners.sendEvent( + EVENT_VIDEO_SIZE_CHANGED, listener -> listener.onVideoSizeChanged(newVideoSize)); } @Override public void onRenderedFirstFrame(Object output, long renderTimeMs) { analyticsCollector.onRenderedFirstFrame(output, renderTimeMs); if (videoOutput == output) { - // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener listener : listenerArraySet) { - listener.onRenderedFirstFrame(); - } + listeners.sendEvent(EVENT_RENDERED_FIRST_FRAME, Listener::onRenderedFirstFrame); } } @@ -2756,12 +2748,14 @@ import java.util.concurrent.TimeoutException; } @Override - public void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) { - if (ExoPlayerImpl.this.skipSilenceEnabled == skipSilenceEnabled) { + public void onSkipSilenceEnabledChanged(boolean newSkipSilenceEnabled) { + if (skipSilenceEnabled == newSkipSilenceEnabled) { return; } - ExoPlayerImpl.this.skipSilenceEnabled = skipSilenceEnabled; - notifySkipSilenceEnabledChanged(); + skipSilenceEnabled = newSkipSilenceEnabled; + listeners.sendEvent( + EVENT_SKIP_SILENCE_ENABLED_CHANGED, + listener -> listener.onSkipSilenceEnabledChanged(newSkipSilenceEnabled)); } @Override @@ -2779,10 +2773,7 @@ import java.util.concurrent.TimeoutException; @Override public void onCues(List cues) { currentCues = cues; - // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener listeners : listenerArraySet) { - listeners.onCues(cues); - } + listeners.sendEvent(EVENT_CUES, listener -> listener.onCues(cues)); } // MetadataOutput implementation @@ -2794,14 +2785,12 @@ import java.util.concurrent.TimeoutException; MediaMetadata newMediaMetadata = buildUpdatedMediaMetadata(); if (!newMediaMetadata.equals(mediaMetadata)) { mediaMetadata = newMediaMetadata; - listeners.sendEvent( + listeners.queueEvent( EVENT_MEDIA_METADATA_CHANGED, listener -> listener.onMediaMetadataChanged(mediaMetadata)); } - // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener listener : listenerArraySet) { - listener.onMetadata(metadata); - } + listeners.queueEvent(EVENT_METADATA, listener -> listener.onMetadata(metadata)); + listeners.flushEvents(); } // SurfaceHolder.Callback implementation @@ -2891,22 +2880,19 @@ import java.util.concurrent.TimeoutException; @Override public void onStreamTypeChanged(@C.StreamType int streamType) { - DeviceInfo deviceInfo = createDeviceInfo(streamVolumeManager); - if (!deviceInfo.equals(ExoPlayerImpl.this.deviceInfo)) { - ExoPlayerImpl.this.deviceInfo = deviceInfo; - // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener listener : listenerArraySet) { - listener.onDeviceInfoChanged(deviceInfo); - } + DeviceInfo newDeviceInfo = createDeviceInfo(streamVolumeManager); + if (!newDeviceInfo.equals(deviceInfo)) { + deviceInfo = newDeviceInfo; + listeners.sendEvent( + EVENT_DEVICE_INFO_CHANGED, listener -> listener.onDeviceInfoChanged(newDeviceInfo)); } } @Override public void onStreamVolumeChanged(int streamVolume, boolean streamMuted) { - // TODO(internal b/187152483): Events should be dispatched via ListenerSet - for (Listener listener : listenerArraySet) { - listener.onDeviceVolumeChanged(streamVolume, streamMuted); - } + listeners.sendEvent( + EVENT_DEVICE_VOLUME_CHANGED, + listener -> listener.onDeviceVolumeChanged(streamVolume, streamMuted)); } // Player.AudioOffloadListener implementation. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java index 54b631389e..30fa02b6e3 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java @@ -272,6 +272,28 @@ public interface AnalyticsListener { /** {@link Player#getMaxSeekToPreviousPosition()} changed. */ int EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED = Player.EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED; + /** Audio attributes changed. */ + int EVENT_AUDIO_ATTRIBUTES_CHANGED = Player.EVENT_AUDIO_ATTRIBUTES_CHANGED; + /** An audio session id was set. */ + int EVENT_AUDIO_SESSION_ID = Player.EVENT_AUDIO_SESSION_ID; + /** The volume changed. */ + int EVENT_VOLUME_CHANGED = Player.EVENT_VOLUME_CHANGED; + /** Skipping silences was enabled or disabled in the audio stream. */ + int EVENT_SKIP_SILENCE_ENABLED_CHANGED = Player.EVENT_SKIP_SILENCE_ENABLED_CHANGED; + /** The surface size changed. */ + int EVENT_SURFACE_SIZE_CHANGED = Player.EVENT_SURFACE_SIZE_CHANGED; + /** The video size changed. */ + int EVENT_VIDEO_SIZE_CHANGED = Player.EVENT_VIDEO_SIZE_CHANGED; + /** + * The first frame has been rendered since setting the surface, since the renderer was reset or + * since the stream changed. + */ + int EVENT_RENDERED_FIRST_FRAME = Player.EVENT_RENDERED_FIRST_FRAME; + /** Metadata associated with the current playback time was reported. */ + int EVENT_METADATA = Player.EVENT_METADATA; + + // TODO: Forward EVENT_CUES, EVENT_DEVICE_INFO_CHANGED and EVENT_DEVICE_VOLUME_CHANGED. + /** A source started loading data. */ int EVENT_LOAD_STARTED = 1000; // Intentional gap to leave space for new Player events /** A source started completed loading data. */ @@ -286,73 +308,54 @@ public interface AnalyticsListener { int EVENT_UPSTREAM_DISCARDED = 1005; /** The bandwidth estimate has been updated. */ int EVENT_BANDWIDTH_ESTIMATE = 1006; - /** Metadata associated with the current playback time was reported. */ - int EVENT_METADATA = 1007; /** An audio renderer was enabled. */ - int EVENT_AUDIO_ENABLED = 1008; + int EVENT_AUDIO_ENABLED = 1007; /** An audio renderer created a decoder. */ - int EVENT_AUDIO_DECODER_INITIALIZED = 1009; + int EVENT_AUDIO_DECODER_INITIALIZED = 1008; /** The format consumed by an audio renderer changed. */ - int EVENT_AUDIO_INPUT_FORMAT_CHANGED = 1010; + int EVENT_AUDIO_INPUT_FORMAT_CHANGED = 1009; /** The audio position has increased for the first time since the last pause or position reset. */ - int EVENT_AUDIO_POSITION_ADVANCING = 1011; + int EVENT_AUDIO_POSITION_ADVANCING = 1010; /** An audio underrun occurred. */ - int EVENT_AUDIO_UNDERRUN = 1012; + int EVENT_AUDIO_UNDERRUN = 1011; /** An audio renderer released a decoder. */ - int EVENT_AUDIO_DECODER_RELEASED = 1013; + int EVENT_AUDIO_DECODER_RELEASED = 1012; /** An audio renderer was disabled. */ - int EVENT_AUDIO_DISABLED = 1014; - /** An audio session id was set. */ - int EVENT_AUDIO_SESSION_ID = 1015; - /** Audio attributes changed. */ - int EVENT_AUDIO_ATTRIBUTES_CHANGED = 1016; - /** Skipping silences was enabled or disabled in the audio stream. */ - int EVENT_SKIP_SILENCE_ENABLED_CHANGED = 1017; + int EVENT_AUDIO_DISABLED = 1013; /** The audio sink encountered a non-fatal error. */ - int EVENT_AUDIO_SINK_ERROR = 1018; - /** The volume changed. */ - int EVENT_VOLUME_CHANGED = 1019; + int EVENT_AUDIO_SINK_ERROR = 1014; /** A video renderer was enabled. */ - int EVENT_VIDEO_ENABLED = 1020; + int EVENT_VIDEO_ENABLED = 1015; /** A video renderer created a decoder. */ - int EVENT_VIDEO_DECODER_INITIALIZED = 1021; + int EVENT_VIDEO_DECODER_INITIALIZED = 1016; /** The format consumed by a video renderer changed. */ - int EVENT_VIDEO_INPUT_FORMAT_CHANGED = 1022; + int EVENT_VIDEO_INPUT_FORMAT_CHANGED = 1017; /** Video frames have been dropped. */ - int EVENT_DROPPED_VIDEO_FRAMES = 1023; + int EVENT_DROPPED_VIDEO_FRAMES = 1018; /** A video renderer released a decoder. */ - int EVENT_VIDEO_DECODER_RELEASED = 1024; + int EVENT_VIDEO_DECODER_RELEASED = 1019; /** A video renderer was disabled. */ - int EVENT_VIDEO_DISABLED = 1025; + int EVENT_VIDEO_DISABLED = 1020; /** Video frame processing offset data has been reported. */ - int EVENT_VIDEO_FRAME_PROCESSING_OFFSET = 1026; - /** - * The first frame has been rendered since setting the surface, since the renderer was reset or - * since the stream changed. - */ - int EVENT_RENDERED_FIRST_FRAME = 1027; - /** The video size changed. */ - int EVENT_VIDEO_SIZE_CHANGED = 1028; - /** The surface size changed. */ - int EVENT_SURFACE_SIZE_CHANGED = 1029; + int EVENT_VIDEO_FRAME_PROCESSING_OFFSET = 1021; /** A DRM session has been acquired. */ - int EVENT_DRM_SESSION_ACQUIRED = 1030; + int EVENT_DRM_SESSION_ACQUIRED = 1022; /** DRM keys were loaded. */ - int EVENT_DRM_KEYS_LOADED = 1031; + int EVENT_DRM_KEYS_LOADED = 1023; /** A non-fatal DRM session manager error occurred. */ - int EVENT_DRM_SESSION_MANAGER_ERROR = 1032; + int EVENT_DRM_SESSION_MANAGER_ERROR = 1024; /** DRM keys were restored. */ - int EVENT_DRM_KEYS_RESTORED = 1033; + int EVENT_DRM_KEYS_RESTORED = 1025; /** DRM keys were removed. */ - int EVENT_DRM_KEYS_REMOVED = 1034; + int EVENT_DRM_KEYS_REMOVED = 1026; /** A DRM session has been released. */ - int EVENT_DRM_SESSION_RELEASED = 1035; + int EVENT_DRM_SESSION_RELEASED = 1027; /** The player was released. */ - int EVENT_PLAYER_RELEASED = 1036; + int EVENT_PLAYER_RELEASED = 1028; /** The audio codec encountered an error. */ - int EVENT_AUDIO_CODEC_ERROR = 1037; + int EVENT_AUDIO_CODEC_ERROR = 1029; /** The video codec encountered an error. */ - int EVENT_VIDEO_CODEC_ERROR = 1038; + int EVENT_VIDEO_CODEC_ERROR = 1030; /** Time information of an event. */ final class EventTime {