Commit d69572eb by bachinger Committed by kim-vde

notify AudioListener about changes of skipSilenceEnabled

This change adds the callback onSkipSilenceEnabledChange to the AudioListener and calls it when changed by the user by calling setPlaybackParameters, or when changed internally by the DefaultAudioSink if the parameters are not applicable. It needs to be plumped through AudioSink, AudioRenderer to SEP which eventually calls the AudioListener.

No changes to the Player interface so far. The getter of skipSilenceEnabled is added to SimpleExoPlayer for completeness, but not yet to the Player interface. The setter is not yet exposed, but implemented as a private method for implementation reasons.

PiperOrigin-RevId: 297590291
parent 7c2889c6
...@@ -334,6 +334,7 @@ public class SimpleExoPlayer extends BasePlayer ...@@ -334,6 +334,7 @@ public class SimpleExoPlayer extends BasePlayer
private int audioSessionId; private int audioSessionId;
private AudioAttributes audioAttributes; private AudioAttributes audioAttributes;
private float audioVolume; private float audioVolume;
private boolean skipSilenceEnabled;
private List<Cue> currentCues; private List<Cue> currentCues;
@Nullable private VideoFrameMetadataListener videoFrameMetadataListener; @Nullable private VideoFrameMetadataListener videoFrameMetadataListener;
@Nullable private CameraMotionListener cameraMotionListener; @Nullable private CameraMotionListener cameraMotionListener;
...@@ -929,6 +930,11 @@ public class SimpleExoPlayer extends BasePlayer ...@@ -929,6 +930,11 @@ public class SimpleExoPlayer extends BasePlayer
} }
} }
/** Returns whether skipping silences in the audio stream is enabled. */
public boolean isSkipSilenceEnabled() {
return skipSilenceEnabled;
}
/** /**
* Sets a listener to receive video events, removing all existing listeners. * Sets a listener to receive video events, removing all existing listeners.
* *
...@@ -1347,6 +1353,7 @@ public class SimpleExoPlayer extends BasePlayer ...@@ -1347,6 +1353,7 @@ public class SimpleExoPlayer extends BasePlayer
@Override @Override
public void setPlaybackParameters(@Nullable PlaybackParameters playbackParameters) { public void setPlaybackParameters(@Nullable PlaybackParameters playbackParameters) {
verifyApplicationThread(); verifyApplicationThread();
setSkipSilenceEnabled(playbackParameters != null && playbackParameters.skipSilence);
player.setPlaybackParameters(playbackParameters); player.setPlaybackParameters(playbackParameters);
} }
...@@ -1659,6 +1666,24 @@ public class SimpleExoPlayer extends BasePlayer ...@@ -1659,6 +1666,24 @@ public class SimpleExoPlayer extends BasePlayer
: PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST; : PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST;
} }
@SuppressWarnings("SuspiciousMethodCalls")
private void setSkipSilenceEnabled(boolean skipSilenceEnabled) {
if (this.skipSilenceEnabled == skipSilenceEnabled) {
return;
}
this.skipSilenceEnabled = skipSilenceEnabled;
for (AudioListener listener : audioListeners) {
// Prevent duplicate notification if a listener is both a AudioRendererEventListener and
// a AudioListener, as they have the same method signature.
if (!audioDebugListeners.contains(listener)) {
listener.onSkipSilenceEnabledChanged(skipSilenceEnabled);
}
}
for (AudioRendererEventListener listener : audioDebugListeners) {
listener.onSkipSilenceEnabledChanged(skipSilenceEnabled);
}
}
private final class ComponentListener private final class ComponentListener
implements VideoRendererEventListener, implements VideoRendererEventListener,
AudioRendererEventListener, AudioRendererEventListener,
...@@ -1814,6 +1839,11 @@ public class SimpleExoPlayer extends BasePlayer ...@@ -1814,6 +1839,11 @@ public class SimpleExoPlayer extends BasePlayer
audioSessionId = C.AUDIO_SESSION_ID_UNSET; audioSessionId = C.AUDIO_SESSION_ID_UNSET;
} }
@Override
public void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {
setSkipSilenceEnabled(skipSilenceEnabled);
}
// TextOutput implementation // TextOutput implementation
@Override @Override
......
...@@ -221,6 +221,14 @@ public class AnalyticsCollector ...@@ -221,6 +221,14 @@ public class AnalyticsCollector
} }
@Override @Override
public void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {
EventTime eventTime = generateReadingMediaPeriodEventTime();
for (AnalyticsListener listener : listeners) {
listener.onSkipSilenceEnabledChanged(eventTime, skipSilenceEnabled);
}
}
@Override
public void onVolumeChanged(float audioVolume) { public void onVolumeChanged(float audioVolume) {
EventTime eventTime = generateReadingMediaPeriodEventTime(); EventTime eventTime = generateReadingMediaPeriodEventTime();
for (AnalyticsListener listener : listeners) { for (AnalyticsListener listener : listeners) {
......
...@@ -451,6 +451,14 @@ public interface AnalyticsListener { ...@@ -451,6 +451,14 @@ public interface AnalyticsListener {
EventTime eventTime, int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs) {} EventTime eventTime, int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs) {}
/** /**
* Called when skipping silences is enabled or disabled in the audio stream.
*
* @param eventTime The event time.
* @param skipSilenceEnabled Whether skipping silences in the audio stream is enabled.
*/
default void onSkipSilenceEnabledChanged(EventTime eventTime, boolean skipSilenceEnabled) {}
/**
* Called after video frames have been dropped. * Called after video frames have been dropped.
* *
* @param eventTime The event time. * @param eventTime The event time.
......
...@@ -38,4 +38,11 @@ public interface AudioListener { ...@@ -38,4 +38,11 @@ public interface AudioListener {
* @param volume The new volume, with 0 being silence and 1 being unity gain. * @param volume The new volume, with 0 being silence and 1 being unity gain.
*/ */
default void onVolumeChanged(float volume) {} default void onVolumeChanged(float volume) {}
/**
* Called when skipping silences is enabled or disabled in the audio stream.
*
* @param skipSilenceEnabled Whether skipping silences in the audio stream is enabled.
*/
default void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {}
} }
...@@ -85,8 +85,13 @@ public interface AudioRendererEventListener { ...@@ -85,8 +85,13 @@ public interface AudioRendererEventListener {
default void onAudioDisabled(DecoderCounters counters) {} default void onAudioDisabled(DecoderCounters counters) {}
/** /**
* Dispatches events to a {@link AudioRendererEventListener}. * Called when skipping silences is enabled or disabled in the audio stream.
*
* @param skipSilenceEnabled Whether skipping silences in the audio stream is enabled.
*/ */
default void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {}
/** Dispatches events to a {@link AudioRendererEventListener}. */
final class EventDispatcher { final class EventDispatcher {
@Nullable private final Handler handler; @Nullable private final Handler handler;
...@@ -170,5 +175,12 @@ public interface AudioRendererEventListener { ...@@ -170,5 +175,12 @@ public interface AudioRendererEventListener {
handler.post(() -> castNonNull(listener).onAudioSessionId(audioSessionId)); handler.post(() -> castNonNull(listener).onAudioSessionId(audioSessionId));
} }
} }
/** Invokes {@link AudioRendererEventListener#onSkipSilenceEnabledChanged(boolean)}. */
public void skipSilenceEnabledChanged(final boolean skipSilenceEnabled) {
if (handler != null) {
handler.post(() -> castNonNull(listener).onSkipSilenceEnabledChanged(skipSilenceEnabled));
}
}
} }
} }
...@@ -84,6 +84,12 @@ public interface AudioSink { ...@@ -84,6 +84,12 @@ public interface AudioSink {
*/ */
void onUnderrun(int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs); void onUnderrun(int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs);
/**
* Called when skipping silences is enabled or disabled.
*
* @param skipSilenceEnabled Whether skipping silences is enabled.
*/
void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled);
} }
/** /**
......
...@@ -884,9 +884,6 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -884,9 +884,6 @@ public final class DefaultAudioSink implements AudioSink {
@Override @Override
public void setPlaybackSpeed(float playbackSpeed) { public void setPlaybackSpeed(float playbackSpeed) {
if (configuration != null && !configuration.canApplyPlaybackParameters) {
playbackSpeed = DEFAULT_PLAYBACK_SPEED;
}
setPlaybackSpeedAndSkipSilence(playbackSpeed, getSkipSilenceEnabled()); setPlaybackSpeedAndSkipSilence(playbackSpeed, getSkipSilenceEnabled());
} }
...@@ -897,9 +894,6 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -897,9 +894,6 @@ public final class DefaultAudioSink implements AudioSink {
@Override @Override
public void setSkipSilenceEnabled(boolean skipSilenceEnabled) { public void setSkipSilenceEnabled(boolean skipSilenceEnabled) {
if (configuration != null && !configuration.canApplyPlaybackParameters) {
skipSilenceEnabled = DEFAULT_SKIP_SILENCE;
}
setPlaybackSpeedAndSkipSilence(getPlaybackSpeed(), skipSilenceEnabled); setPlaybackSpeedAndSkipSilence(getPlaybackSpeed(), skipSilenceEnabled);
} }
...@@ -1080,10 +1074,6 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -1080,10 +1074,6 @@ public final class DefaultAudioSink implements AudioSink {
} }
private void setPlaybackSpeedAndSkipSilence(float playbackSpeed, boolean skipSilence) { private void setPlaybackSpeedAndSkipSilence(float playbackSpeed, boolean skipSilence) {
if (configuration != null && !configuration.canApplyPlaybackParameters) {
playbackSpeed = DEFAULT_PLAYBACK_SPEED;
skipSilence = DEFAULT_SKIP_SILENCE;
}
MediaPositionParameters currentMediaPositionParameters = getMediaPositionParameters(); MediaPositionParameters currentMediaPositionParameters = getMediaPositionParameters();
if (playbackSpeed != currentMediaPositionParameters.playbackSpeed if (playbackSpeed != currentMediaPositionParameters.playbackSpeed
|| skipSilence != currentMediaPositionParameters.skipSilence) { || skipSilence != currentMediaPositionParameters.skipSilence) {
...@@ -1119,17 +1109,20 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -1119,17 +1109,20 @@ public final class DefaultAudioSink implements AudioSink {
configuration.canApplyPlaybackParameters configuration.canApplyPlaybackParameters
? audioProcessorChain.applyPlaybackSpeed(getPlaybackSpeed()) ? audioProcessorChain.applyPlaybackSpeed(getPlaybackSpeed())
: DEFAULT_PLAYBACK_SPEED; : DEFAULT_PLAYBACK_SPEED;
boolean skipSilence = boolean skipSilenceEnabled =
configuration.canApplyPlaybackParameters configuration.canApplyPlaybackParameters
? audioProcessorChain.applySkipSilenceEnabled(getSkipSilenceEnabled()) ? audioProcessorChain.applySkipSilenceEnabled(getSkipSilenceEnabled())
: DEFAULT_SKIP_SILENCE; : DEFAULT_SKIP_SILENCE;
mediaPositionParametersCheckpoints.add( mediaPositionParametersCheckpoints.add(
new MediaPositionParameters( new MediaPositionParameters(
playbackSpeed, playbackSpeed,
skipSilence, skipSilenceEnabled,
/* mediaTimeUs= */ Math.max(0, presentationTimeUs), /* mediaTimeUs= */ Math.max(0, presentationTimeUs),
/* audioTrackPositionUs= */ configuration.framesToDurationUs(getWrittenFrames()))); /* audioTrackPositionUs= */ configuration.framesToDurationUs(getWrittenFrames())));
setupAudioProcessors(); setupAudioProcessors();
if (listener != null) {
listener.onSkipSilenceEnabledChanged(skipSilenceEnabled);
}
} }
/** /**
......
...@@ -469,24 +469,25 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media ...@@ -469,24 +469,25 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
* order to spatialize the audio channels. For this use case, any {@link Virtualizer} instances * order to spatialize the audio channels. For this use case, any {@link Virtualizer} instances
* should be released in {@link #onDisabled()} (if not before). * should be released in {@link #onDisabled()} (if not before).
* *
* @see AudioSink.Listener#onAudioSessionId(int) * <p>See {@link AudioSink.Listener#onAudioSessionId(int)}.
*/ */
protected void onAudioSessionId(int audioSessionId) { protected void onAudioSessionId(int audioSessionId) {
// Do nothing. // Do nothing.
} }
/** /** See {@link AudioSink.Listener#onPositionDiscontinuity()}. */
* @see AudioSink.Listener#onPositionDiscontinuity()
*/
protected void onAudioTrackPositionDiscontinuity() { protected void onAudioTrackPositionDiscontinuity() {
// Do nothing. // Do nothing.
} }
/** /** See {@link AudioSink.Listener#onUnderrun(int, long, long)}. */
* @see AudioSink.Listener#onUnderrun(int, long, long) protected void onAudioTrackUnderrun(
*/ int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs) {
protected void onAudioTrackUnderrun(int bufferSize, long bufferSizeMs, // Do nothing.
long elapsedSinceLastFeedMs) { }
/** See {@link AudioSink.Listener#onSkipSilenceEnabledChanged(boolean)}. */
protected void onAudioTrackSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {
// Do nothing. // Do nothing.
} }
...@@ -843,6 +844,10 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media ...@@ -843,6 +844,10 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
onAudioTrackUnderrun(bufferSize, bufferSizeMs, elapsedSinceLastFeedMs); onAudioTrackUnderrun(bufferSize, bufferSizeMs, elapsedSinceLastFeedMs);
} }
@Override
public void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {
eventDispatcher.skipSilenceEnabledChanged(skipSilenceEnabled);
onAudioTrackSkipSilenceEnabledChanged(skipSilenceEnabled);
}
} }
} }
...@@ -270,24 +270,25 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements ...@@ -270,24 +270,25 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
* order to spatialize the audio channels. For this use case, any {@link Virtualizer} instances * order to spatialize the audio channels. For this use case, any {@link Virtualizer} instances
* should be released in {@link #onDisabled()} (if not before). * should be released in {@link #onDisabled()} (if not before).
* *
* @see AudioSink.Listener#onAudioSessionId(int) * <p>See {@link AudioSink.Listener#onAudioSessionId(int)}.
*/ */
protected void onAudioSessionId(int audioSessionId) { protected void onAudioSessionId(int audioSessionId) {
// Do nothing. // Do nothing.
} }
/** /** See {@link AudioSink.Listener#onPositionDiscontinuity()}. */
* @see AudioSink.Listener#onPositionDiscontinuity()
*/
protected void onAudioTrackPositionDiscontinuity() { protected void onAudioTrackPositionDiscontinuity() {
// Do nothing. // Do nothing.
} }
/** /** See {@link AudioSink.Listener#onUnderrun(int, long, long)}. */
* @see AudioSink.Listener#onUnderrun(int, long, long) protected void onAudioTrackUnderrun(
*/ int bufferSize, long bufferSizeMs, long elapsedSinceLastFeedMs) {
protected void onAudioTrackUnderrun(int bufferSize, long bufferSizeMs, // Do nothing.
long elapsedSinceLastFeedMs) { }
/** See {@link AudioSink.Listener#onSkipSilenceEnabledChanged(boolean)}. */
protected void onAudioTrackSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {
// Do nothing. // Do nothing.
} }
...@@ -693,6 +694,10 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements ...@@ -693,6 +694,10 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
onAudioTrackUnderrun(bufferSize, bufferSizeMs, elapsedSinceLastFeedMs); onAudioTrackUnderrun(bufferSize, bufferSizeMs, elapsedSinceLastFeedMs);
} }
@Override
public void onSkipSilenceEnabledChanged(boolean skipSilenceEnabled) {
eventDispatcher.skipSilenceEnabledChanged(skipSilenceEnabled);
onAudioTrackSkipSilenceEnabledChanged(skipSilenceEnabled);
}
} }
} }
...@@ -320,6 +320,11 @@ public class EventLogger implements AnalyticsListener { ...@@ -320,6 +320,11 @@ public class EventLogger implements AnalyticsListener {
} }
@Override @Override
public void onSkipSilenceEnabledChanged(EventTime eventTime, boolean skipSilenceEnabled) {
logd(eventTime, "skipSilenceEnabled", Boolean.toString(skipSilenceEnabled));
}
@Override
public void onVolumeChanged(EventTime eventTime, float volume) { public void onVolumeChanged(EventTime eventTime, float volume) {
logd(eventTime, "volume", Float.toString(volume)); logd(eventTime, "volume", Float.toString(volume));
} }
......
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