From c3721266b5b9078453f6602941c96afce9c9e4c5 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sun, 26 Jun 2022 19:16:25 -0600 Subject: [PATCH] playback: use isactive in replaygain [#174] Override isActive to control when the ReplayGain engine should manipulate audio. This makes the system much more efficient, as we can side-step a useless copy when ReplayGain shouldn't be applied. --- CHANGELOG.md | 2 ++ .../replaygain/ReplayGainAudioProcessor.kt | 31 +++++++++---------- .../fragment_playback_panel.xml | 4 +-- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a92cb6e9..3946d3562 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ #### What's Improved - Made "timeline" elements (like playback controls) always left-to-right +- Improved performance when ReplayGain is not enabled #### What's Fixed - Fixed broken tablet layouts @@ -16,6 +17,7 @@ - Fixed miscellanious startup issues - Fixed crash if settings was navigated away before playback state finished saving +- Fixed broken album menu #### What's Changed - Reworked typography and iconography to be more aligned with material diff --git a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt index 609b1738f..1bfad4b7c 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt @@ -218,29 +218,26 @@ class ReplayGainAudioProcessor(context: Context) : BaseAudioProcessor() { throw AudioProcessor.UnhandledAudioFormatException(inputAudioFormat) } + override fun isActive() = super.isActive() && volume != 1f + override fun queueInput(inputBuffer: ByteBuffer) { val position = inputBuffer.position() val limit = inputBuffer.limit() val size = limit - position val buffer = replaceOutputBuffer(size) - if (volume == 1f) { - // No need to apply ReplayGain. - buffer.put(inputBuffer.slice()) - } else { - for (i in position until limit step 2) { - // Ensure we clamp the values to the minimum and maximum values possible - // for the encoding. This prevents issues where samples amplified beyond - // 1 << 16 will end up becoming truncated during the conversion to a short, - // resulting in popping. - var sample = inputBuffer.getLeShort(i) - sample = - (sample * volume) - .toInt() - .clamp(Short.MIN_VALUE.toInt(), Short.MAX_VALUE.toInt()) - .toShort() - buffer.putLeShort(sample) - } + for (i in position until limit step 2) { + // Ensure we clamp the values to the minimum and maximum values possible + // for the encoding. This prevents issues where samples amplified beyond + // 1 << 16 will end up becoming truncated during the conversion to a short, + // resulting in popping. + var sample = inputBuffer.getLeShort(i) + sample = + (sample * volume) + .toInt() + .clamp(Short.MIN_VALUE.toInt(), Short.MAX_VALUE.toInt()) + .toShort() + buffer.putLeShort(sample) } inputBuffer.position(limit) diff --git a/app/src/main/res/layout-sw600dp/fragment_playback_panel.xml b/app/src/main/res/layout-sw600dp/fragment_playback_panel.xml index fed5eb1c8..f64e32e42 100644 --- a/app/src/main/res/layout-sw600dp/fragment_playback_panel.xml +++ b/app/src/main/res/layout-sw600dp/fragment_playback_panel.xml @@ -66,8 +66,8 @@ android:id="@+id/playback_seek_bar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/spacing_medium" - android:layout_marginEnd="@dimen/spacing_medium" + android:layout_marginStart="@dimen/spacing_small" + android:layout_marginEnd="@dimen/spacing_small" app:layout_constraintBottom_toTopOf="@+id/playback_controls_container" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0"