Commit 6dcfe57f by andrewlewis Committed by Oliver Woodman

Add SilenceSkippingAudioProcessor

This uses a simple threshold-based algorithm for classifying audio frames as
silent, and removes silences from input audio that last longer than a given
duration.

The plan is to expose this functionality via PlaybackParameters in a later
change.

Issue: #2635

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=190737027
parent 18df028c
...@@ -138,6 +138,7 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -138,6 +138,7 @@ public final class DefaultAudioSink implements AudioSink {
private final boolean enableConvertHighResIntPcmToFloat; private final boolean enableConvertHighResIntPcmToFloat;
private final ChannelMappingAudioProcessor channelMappingAudioProcessor; private final ChannelMappingAudioProcessor channelMappingAudioProcessor;
private final TrimmingAudioProcessor trimmingAudioProcessor; private final TrimmingAudioProcessor trimmingAudioProcessor;
private final SilenceSkippingAudioProcessor silenceSkippingAudioProcessor;
private final SonicAudioProcessor sonicAudioProcessor; private final SonicAudioProcessor sonicAudioProcessor;
private final AudioProcessor[] toIntPcmAvailableAudioProcessors; private final AudioProcessor[] toIntPcmAvailableAudioProcessors;
private final AudioProcessor[] toFloatPcmAvailableAudioProcessors; private final AudioProcessor[] toFloatPcmAvailableAudioProcessors;
...@@ -226,14 +227,16 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -226,14 +227,16 @@ public final class DefaultAudioSink implements AudioSink {
audioTrackPositionTracker = new AudioTrackPositionTracker(new PositionTrackerListener()); audioTrackPositionTracker = new AudioTrackPositionTracker(new PositionTrackerListener());
channelMappingAudioProcessor = new ChannelMappingAudioProcessor(); channelMappingAudioProcessor = new ChannelMappingAudioProcessor();
trimmingAudioProcessor = new TrimmingAudioProcessor(); trimmingAudioProcessor = new TrimmingAudioProcessor();
silenceSkippingAudioProcessor = new SilenceSkippingAudioProcessor();
sonicAudioProcessor = new SonicAudioProcessor(); sonicAudioProcessor = new SonicAudioProcessor();
toIntPcmAvailableAudioProcessors = new AudioProcessor[4 + audioProcessors.length]; toIntPcmAvailableAudioProcessors = new AudioProcessor[5 + audioProcessors.length];
toIntPcmAvailableAudioProcessors[0] = new ResamplingAudioProcessor(); toIntPcmAvailableAudioProcessors[0] = new ResamplingAudioProcessor();
toIntPcmAvailableAudioProcessors[1] = channelMappingAudioProcessor; toIntPcmAvailableAudioProcessors[1] = channelMappingAudioProcessor;
toIntPcmAvailableAudioProcessors[2] = trimmingAudioProcessor; toIntPcmAvailableAudioProcessors[2] = trimmingAudioProcessor;
System.arraycopy( System.arraycopy(
audioProcessors, 0, toIntPcmAvailableAudioProcessors, 3, audioProcessors.length); audioProcessors, 0, toIntPcmAvailableAudioProcessors, 3, audioProcessors.length);
toIntPcmAvailableAudioProcessors[3 + audioProcessors.length] = sonicAudioProcessor; toIntPcmAvailableAudioProcessors[3 + audioProcessors.length] = silenceSkippingAudioProcessor;
toIntPcmAvailableAudioProcessors[4 + audioProcessors.length] = sonicAudioProcessor;
toFloatPcmAvailableAudioProcessors = new AudioProcessor[] {new FloatResamplingAudioProcessor()}; toFloatPcmAvailableAudioProcessors = new AudioProcessor[] {new FloatResamplingAudioProcessor()};
volume = 1.0f; volume = 1.0f;
startMediaTimeState = START_NOT_SET; startMediaTimeState = START_NOT_SET;
...@@ -272,7 +275,7 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -272,7 +275,7 @@ public final class DefaultAudioSink implements AudioSink {
} }
long positionUs = audioTrackPositionTracker.getCurrentPositionUs(sourceEnded); long positionUs = audioTrackPositionTracker.getCurrentPositionUs(sourceEnded);
positionUs = Math.min(positionUs, framesToDurationUs(getWrittenFrames())); positionUs = Math.min(positionUs, framesToDurationUs(getWrittenFrames()));
return startMediaTimeUs + applySpeedup(positionUs); return startMediaTimeUs + applySkipping(applySpeedup(positionUs));
} }
@Override @Override
...@@ -938,6 +941,10 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -938,6 +941,10 @@ public final class DefaultAudioSink implements AudioSink {
positionUs - playbackParametersPositionUs, playbackParameters.speed); positionUs - playbackParametersPositionUs, playbackParameters.speed);
} }
private long applySkipping(long positionUs) {
return positionUs + framesToDurationUs(silenceSkippingAudioProcessor.getSkippedFrames());
}
private boolean isInitialized() { private boolean isInitialized() {
return audioTrack != null; return audioTrack != null;
} }
......
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