Commit 841c5477 by tianyifeng Committed by microkatz

Add `release` method to Renderer and AudioSink

* Add `release` method to Renderer and AudioSink interfaces.
* Call the `release` method for renderers when the ExoPlayer is going to be released.

PiperOrigin-RevId: 517135677
parent 0e3f407e
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
([#10847](https://github.com/google/ExoPlayer/issues/10847)). ([#10847](https://github.com/google/ExoPlayer/issues/10847)).
* Encapsulate Opus frames in Ogg packets in direct playbacks (offload). * Encapsulate Opus frames in Ogg packets in direct playbacks (offload).
* Extrapolate current position during sleep with offload scheduling. * Extrapolate current position during sleep with offload scheduling.
* Add `Renderer.release()` and `AudioSink.release()` for releasing the
resources at the end of player's lifecycle.
* DRM: * DRM:
* Reduce the visibility of several internal-only methods on * Reduce the visibility of several internal-only methods on
`DefaultDrmSession` that aren't expected to be called from outside the `DefaultDrmSession` that aren't expected to be called from outside the
......
...@@ -197,6 +197,12 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { ...@@ -197,6 +197,12 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
onReset(); onReset();
} }
@Override
public final void release() {
Assertions.checkState(state == STATE_DISABLED);
onRelease();
}
// RendererCapabilities implementation. // RendererCapabilities implementation.
@Override @Override
...@@ -303,6 +309,15 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { ...@@ -303,6 +309,15 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
// Do nothing. // Do nothing.
} }
/**
* Called when the renderer is released.
*
* <p>The default implementation is a no-op.
*/
protected void onRelease() {
// Do nothing.
}
// Methods to be called by subclasses. // Methods to be called by subclasses.
/** /**
......
...@@ -1410,6 +1410,7 @@ import java.util.concurrent.atomic.AtomicBoolean; ...@@ -1410,6 +1410,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
/* resetPosition= */ false, /* resetPosition= */ false,
/* releaseMediaSourceList= */ true, /* releaseMediaSourceList= */ true,
/* resetError= */ false); /* resetError= */ false);
releaseRenderers();
loadControl.onReleased(); loadControl.onReleased();
setState(Player.STATE_IDLE); setState(Player.STATE_IDLE);
if (internalPlaybackThread != null) { if (internalPlaybackThread != null) {
...@@ -2546,6 +2547,12 @@ import java.util.concurrent.atomic.AtomicBoolean; ...@@ -2546,6 +2547,12 @@ import java.util.concurrent.atomic.AtomicBoolean;
} }
} }
private void releaseRenderers() {
for (Renderer renderer : renderers) {
renderer.release();
}
}
private void handleLoadingMediaPeriodChanged(boolean loadingTrackSelectionChanged) { private void handleLoadingMediaPeriodChanged(boolean loadingTrackSelectionChanged) {
MediaPeriodHolder loadingMediaPeriodHolder = queue.getLoadingPeriod(); MediaPeriodHolder loadingMediaPeriodHolder = queue.getLoadingPeriod();
MediaPeriodId loadingMediaPeriodId = MediaPeriodId loadingMediaPeriodId =
......
...@@ -520,4 +520,11 @@ public interface Renderer extends PlayerMessage.Target { ...@@ -520,4 +520,11 @@ public interface Renderer extends PlayerMessage.Target {
* #STATE_DISABLED}. * #STATE_DISABLED}.
*/ */
void reset(); void reset();
/**
* Releases the renderer.
*
* <p>The renderer must not be used after calling this method.
*/
default void release() {}
} }
...@@ -485,4 +485,7 @@ public interface AudioSink { ...@@ -485,4 +485,7 @@ public interface AudioSink {
/** Resets the sink, releasing any resources that it currently holds. */ /** Resets the sink, releasing any resources that it currently holds. */
void reset(); void reset();
/** Releases the audio sink. */
default void release() {}
} }
...@@ -628,6 +628,11 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media ...@@ -628,6 +628,11 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
} }
@Override @Override
protected void onRelease() {
audioSink.release();
}
@Override
public boolean isEnded() { public boolean isEnded() {
return super.isEnded() && audioSink.isEnded(); return super.isEnded() && audioSink.isEnded();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment