diff --git a/platform/api16/com/miniabs/ExoEngine.java b/platform/api16/com/miniabs/ExoEngine.java index c09cde4..21b5045 100644 --- a/platform/api16/com/miniabs/ExoEngine.java +++ b/platform/api16/com/miniabs/ExoEngine.java @@ -121,6 +121,7 @@ final class ExoEngine implements Engine { public void setVolume(float v) { player.setVolume(v); } + /** Before prepare for skipping silences to work: ExoPlayer 2.18 switches it on only when it sets up the audio. */ public void setSpeed(float speed, boolean skipSilence) { player.setPlaybackParameters(new PlaybackParameters(speed)); player.setSkipSilenceEnabled(skipSilence); diff --git a/src/com/miniabs/PlayerService.java b/src/com/miniabs/PlayerService.java index ca26e54..c6b1f1f 100644 --- a/src/com/miniabs/PlayerService.java +++ b/src/com/miniabs/PlayerService.java @@ -68,6 +68,7 @@ public class PlayerService extends Service implements Engine.Listener, AudioMana private boolean prepared; private String sourceUrl; // what the engine was opened with, to reopen it in the other engine private boolean fallback; // this episode didn't decode in ExoPlayer: Android's MediaPlayer + private boolean engineSkip; // whether the engine was opened skipping silences private String coverFor; // the notification and lock screen's cover private Bitmap cover; private Episode ep; @@ -456,6 +457,10 @@ public class PlayerService extends Service implements Engine.Listener, AudioMana sourceUrl = url; mp = Platform.newEngine(getApplicationContext(), fallback); mp.setListener(this); + // before the audio is opened: ExoPlayer sets up skipping silences only then + Prefs prefs = Prefs.get(this); + engineSkip = prefs.skipSilence(); + mp.setSpeed(prefs.speed(), engineSkip); try { if (local) { mp.setSource(new File(url), null); @@ -491,10 +496,20 @@ public class PlayerService extends Service implements Engine.Listener, AudioMana } } - /** Speed or skipping silences changed in the player screen or Settings. */ + /** Speed or skipping silences changed in the player screen or Settings. Speed changes as it plays; skipping + * silences only takes effect when the audio is opened, so the episode is reopened here at the same spot. */ void applySpeed() { Prefs p = Prefs.get(this); - if (mp != null) mp.setSpeed(p.speed(), p.skipSilence()); + if (mp == null) return; + if (Platform.SPEED && prepared && sourceUrl != null && p.skipSilence() != engineSkip) { + boolean wasPlaying = state == PLAYING; + resumeMs = positionMs(); + lastPosMs = resumeMs; + playOnPrepared = wasPlaying; + prepare(sourceUrl, null); + return; + } + mp.setSpeed(p.speed(), engineSkip); } private void start() {