Check if volume boost effect is supported on the device (#6808)
This commit is contained in:
parent
58081fe5bf
commit
f476086114
|
@ -0,0 +1,27 @@
|
||||||
|
package de.danoeh.antennapod.preferences;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import de.danoeh.antennapod.model.feed.VolumeAdaptionSetting;
|
||||||
|
|
||||||
|
public class VolumeAdaptationPreference extends MaterialListPreference {
|
||||||
|
public VolumeAdaptationPreference(Context context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public VolumeAdaptationPreference(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence[] getEntries() {
|
||||||
|
if (VolumeAdaptionSetting.isBoostSupported()) {
|
||||||
|
return super.getEntries();
|
||||||
|
} else {
|
||||||
|
return Arrays.copyOfRange(super.getEntries(), 0, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -48,7 +48,7 @@
|
||||||
android:summary="@string/global_default"
|
android:summary="@string/global_default"
|
||||||
android:title="@string/auto_delete_label" />
|
android:title="@string/auto_delete_label" />
|
||||||
|
|
||||||
<de.danoeh.antennapod.preferences.MaterialListPreference
|
<de.danoeh.antennapod.preferences.VolumeAdaptationPreference
|
||||||
android:defaultValue="off"
|
android:defaultValue="off"
|
||||||
android:entries="@array/spnVolumeAdaptationItems"
|
android:entries="@array/spnVolumeAdaptationItems"
|
||||||
android:entryValues="@array/spnVolumeAdaptationValues"
|
android:entryValues="@array/spnVolumeAdaptationValues"
|
||||||
|
|
|
@ -7,6 +7,7 @@ import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.SurfaceHolder;
|
import android.view.SurfaceHolder;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.util.Consumer;
|
import androidx.core.util.Consumer;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.DefaultLoadControl;
|
import com.google.android.exoplayer2.DefaultLoadControl;
|
||||||
|
@ -37,6 +38,7 @@ import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
|
||||||
import com.google.android.exoplayer2.upstream.HttpDataSource;
|
import com.google.android.exoplayer2.upstream.HttpDataSource;
|
||||||
import de.danoeh.antennapod.core.ClientConfig;
|
import de.danoeh.antennapod.core.ClientConfig;
|
||||||
import de.danoeh.antennapod.core.R;
|
import de.danoeh.antennapod.core.R;
|
||||||
|
import de.danoeh.antennapod.model.feed.VolumeAdaptionSetting;
|
||||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||||
import de.danoeh.antennapod.core.service.download.AntennapodHttpClient;
|
import de.danoeh.antennapod.core.service.download.AntennapodHttpClient;
|
||||||
import de.danoeh.antennapod.core.service.download.HttpCredentialEncoder;
|
import de.danoeh.antennapod.core.service.download.HttpCredentialEncoder;
|
||||||
|
@ -69,7 +71,8 @@ public class ExoPlayerWrapper {
|
||||||
private PlaybackParameters playbackParameters;
|
private PlaybackParameters playbackParameters;
|
||||||
private DefaultTrackSelector trackSelector;
|
private DefaultTrackSelector trackSelector;
|
||||||
|
|
||||||
private LoudnessEnhancer loudnessEnhancer;
|
@Nullable
|
||||||
|
private LoudnessEnhancer loudnessEnhancer = null;
|
||||||
|
|
||||||
ExoPlayerWrapper(Context context) {
|
ExoPlayerWrapper(Context context) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
@ -247,13 +250,17 @@ public class ExoPlayerWrapper {
|
||||||
public void setVolume(float v, float v1) {
|
public void setVolume(float v, float v1) {
|
||||||
if (v > 1) {
|
if (v > 1) {
|
||||||
exoPlayer.setVolume(1f);
|
exoPlayer.setVolume(1f);
|
||||||
|
if (loudnessEnhancer != null) {
|
||||||
loudnessEnhancer.setEnabled(true);
|
loudnessEnhancer.setEnabled(true);
|
||||||
loudnessEnhancer.setTargetGain((int) (1000 * (v - 1)));
|
loudnessEnhancer.setTargetGain((int) (1000 * (v - 1)));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
exoPlayer.setVolume(v);
|
exoPlayer.setVolume(v);
|
||||||
|
if (loudnessEnhancer != null) {
|
||||||
loudnessEnhancer.setEnabled(false);
|
loudnessEnhancer.setEnabled(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
exoPlayer.play();
|
exoPlayer.play();
|
||||||
|
@ -354,6 +361,10 @@ public class ExoPlayerWrapper {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initLoudnessEnhancer(int audioStreamId) {
|
private void initLoudnessEnhancer(int audioStreamId) {
|
||||||
|
if (!VolumeAdaptionSetting.isBoostSupported()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
LoudnessEnhancer newEnhancer = new LoudnessEnhancer(audioStreamId);
|
LoudnessEnhancer newEnhancer = new LoudnessEnhancer(audioStreamId);
|
||||||
LoudnessEnhancer oldEnhancer = this.loudnessEnhancer;
|
LoudnessEnhancer oldEnhancer = this.loudnessEnhancer;
|
||||||
if (oldEnhancer != null) {
|
if (oldEnhancer != null) {
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package de.danoeh.antennapod.core.feed;
|
package de.danoeh.antennapod.core.feed;
|
||||||
|
|
||||||
import de.danoeh.antennapod.model.feed.VolumeAdaptionSetting;
|
import de.danoeh.antennapod.model.feed.VolumeAdaptionSetting;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
|
@ -11,6 +14,16 @@ import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
public class VolumeAdaptionSettingTest {
|
public class VolumeAdaptionSettingTest {
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
VolumeAdaptionSetting.setBoostSupported(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
VolumeAdaptionSetting.setBoostSupported(null);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void mapOffToInteger() {
|
public void mapOffToInteger() {
|
||||||
VolumeAdaptionSetting setting = VolumeAdaptionSetting.OFF;
|
VolumeAdaptionSetting setting = VolumeAdaptionSetting.OFF;
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
package de.danoeh.antennapod.model.feed;
|
package de.danoeh.antennapod.model.feed;
|
||||||
|
|
||||||
|
import android.media.audiofx.AudioEffect;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
|
||||||
public enum VolumeAdaptionSetting {
|
public enum VolumeAdaptionSetting {
|
||||||
OFF(0, 1.0f),
|
OFF(0, 1.0f),
|
||||||
LIGHT_REDUCTION(1, 0.5f),
|
LIGHT_REDUCTION(1, 0.5f),
|
||||||
|
@ -32,4 +37,29 @@ public enum VolumeAdaptionSetting {
|
||||||
public float getAdaptionFactor() {
|
public float getAdaptionFactor() {
|
||||||
return adaptionFactor;
|
return adaptionFactor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static Boolean boostSupported = null;
|
||||||
|
|
||||||
|
public static boolean isBoostSupported() {
|
||||||
|
if (boostSupported != null) {
|
||||||
|
return boostSupported;
|
||||||
|
}
|
||||||
|
final AudioEffect.Descriptor[] audioEffects = AudioEffect.queryEffects();
|
||||||
|
if (audioEffects != null) {
|
||||||
|
for (AudioEffect.Descriptor effect : audioEffects) {
|
||||||
|
if (effect.type.equals(AudioEffect.EFFECT_TYPE_LOUDNESS_ENHANCER)) {
|
||||||
|
boostSupported = true;
|
||||||
|
return boostSupported;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boostSupported = false;
|
||||||
|
return boostSupported;
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public static void setBoostSupported(@Nullable Boolean boostSupported) {
|
||||||
|
VolumeAdaptionSetting.boostSupported = boostSupported;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue