mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
code review changes and fix for discontinuity
This commit is contained in:
parent
821ea0e58b
commit
aaf469ce06
2 changed files with 38 additions and 25 deletions
|
|
@ -168,8 +168,8 @@ public final class DefaultAudioSink implements AudioSink {
|
||||||
private final ChannelMappingAudioProcessor channelMappingAudioProcessor;
|
private final ChannelMappingAudioProcessor channelMappingAudioProcessor;
|
||||||
private final TrimmingAudioProcessor trimmingAudioProcessor;
|
private final TrimmingAudioProcessor trimmingAudioProcessor;
|
||||||
private final SonicAudioProcessor sonicAudioProcessor;
|
private final SonicAudioProcessor sonicAudioProcessor;
|
||||||
private final AudioProcessor[] availableAudioProcessors;
|
private final AudioProcessor[] toIntPcmAvailableAudioProcessors;
|
||||||
private final AudioProcessor[] hiResAvailableAudioProcessors;
|
private final AudioProcessor[] toFloatPcmAvailableAudioProcessors;
|
||||||
private final ConditionVariable releasingConditionVariable;
|
private final ConditionVariable releasingConditionVariable;
|
||||||
private final long[] playheadOffsets;
|
private final long[] playheadOffsets;
|
||||||
private final AudioTrackUtil audioTrackUtil;
|
private final AudioTrackUtil audioTrackUtil;
|
||||||
|
|
@ -189,6 +189,7 @@ public final class DefaultAudioSink implements AudioSink {
|
||||||
private @C.Encoding int outputEncoding;
|
private @C.Encoding int outputEncoding;
|
||||||
private AudioAttributes audioAttributes;
|
private AudioAttributes audioAttributes;
|
||||||
private boolean processingEnabled;
|
private boolean processingEnabled;
|
||||||
|
private boolean canApplyPlaybackParams;
|
||||||
private int bufferSize;
|
private int bufferSize;
|
||||||
private long bufferSizeUs;
|
private long bufferSizeUs;
|
||||||
|
|
||||||
|
|
@ -280,14 +281,14 @@ public final class DefaultAudioSink implements AudioSink {
|
||||||
channelMappingAudioProcessor = new ChannelMappingAudioProcessor();
|
channelMappingAudioProcessor = new ChannelMappingAudioProcessor();
|
||||||
trimmingAudioProcessor = new TrimmingAudioProcessor();
|
trimmingAudioProcessor = new TrimmingAudioProcessor();
|
||||||
sonicAudioProcessor = new SonicAudioProcessor();
|
sonicAudioProcessor = new SonicAudioProcessor();
|
||||||
availableAudioProcessors = new AudioProcessor[4 + audioProcessors.length];
|
toIntPcmAvailableAudioProcessors = new AudioProcessor[4 + audioProcessors.length];
|
||||||
availableAudioProcessors[0] = new ResamplingAudioProcessor();
|
toIntPcmAvailableAudioProcessors[0] = new ResamplingAudioProcessor();
|
||||||
availableAudioProcessors[1] = channelMappingAudioProcessor;
|
toIntPcmAvailableAudioProcessors[1] = channelMappingAudioProcessor;
|
||||||
availableAudioProcessors[2] = trimmingAudioProcessor;
|
toIntPcmAvailableAudioProcessors[2] = trimmingAudioProcessor;
|
||||||
System.arraycopy(audioProcessors, 0, availableAudioProcessors, 3, audioProcessors.length);
|
System.arraycopy(audioProcessors, 0, toIntPcmAvailableAudioProcessors, 3, audioProcessors.length);
|
||||||
availableAudioProcessors[3 + audioProcessors.length] = sonicAudioProcessor;
|
toIntPcmAvailableAudioProcessors[3 + audioProcessors.length] = sonicAudioProcessor;
|
||||||
hiResAvailableAudioProcessors = new AudioProcessor[1];
|
toFloatPcmAvailableAudioProcessors = new AudioProcessor[1];
|
||||||
hiResAvailableAudioProcessors[0] = new FloatResamplingAudioProcessor();
|
toFloatPcmAvailableAudioProcessors[0] = new FloatResamplingAudioProcessor();
|
||||||
playheadOffsets = new long[MAX_PLAYHEAD_OFFSET_COUNT];
|
playheadOffsets = new long[MAX_PLAYHEAD_OFFSET_COUNT];
|
||||||
volume = 1.0f;
|
volume = 1.0f;
|
||||||
startMediaTimeState = START_NOT_SET;
|
startMediaTimeState = START_NOT_SET;
|
||||||
|
|
@ -368,17 +369,17 @@ public final class DefaultAudioSink implements AudioSink {
|
||||||
shouldUpResPCMAudio = canConvertHiResPcmToFloat &&
|
shouldUpResPCMAudio = canConvertHiResPcmToFloat &&
|
||||||
(inputEncoding == C.ENCODING_PCM_24BIT || inputEncoding == C.ENCODING_PCM_32BIT);
|
(inputEncoding == C.ENCODING_PCM_24BIT || inputEncoding == C.ENCODING_PCM_32BIT);
|
||||||
if (isInputPcm) {
|
if (isInputPcm) {
|
||||||
pcmFrameSize = Util.getPcmFrameSize(shouldUpResPCMAudio
|
pcmFrameSize = Util.getPcmFrameSize(inputEncoding, channelCount);
|
||||||
? C.ENCODING_PCM_FLOAT : inputEncoding, channelCount);
|
|
||||||
}
|
}
|
||||||
@C.Encoding int encoding = inputEncoding;
|
@C.Encoding int encoding = inputEncoding;
|
||||||
boolean processingEnabled = isInputPcm && inputEncoding != C.ENCODING_PCM_FLOAT;
|
boolean processingEnabled = isInputPcm && inputEncoding != C.ENCODING_PCM_FLOAT;
|
||||||
|
canApplyPlaybackParams = processingEnabled && !shouldUpResPCMAudio;
|
||||||
if (processingEnabled) {
|
if (processingEnabled) {
|
||||||
AudioProcessor[] activeAudioProcessors = shouldUpResPCMAudio ?
|
AudioProcessor[] availableAudioProcessors = shouldUpResPCMAudio ?
|
||||||
hiResAvailableAudioProcessors : availableAudioProcessors;
|
toFloatPcmAvailableAudioProcessors : toIntPcmAvailableAudioProcessors;
|
||||||
trimmingAudioProcessor.setTrimSampleCount(trimStartSamples, trimEndSamples);
|
trimmingAudioProcessor.setTrimSampleCount(trimStartSamples, trimEndSamples);
|
||||||
channelMappingAudioProcessor.setChannelMap(outputChannels);
|
channelMappingAudioProcessor.setChannelMap(outputChannels);
|
||||||
for (AudioProcessor audioProcessor : activeAudioProcessors) {
|
for (AudioProcessor audioProcessor : availableAudioProcessors) {
|
||||||
try {
|
try {
|
||||||
flush |= audioProcessor.configure(sampleRate, channelCount, encoding);
|
flush |= audioProcessor.configure(sampleRate, channelCount, encoding);
|
||||||
} catch (AudioProcessor.UnhandledFormatException e) {
|
} catch (AudioProcessor.UnhandledFormatException e) {
|
||||||
|
|
@ -488,9 +489,9 @@ public final class DefaultAudioSink implements AudioSink {
|
||||||
|
|
||||||
private void resetAudioProcessors() {
|
private void resetAudioProcessors() {
|
||||||
ArrayList<AudioProcessor> newAudioProcessors = new ArrayList<>();
|
ArrayList<AudioProcessor> newAudioProcessors = new ArrayList<>();
|
||||||
AudioProcessor[] activeAudioProcessors = shouldUpResPCMAudio ?
|
AudioProcessor[] availableAudioProcessors = shouldUpResPCMAudio ?
|
||||||
hiResAvailableAudioProcessors : availableAudioProcessors;
|
toFloatPcmAvailableAudioProcessors : toIntPcmAvailableAudioProcessors;
|
||||||
for (AudioProcessor audioProcessor : activeAudioProcessors) {
|
for (AudioProcessor audioProcessor : availableAudioProcessors) {
|
||||||
if (audioProcessor.isActive()) {
|
if (audioProcessor.isActive()) {
|
||||||
newAudioProcessors.add(audioProcessor);
|
newAudioProcessors.add(audioProcessor);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -838,7 +839,7 @@ public final class DefaultAudioSink implements AudioSink {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlaybackParameters setPlaybackParameters(PlaybackParameters playbackParameters) {
|
public PlaybackParameters setPlaybackParameters(PlaybackParameters playbackParameters) {
|
||||||
if (isInitialized() && !processingEnabled) {
|
if (isInitialized() && !canApplyPlaybackParams) {
|
||||||
// The playback parameters are always the default if processing is disabled.
|
// The playback parameters are always the default if processing is disabled.
|
||||||
this.playbackParameters = PlaybackParameters.DEFAULT;
|
this.playbackParameters = PlaybackParameters.DEFAULT;
|
||||||
return this.playbackParameters;
|
return this.playbackParameters;
|
||||||
|
|
@ -994,10 +995,10 @@ public final class DefaultAudioSink implements AudioSink {
|
||||||
public void release() {
|
public void release() {
|
||||||
reset();
|
reset();
|
||||||
releaseKeepSessionIdAudioTrack();
|
releaseKeepSessionIdAudioTrack();
|
||||||
for (AudioProcessor audioProcessor : availableAudioProcessors) {
|
for (AudioProcessor audioProcessor : toIntPcmAvailableAudioProcessors) {
|
||||||
audioProcessor.reset();
|
audioProcessor.reset();
|
||||||
}
|
}
|
||||||
for (AudioProcessor audioProcessor : hiResAvailableAudioProcessors) {
|
for (AudioProcessor audioProcessor : toFloatPcmAvailableAudioProcessors) {
|
||||||
audioProcessor.reset();
|
audioProcessor.reset();
|
||||||
}
|
}
|
||||||
audioSessionId = C.AUDIO_SESSION_ID_UNSET;
|
audioSessionId = C.AUDIO_SESSION_ID_UNSET;
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,18 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
package com.google.android.exoplayer2.audio;
|
package com.google.android.exoplayer2.audio;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -173,10 +188,7 @@ import java.nio.ByteOrder;
|
||||||
int bits = Float.floatToIntBits(convVal);
|
int bits = Float.floatToIntBits(convVal);
|
||||||
if (bits == 0x7fc00000)
|
if (bits == 0x7fc00000)
|
||||||
bits = Float.floatToIntBits((float) 0.0);
|
bits = Float.floatToIntBits((float) 0.0);
|
||||||
buffer.put((byte) (bits & 0xff));
|
buffer.putInt(bits);
|
||||||
buffer.put((byte) ((bits >> 8) & 0xff));
|
|
||||||
buffer.put((byte) ((bits >> 16) & 0xff));
|
|
||||||
buffer.put((byte) ((bits >> 24) & 0xff));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Loading…
Reference in a new issue