From 60f3d77eb2d41d49ad6fd999c39f5792f804a17e Mon Sep 17 00:00:00 2001 From: quails4Eva Date: Sun, 3 Mar 2024 19:17:22 +0000 Subject: Skip silence setting per feed (#6910) --- .../core/feed/util/PlaybackSpeedUtils.java | 22 ++++++++++++++++++ .../core/preferences/PlaybackPreferences.java | 22 +++++++++++++++++- .../core/service/playback/ExoPlayerWrapper.java | 4 ++++ .../core/service/playback/LocalPSMP.java | 20 +++++++++++++++-- .../core/service/playback/PlaybackService.java | 26 +++++++++++++++++----- .../core/util/playback/PlaybackController.java | 12 +++++++++- 6 files changed, 97 insertions(+), 9 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/util/PlaybackSpeedUtils.java b/core/src/main/java/de/danoeh/antennapod/core/feed/util/PlaybackSpeedUtils.java index d0824e00b..cd98507ba 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/util/PlaybackSpeedUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/util/PlaybackSpeedUtils.java @@ -4,6 +4,7 @@ import android.util.Log; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; +import de.danoeh.antennapod.model.feed.FeedPreferences; import de.danoeh.antennapod.model.playback.MediaType; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.storage.preferences.UserPreferences; @@ -50,4 +51,25 @@ public final class PlaybackSpeedUtils { return playbackSpeed; } + + /** + * Returns the currently configured skip silence for the specified media. + */ + public static FeedPreferences.SkipSilence getCurrentSkipSilencePreference(Playable media) { + FeedPreferences.SkipSilence skipSilence = FeedPreferences.SkipSilence.GLOBAL; + if (media != null) { + skipSilence = PlaybackPreferences.getCurrentlyPlayingTemporarySkipSilence(); + if (skipSilence == FeedPreferences.SkipSilence.GLOBAL && media instanceof FeedMedia) { + FeedItem item = ((FeedMedia) media).getItem(); + if (item != null && item.getFeed() != null && item.getFeed().getPreferences() != null) { + skipSilence = item.getFeed().getPreferences().getFeedSkipSilence(); + } + } + } + if (skipSilence == FeedPreferences.SkipSilence.GLOBAL) { + skipSilence = UserPreferences.isSkipSilence() + ? FeedPreferences.SkipSilence.AGGRESSIVE : FeedPreferences.SkipSilence.OFF; + } + return skipSilence; + } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java index 160b6b774..d6f6cdb43 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java @@ -10,6 +10,7 @@ import android.util.Log; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.event.PlayerStatusEvent; import de.danoeh.antennapod.model.feed.FeedMedia; +import de.danoeh.antennapod.model.feed.FeedPreferences; import de.danoeh.antennapod.model.playback.MediaType; import de.danoeh.antennapod.model.playback.Playable; import de.danoeh.antennapod.playback.base.PlayerStatus; @@ -64,6 +65,12 @@ public class PlaybackPreferences implements SharedPreferences.OnSharedPreference private static final String PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED = "de.danoeh.antennapod.preferences.temporaryPlaybackSpeed"; + /** + * A temporary skip silence preference which overrides the per-feed skip silence for the currently playing + * media. Considered unset if set to null; + */ + private static final String PREF_CURRENTLY_PLAYING_TEMPORARY_SKIP_SILENCE + = "de.danoeh.antennapod.preferences.temporarySkipSilence"; /** * Value of PREF_CURRENTLY_PLAYING_MEDIA if no media is playing. @@ -123,6 +130,11 @@ public class PlaybackPreferences implements SharedPreferences.OnSharedPreference return prefs.getFloat(PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED, SPEED_USE_GLOBAL); } + public static FeedPreferences.SkipSilence getCurrentlyPlayingTemporarySkipSilence() { + return FeedPreferences.SkipSilence.fromCode(prefs.getInt( + PREF_CURRENTLY_PLAYING_TEMPORARY_SKIP_SILENCE, FeedPreferences.SkipSilence.GLOBAL.code)); + } + public static void writeNoMediaPlaying() { SharedPreferences.Editor editor = prefs.edit(); editor.putLong(PREF_CURRENTLY_PLAYING_MEDIA_TYPE, NO_MEDIA_PLAYING); @@ -170,9 +182,17 @@ public class PlaybackPreferences implements SharedPreferences.OnSharedPreference editor.apply(); } - public static void clearCurrentlyPlayingTemporaryPlaybackSpeed() { + public static void setCurrentlyPlayingTemporarySkipSilence(boolean skipSilence) { + SharedPreferences.Editor editor = prefs.edit(); + editor.putInt(PREF_CURRENTLY_PLAYING_TEMPORARY_SKIP_SILENCE, skipSilence + ? FeedPreferences.SkipSilence.AGGRESSIVE.code : FeedPreferences.SkipSilence.OFF.code); + editor.apply(); + } + + public static void clearCurrentlyPlayingTemporaryPlaybackSettings() { SharedPreferences.Editor editor = prefs.edit(); editor.remove(PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED); + editor.remove(PREF_CURRENTLY_PLAYING_TEMPORARY_SKIP_SILENCE); editor.apply(); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java index 4e29c9b8a..8ee47a147 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java @@ -166,6 +166,10 @@ public class ExoPlayerWrapper { return playbackParameters.speed; } + public boolean getCurrentSkipSilence() { + return exoPlayer.getSkipSilenceEnabled(); + } + public int getDuration() { if (exoPlayer.getDuration() == C.TIME_UNSET) { return Playable.INVALID_TIME; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java index 69c632c4f..2ad8f2b8a 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java @@ -161,7 +161,9 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { try { callback.ensureMediaInfoLoaded(media); callback.onMediaChanged(false); - setPlaybackParams(PlaybackSpeedUtils.getCurrentPlaybackSpeed(media), UserPreferences.isSkipSilence()); + setPlaybackParams(PlaybackSpeedUtils.getCurrentPlaybackSpeed(media), + PlaybackSpeedUtils.getCurrentSkipSilencePreference(media) + == FeedPreferences.SkipSilence.AGGRESSIVE); if (stream) { if (playable instanceof FeedMedia) { FeedMedia feedMedia = (FeedMedia) playable; @@ -212,7 +214,9 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { Log.d(TAG, "Resuming/Starting playback"); acquireWifiLockIfNecessary(); - setPlaybackParams(PlaybackSpeedUtils.getCurrentPlaybackSpeed(media), UserPreferences.isSkipSilence()); + setPlaybackParams(PlaybackSpeedUtils.getCurrentPlaybackSpeed(media), + PlaybackSpeedUtils.getCurrentSkipSilencePreference(media) + == FeedPreferences.SkipSilence.AGGRESSIVE); setVolume(1.0f, 1.0f); if (playerStatus == PlayerStatus.PREPARED && media.getPosition() > 0) { @@ -461,6 +465,18 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { return retVal; } + @Override + public boolean getSkipSilence() { + boolean retVal = false; + if ((playerStatus == PlayerStatus.PLAYING + || playerStatus == PlayerStatus.PAUSED + || playerStatus == PlayerStatus.INITIALIZED + || playerStatus == PlayerStatus.PREPARED)) { + retVal = mediaPlayer.getCurrentSkipSilence(); + } + return retVal; + } + /** * Sets the playback volume. * This method is executed on an internal executor service. diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index fd11dc4c5..401d09ad7 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -750,7 +750,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { } if (!playable.getIdentifier().equals(PlaybackPreferences.getCurrentlyPlayingFeedMediaId())) { - PlaybackPreferences.clearCurrentlyPlayingTemporaryPlaybackSpeed(); + PlaybackPreferences.clearCurrentlyPlayingTemporaryPlaybackSettings(); } mediaPlayer.playMediaObject(playable, stream, true, true); @@ -1047,7 +1047,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { */ private void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) { Log.d(TAG, "Playback ended"); - PlaybackPreferences.clearCurrentlyPlayingTemporaryPlaybackSpeed(); + PlaybackPreferences.clearCurrentlyPlayingTemporaryPlaybackSettings(); if (stopPlaying) { taskManager.cancelPositionSaver(); cancelPositionObserver(); @@ -1604,8 +1604,15 @@ public class PlaybackService extends MediaBrowserServiceCompat { if (((FeedMedia) getPlayable()).getItem().getFeed().getId() == event.getFeedId()) { if (event.getSpeed() == SPEED_USE_GLOBAL) { setSpeed(UserPreferences.getPlaybackSpeed(getPlayable().getMediaType())); + setSkipSilence(UserPreferences.isSkipSilence()); } else { setSpeed(event.getSpeed()); + FeedPreferences.SkipSilence skipSilence = event.getSkipSilence(); + if (skipSilence == FeedPreferences.SkipSilence.GLOBAL) { + setSkipSilence(UserPreferences.isSkipSilence()); + } else { + setSkipSilence(skipSilence == FeedPreferences.SkipSilence.AGGRESSIVE); + } } } } @@ -1669,20 +1676,29 @@ public class PlaybackService extends MediaBrowserServiceCompat { UserPreferences.setPlaybackSpeed(speed); } - mediaPlayer.setPlaybackParams(speed, UserPreferences.isSkipSilence()); + mediaPlayer.setPlaybackParams(speed, getCurrentSkipSilence()); } - public void skipSilence(boolean skipSilence) { + public void setSkipSilence(boolean skipSilence) { + PlaybackPreferences.setCurrentlyPlayingTemporarySkipSilence(skipSilence); + UserPreferences.setSkipSilence(skipSilence); mediaPlayer.setPlaybackParams(getCurrentPlaybackSpeed(), skipSilence); } public float getCurrentPlaybackSpeed() { - if(mediaPlayer == null) { + if (mediaPlayer == null) { return 1.0f; } return mediaPlayer.getPlaybackSpeed(); } + public boolean getCurrentSkipSilence() { + if (mediaPlayer == null) { + return false; + } + return mediaPlayer.getSkipSilence(); + } + public boolean isStartWhenPrepared() { return mediaPlayer.isStartWhenPrepared(); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java index 2274dcf83..f17bd7e31 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java @@ -18,6 +18,7 @@ import de.danoeh.antennapod.event.playback.PlaybackPositionEvent; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.event.playback.PlaybackServiceEvent; import de.danoeh.antennapod.event.playback.SpeedChangedEvent; +import de.danoeh.antennapod.model.feed.FeedPreferences; import de.danoeh.antennapod.model.playback.MediaType; import de.danoeh.antennapod.core.feed.util.PlaybackSpeedUtils; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; @@ -407,7 +408,7 @@ public abstract class PlaybackController { public void setSkipSilence(boolean skipSilence) { if (playbackService != null) { - playbackService.skipSilence(skipSilence); + playbackService.setSkipSilence(skipSilence); } } @@ -419,6 +420,15 @@ public abstract class PlaybackController { } } + public boolean getCurrentPlaybackSkipSilence() { + if (playbackService != null) { + return playbackService.getCurrentSkipSilence(); + } else { + return PlaybackSpeedUtils.getCurrentSkipSilencePreference(getMedia()) + == FeedPreferences.SkipSilence.AGGRESSIVE; + } + } + public List getAudioTracks() { if (playbackService == null) { return Collections.emptyList(); -- cgit v1.2.3