diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java index ee5ca17bc7..892fd428ff 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java @@ -168,8 +168,8 @@ public final class DefaultAudioSink implements AudioSink { private final ChannelMappingAudioProcessor channelMappingAudioProcessor; private final TrimmingAudioProcessor trimmingAudioProcessor; private final SonicAudioProcessor sonicAudioProcessor; - private final AudioProcessor[] availableAudioProcessors; - private final AudioProcessor[] hiResAvailableAudioProcessors; + private final AudioProcessor[] toIntPcmAvailableAudioProcessors; + private final AudioProcessor[] toFloatPcmAvailableAudioProcessors; private final ConditionVariable releasingConditionVariable; private final long[] playheadOffsets; private final AudioTrackUtil audioTrackUtil; @@ -189,6 +189,7 @@ public final class DefaultAudioSink implements AudioSink { private @C.Encoding int outputEncoding; private AudioAttributes audioAttributes; private boolean processingEnabled; + private boolean canApplyPlaybackParams; private int bufferSize; private long bufferSizeUs; @@ -280,14 +281,14 @@ public final class DefaultAudioSink implements AudioSink { channelMappingAudioProcessor = new ChannelMappingAudioProcessor(); trimmingAudioProcessor = new TrimmingAudioProcessor(); sonicAudioProcessor = new SonicAudioProcessor(); - availableAudioProcessors = new AudioProcessor[4 + audioProcessors.length]; - availableAudioProcessors[0] = new ResamplingAudioProcessor(); - availableAudioProcessors[1] = channelMappingAudioProcessor; - availableAudioProcessors[2] = trimmingAudioProcessor; - System.arraycopy(audioProcessors, 0, availableAudioProcessors, 3, audioProcessors.length); - availableAudioProcessors[3 + audioProcessors.length] = sonicAudioProcessor; - hiResAvailableAudioProcessors = new AudioProcessor[1]; - hiResAvailableAudioProcessors[0] = new FloatResamplingAudioProcessor(); + toIntPcmAvailableAudioProcessors = new AudioProcessor[4 + audioProcessors.length]; + toIntPcmAvailableAudioProcessors[0] = new ResamplingAudioProcessor(); + toIntPcmAvailableAudioProcessors[1] = channelMappingAudioProcessor; + toIntPcmAvailableAudioProcessors[2] = trimmingAudioProcessor; + System.arraycopy(audioProcessors, 0, toIntPcmAvailableAudioProcessors, 3, audioProcessors.length); + toIntPcmAvailableAudioProcessors[3 + audioProcessors.length] = sonicAudioProcessor; + toFloatPcmAvailableAudioProcessors = new AudioProcessor[1]; + toFloatPcmAvailableAudioProcessors[0] = new FloatResamplingAudioProcessor(); playheadOffsets = new long[MAX_PLAYHEAD_OFFSET_COUNT]; volume = 1.0f; startMediaTimeState = START_NOT_SET; @@ -368,17 +369,17 @@ public final class DefaultAudioSink implements AudioSink { shouldUpResPCMAudio = canConvertHiResPcmToFloat && (inputEncoding == C.ENCODING_PCM_24BIT || inputEncoding == C.ENCODING_PCM_32BIT); if (isInputPcm) { - pcmFrameSize = Util.getPcmFrameSize(shouldUpResPCMAudio - ? C.ENCODING_PCM_FLOAT : inputEncoding, channelCount); + pcmFrameSize = Util.getPcmFrameSize(inputEncoding, channelCount); } @C.Encoding int encoding = inputEncoding; boolean processingEnabled = isInputPcm && inputEncoding != C.ENCODING_PCM_FLOAT; + canApplyPlaybackParams = processingEnabled && !shouldUpResPCMAudio; if (processingEnabled) { - AudioProcessor[] activeAudioProcessors = shouldUpResPCMAudio ? - hiResAvailableAudioProcessors : availableAudioProcessors; + AudioProcessor[] availableAudioProcessors = shouldUpResPCMAudio ? + toFloatPcmAvailableAudioProcessors : toIntPcmAvailableAudioProcessors; trimmingAudioProcessor.setTrimSampleCount(trimStartSamples, trimEndSamples); channelMappingAudioProcessor.setChannelMap(outputChannels); - for (AudioProcessor audioProcessor : activeAudioProcessors) { + for (AudioProcessor audioProcessor : availableAudioProcessors) { try { flush |= audioProcessor.configure(sampleRate, channelCount, encoding); } catch (AudioProcessor.UnhandledFormatException e) { @@ -488,9 +489,9 @@ public final class DefaultAudioSink implements AudioSink { private void resetAudioProcessors() { ArrayList newAudioProcessors = new ArrayList<>(); - AudioProcessor[] activeAudioProcessors = shouldUpResPCMAudio ? - hiResAvailableAudioProcessors : availableAudioProcessors; - for (AudioProcessor audioProcessor : activeAudioProcessors) { + AudioProcessor[] availableAudioProcessors = shouldUpResPCMAudio ? + toFloatPcmAvailableAudioProcessors : toIntPcmAvailableAudioProcessors; + for (AudioProcessor audioProcessor : availableAudioProcessors) { if (audioProcessor.isActive()) { newAudioProcessors.add(audioProcessor); } else { @@ -838,7 +839,7 @@ public final class DefaultAudioSink implements AudioSink { @Override public PlaybackParameters setPlaybackParameters(PlaybackParameters playbackParameters) { - if (isInitialized() && !processingEnabled) { + if (isInitialized() && !canApplyPlaybackParams) { // The playback parameters are always the default if processing is disabled. this.playbackParameters = PlaybackParameters.DEFAULT; return this.playbackParameters; @@ -994,10 +995,10 @@ public final class DefaultAudioSink implements AudioSink { public void release() { reset(); releaseKeepSessionIdAudioTrack(); - for (AudioProcessor audioProcessor : availableAudioProcessors) { + for (AudioProcessor audioProcessor : toIntPcmAvailableAudioProcessors) { audioProcessor.reset(); } - for (AudioProcessor audioProcessor : hiResAvailableAudioProcessors) { + for (AudioProcessor audioProcessor : toFloatPcmAvailableAudioProcessors) { audioProcessor.reset(); } audioSessionId = C.AUDIO_SESSION_ID_UNSET; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/FloatResamplingAudioProcessor.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/FloatResamplingAudioProcessor.java index b0f48d43fa..f7073f1275 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/FloatResamplingAudioProcessor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/FloatResamplingAudioProcessor.java @@ -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; @@ -173,10 +188,7 @@ import java.nio.ByteOrder; int bits = Float.floatToIntBits(convVal); if (bits == 0x7fc00000) bits = Float.floatToIntBits((float) 0.0); - buffer.put((byte) (bits & 0xff)); - buffer.put((byte) ((bits >> 8) & 0xff)); - buffer.put((byte) ((bits >> 16) & 0xff)); - buffer.put((byte) ((bits >> 24) & 0xff)); + buffer.putInt(bits); } } \ No newline at end of file