From 6663f59089953a6b0316f32a0f094a1788ed28df Mon Sep 17 00:00:00 2001 From: TheDiamondPicks Date: Tue, 27 Feb 2018 14:40:09 +1300 Subject: [PATCH 1/9] Make Remembering Stuff Great Again --- .../main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java index d0d5b10..a3630f2 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java +++ b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java @@ -203,7 +203,7 @@ public void onTimeShiftSeekTo(long timeMs) { @Override public void onTimeShiftSetPlaybackParams(PlaybackParams params) { Log.d(TAG, "onTimeShiftSetPlaybackParams: " + params); - + // TODO: Use a custom renderer to adjust playback speed. This is likely where the thing happens Toast.makeText(mContext, "Unsupported", Toast.LENGTH_SHORT).show(); } From c8145883cba22caec09eace24daf1e2efeb8258b Mon Sep 17 00:00:00 2001 From: TheDiamondPicks Date: Tue, 27 Feb 2018 14:45:45 +1300 Subject: [PATCH 2/9] added link to thing I need --- app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java index a3630f2..14c8686 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java +++ b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java @@ -204,6 +204,7 @@ public void onTimeShiftSeekTo(long timeMs) { public void onTimeShiftSetPlaybackParams(PlaybackParams params) { Log.d(TAG, "onTimeShiftSetPlaybackParams: " + params); // TODO: Use a custom renderer to adjust playback speed. This is likely where the thing happens + // https://gist.github.com/jmgirven/4e0ba2c7d584c8695549 Toast.makeText(mContext, "Unsupported", Toast.LENGTH_SHORT).show(); } From 4ece36f279484c15db8b09b44f9488456a3fb6a3 Mon Sep 17 00:00:00 2001 From: TheDiamondPicks Date: Tue, 27 Feb 2018 14:58:53 +1300 Subject: [PATCH 3/9] experimental support for Fast Foward & Rewind untested woo --- .../java/ie/macinnes/tvheadend/tvinput/HtspSession.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java index 14c8686..03aa9c6 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java +++ b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java @@ -205,7 +205,11 @@ public void onTimeShiftSetPlaybackParams(PlaybackParams params) { Log.d(TAG, "onTimeShiftSetPlaybackParams: " + params); // TODO: Use a custom renderer to adjust playback speed. This is likely where the thing happens // https://gist.github.com/jmgirven/4e0ba2c7d584c8695549 - Toast.makeText(mContext, "Unsupported", Toast.LENGTH_SHORT).show(); + + //Toast.makeText(mContext, "Unsupported", Toast.LENGTH_SHORT).show(); + + // may or may not work. Could break something idk + mTvheadendPlayer.setPlaybackParams(params); } @RequiresApi(api = Build.VERSION_CODES.M) From 6c13c14543fe27666f7bb97cb515fd5994bbecc5 Mon Sep 17 00:00:00 2001 From: TheDiamondPicks Date: Sat, 10 Mar 2018 18:46:20 +1300 Subject: [PATCH 4/9] Fixed fast foward on recordings - now works perfectly --- .../tvheadend/player/TvheadendPlayer.java | 40 ++----------------- .../tvheadend/tvinput/HtspSession.java | 7 +--- 2 files changed, 4 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java b/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java index 9cf4426..ad507b0 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java +++ b/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java @@ -235,46 +235,12 @@ public void seek(long timeMs) { public void setPlaybackParams(PlaybackParams params) { float rawSpeed = params.getSpeed(); int speed = (int) rawSpeed; - int translatedSpeed; - - switch(speed) { - case 0: - translatedSpeed = 100; - break; - case -2: - translatedSpeed = -200; - break; - case -4: - translatedSpeed = -300; - break; - case -12: - translatedSpeed = -400; - break; - case -48: - translatedSpeed = -500; - break; - case 2: - translatedSpeed = 200; - break; - case 4: - translatedSpeed = 300; - break; - case 12: - translatedSpeed = 400; - break; - case 48: - translatedSpeed = 500; - break; - default: - Log.d(TAG, "Unknown speed??? " + rawSpeed); - return; - } - Log.d(TAG, "Speed: " + params.getSpeed() + " / " + translatedSpeed); + Log.d(TAG, "Speed: " + params.getSpeed()); if (mDataSource != null) { - mDataSource.setSpeed(translatedSpeed); - mExoPlayer.setPlaybackParameters(new PlaybackParameters(translatedSpeed, 0)); + mDataSource.setSpeed(speed); + mExoPlayer.setPlaybackParameters(new PlaybackParameters(speed, 1)); } } diff --git a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java index 03aa9c6..18a0d5b 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java +++ b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java @@ -133,6 +133,7 @@ public void onSetStreamVolume(float volume) { @Override public View onCreateOverlayView() { Log.d(TAG, "Session onCreateOverlayView (" + mSessionNumber + ")"); + return mTvheadendPlayer.getOverlayView( mCaptioningManager.getUserStyle(), mCaptioningManager.getFontScale()); } @@ -203,12 +204,6 @@ public void onTimeShiftSeekTo(long timeMs) { @Override public void onTimeShiftSetPlaybackParams(PlaybackParams params) { Log.d(TAG, "onTimeShiftSetPlaybackParams: " + params); - // TODO: Use a custom renderer to adjust playback speed. This is likely where the thing happens - // https://gist.github.com/jmgirven/4e0ba2c7d584c8695549 - - //Toast.makeText(mContext, "Unsupported", Toast.LENGTH_SHORT).show(); - - // may or may not work. Could break something idk mTvheadendPlayer.setPlaybackParams(params); } From 99c0d4fa2318a84ff4f00753c2dcd66bec21d08b Mon Sep 17 00:00:00 2001 From: TheDiamondPicks Date: Sat, 10 Mar 2018 19:42:27 +1300 Subject: [PATCH 5/9] Mute stream when fast forwarding --- .../java/ie/macinnes/tvheadend/player/TvheadendPlayer.java | 1 - .../java/ie/macinnes/tvheadend/tvinput/HtspSession.java | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java b/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java index ad507b0..9c73e96 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java +++ b/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java @@ -237,7 +237,6 @@ public void setPlaybackParams(PlaybackParams params) { int speed = (int) rawSpeed; Log.d(TAG, "Speed: " + params.getSpeed()); - if (mDataSource != null) { mDataSource.setSpeed(speed); mExoPlayer.setPlaybackParameters(new PlaybackParameters(speed, 1)); diff --git a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java index 18a0d5b..90fbd24 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java +++ b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java @@ -204,6 +204,12 @@ public void onTimeShiftSeekTo(long timeMs) { @Override public void onTimeShiftSetPlaybackParams(PlaybackParams params) { Log.d(TAG, "onTimeShiftSetPlaybackParams: " + params); + if (params.getSpeed() == 1) { + mTvheadendPlayer.setVolume(1.0f); + } + else { + mTvheadendPlayer.setVolume(0f); + } mTvheadendPlayer.setPlaybackParams(params); } From aec01ed79715811dc44ffbad1686dc802f25d83f Mon Sep 17 00:00:00 2001 From: TheDiamondPicks Date: Sun, 11 Mar 2018 11:48:15 +1300 Subject: [PATCH 6/9] Re-add translated speed, pending support in mDataSource --- .../tvheadend/player/TvheadendPlayer.java | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java b/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java index 9c73e96..4bdbb66 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java +++ b/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java @@ -236,9 +236,44 @@ public void setPlaybackParams(PlaybackParams params) { float rawSpeed = params.getSpeed(); int speed = (int) rawSpeed; - Log.d(TAG, "Speed: " + params.getSpeed()); + int translatedSpeed; + + switch(speed) { + case 1: + translatedSpeed = 100; + break; + case -2: + translatedSpeed = -200; + break; + case -3: + translatedSpeed = -300; + break; + case -4: + translatedSpeed = -400; + break; + case -5: + translatedSpeed = -500; + break; + case 2: + translatedSpeed = 200; + break; + case 3: + translatedSpeed = 300; + break; + case 4: + translatedSpeed = 400; + break; + case 5: + translatedSpeed = 500; + break; + default: + Log.d(TAG, "Unknown speed??? " + rawSpeed); + return; + } + + Log.d(TAG, "Speed: " + params.getSpeed() + " / " + translatedSpeed); if (mDataSource != null) { - mDataSource.setSpeed(speed); + mDataSource.setSpeed(translatedSpeed); mExoPlayer.setPlaybackParameters(new PlaybackParameters(speed, 1)); } } From 86449ed1ded801fe3d29bd6a803c25e7ac3aac74 Mon Sep 17 00:00:00 2001 From: TheDiamondPicks Date: Sun, 11 Mar 2018 12:09:24 +1300 Subject: [PATCH 7/9] Fixed translated speed --- .../java/ie/macinnes/tvheadend/player/TvheadendPlayer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java b/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java index 4bdbb66..3f8d94b 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java +++ b/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java @@ -257,13 +257,13 @@ public void setPlaybackParams(PlaybackParams params) { case 2: translatedSpeed = 200; break; - case 3: + case 8: translatedSpeed = 300; break; - case 4: + case 32: translatedSpeed = 400; break; - case 5: + case 128: translatedSpeed = 500; break; default: From 49c04ac9002fb869eb21ab27f33201cb06ee9c5e Mon Sep 17 00:00:00 2001 From: Kiall Mac Innes Date: Sun, 11 Mar 2018 17:09:58 +0000 Subject: [PATCH 8/9] Several fast forward cleanups / fixes * Move speed translations into *Utils classes. * Translate TIF speed -> ExoPlayer speed * Call onTimeShiftSetPlaybackParams on resume to reset speed to real-time --- .../ie/macinnes/tvheadend/TvhMappings.java | 48 +++++++++++++++ .../tvheadend/player/ExoPlayerUtils.java | 31 ++++++++++ .../player/HtspSubscriptionDataSource.java | 4 +- .../tvheadend/player/TvheadendPlayer.java | 59 ++++++------------- .../tvheadend/tvinput/HtspSession.java | 13 +++- 5 files changed, 110 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/ie/macinnes/tvheadend/TvhMappings.java b/app/src/main/java/ie/macinnes/tvheadend/TvhMappings.java index 3f05619..a794571 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/TvhMappings.java +++ b/app/src/main/java/ie/macinnes/tvheadend/TvhMappings.java @@ -16,7 +16,10 @@ package ie.macinnes.tvheadend; +import android.util.Log; + public class TvhMappings { + private static final String TAG = TvhMappings.class.getName(); private TvhMappings() { throw new IllegalAccessError("Utility class"); @@ -33,4 +36,49 @@ public static int sriToRate(int sri) { return mSampleRates[sri & 0xf]; } + + public static int androidSpeedToTvhSpeed(float speed) { + // Translate the speed value from what Android uses, to what TVHeadend expects. + // TVHeadend expects: 0=pause, 100=1x fwd, -100=1x backward) + + int translatedSpeed; + + switch((int) speed) { + case 1: // Normal Playback + translatedSpeed = 100; + break; + + case -2: // 2x Rewind + translatedSpeed = -200; + break; + case -4: // 3x Rewind + translatedSpeed = -300; + break; + case -12: // 4x Rewind + translatedSpeed = -400; + break; + case -48: // 5x Rewind + translatedSpeed = -500; + break; + + case 2: // 2x Fast forward + translatedSpeed = 200; + break; + case 8: // 3x Fast forward + translatedSpeed = 300; + break; + case 32: // 4x Fast forward + translatedSpeed = 400; + break; + case 128: // 5x Fast forward + translatedSpeed = 500; + break; + + default: + throw new IllegalArgumentException("Unknown speed: " + speed); + } + + Log.d(TAG, "Translated android speed " + speed + " to TVH speed " + translatedSpeed); + return translatedSpeed; + } } diff --git a/app/src/main/java/ie/macinnes/tvheadend/player/ExoPlayerUtils.java b/app/src/main/java/ie/macinnes/tvheadend/player/ExoPlayerUtils.java index e1da726..7cac498 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/player/ExoPlayerUtils.java +++ b/app/src/main/java/ie/macinnes/tvheadend/player/ExoPlayerUtils.java @@ -144,4 +144,35 @@ private static String joinWithSeparator(String first, String second) { return first + ", " + second; } } + + public static float androidSpeedToExoPlayerSpeed(float speed) { + // Translate the speed value from what Android uses, to what ExoPlayer expects. Must be + // greater than zero, and cannot be used for rewind. + float translatedSpeed; + + switch((int) speed) { + case 1: // Normal Playback + translatedSpeed = 1.0f; + break; + + case 2: // 2x Fast forward + translatedSpeed = 2.0f; + break; + case 8: // 3x Fast forward + translatedSpeed = 3.0f; + break; + case 32: // 4x Fast forward + translatedSpeed = 4.0f; + break; + case 128: // 5x Fast forward + translatedSpeed = 5.0f; + break; + + default: + throw new IllegalArgumentException("Unknown speed: " + speed); + } + + Log.d(TAG, "Translated android speed " + speed + " to ExoPlayer speed " + translatedSpeed); + return translatedSpeed; + } } diff --git a/app/src/main/java/ie/macinnes/tvheadend/player/HtspSubscriptionDataSource.java b/app/src/main/java/ie/macinnes/tvheadend/player/HtspSubscriptionDataSource.java index 674c2f1..73512f0 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/player/HtspSubscriptionDataSource.java +++ b/app/src/main/java/ie/macinnes/tvheadend/player/HtspSubscriptionDataSource.java @@ -328,7 +328,9 @@ public long getTimeshiftOffsetPts() { @Override public void setSpeed(int speed) { - + if (mSubscriber != null) { + mSubscriber.setSpeed(speed); + } } // Misc Internal Methods diff --git a/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java b/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java index 3f8d94b..e45e636 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java +++ b/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java @@ -37,6 +37,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import android.widget.Toast; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; @@ -75,6 +76,7 @@ import ie.macinnes.tvheadend.Constants; import ie.macinnes.tvheadend.R; import ie.macinnes.tvheadend.TvContractUtils; +import ie.macinnes.tvheadend.TvhMappings; public class TvheadendPlayer implements Player.EventListener { private static final String TAG = TvheadendPlayer.class.getName(); @@ -233,48 +235,23 @@ public void seek(long timeMs) { @RequiresApi(api = Build.VERSION_CODES.M) public void setPlaybackParams(PlaybackParams params) { - float rawSpeed = params.getSpeed(); - int speed = (int) rawSpeed; - - int translatedSpeed; - - switch(speed) { - case 1: - translatedSpeed = 100; - break; - case -2: - translatedSpeed = -200; - break; - case -3: - translatedSpeed = -300; - break; - case -4: - translatedSpeed = -400; - break; - case -5: - translatedSpeed = -500; - break; - case 2: - translatedSpeed = 200; - break; - case 8: - translatedSpeed = 300; - break; - case 32: - translatedSpeed = 400; - break; - case 128: - translatedSpeed = 500; - break; - default: - Log.d(TAG, "Unknown speed??? " + rawSpeed); - return; - } + Log.d(TAG, "setPlaybackParams: Speed: " + params.getSpeed()); - Log.d(TAG, "Speed: " + params.getSpeed() + " / " + translatedSpeed); - if (mDataSource != null) { - mDataSource.setSpeed(translatedSpeed); - mExoPlayer.setPlaybackParameters(new PlaybackParameters(speed, 1)); + float speed = params.getSpeed(); + + if (speed > 0) { + // Forward Playback + if (mDataSource != null) { + // Convert from TIF speed format, over to TVH and ExoPlayer formats + int tvhSpeed = TvhMappings.androidSpeedToTvhSpeed(speed); + float exoSpeed = ExoPlayerUtils.androidSpeedToExoPlayerSpeed(speed); + + mDataSource.setSpeed(tvhSpeed); + mExoPlayer.setPlaybackParameters(new PlaybackParameters(exoSpeed, 1)); + } + } else { + // Reverse Playback + Toast.makeText(mContext, "Rewind unsupported", Toast.LENGTH_SHORT).show(); } } diff --git a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java index 90fbd24..9109fa1 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java +++ b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java @@ -191,6 +191,12 @@ public void onTimeShiftPause() { public void onTimeShiftResume() { Log.d(TAG, "onTimeShiftResume"); mTvheadendPlayer.resume(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + PlaybackParams normalParams = new PlaybackParams(); + normalParams.setSpeed(1); + onTimeShiftSetPlaybackParams(normalParams); + } } @Override @@ -203,13 +209,14 @@ public void onTimeShiftSeekTo(long timeMs) { @RequiresApi(api = Build.VERSION_CODES.M) @Override public void onTimeShiftSetPlaybackParams(PlaybackParams params) { - Log.d(TAG, "onTimeShiftSetPlaybackParams: " + params); + Log.d(TAG, "onTimeShiftSetPlaybackParams: Speed: " + params.getSpeed()); + if (params.getSpeed() == 1) { mTvheadendPlayer.setVolume(1.0f); - } - else { + } else { mTvheadendPlayer.setVolume(0f); } + mTvheadendPlayer.setPlaybackParams(params); } From 0b3e8da478d783279aca8b2af92ea0c4f231039c Mon Sep 17 00:00:00 2001 From: Kiall Mac Innes Date: Sun, 11 Mar 2018 18:45:47 +0000 Subject: [PATCH 9/9] Horrible code to test our rewind! --- .../tvheadend/player/TvheadendPlayer.java | 88 ++++++++++++++++--- .../tvheadend/tvinput/HtspSession.java | 6 -- 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java b/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java index e45e636..2b0b0aa 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java +++ b/app/src/main/java/ie/macinnes/tvheadend/player/TvheadendPlayer.java @@ -25,6 +25,7 @@ import android.media.tv.TvTrackInfo; import android.net.Uri; import android.os.Build; +import android.os.Handler; import android.support.annotation.RequiresApi; import android.util.Log; import android.util.SparseArray; @@ -37,7 +38,6 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import android.widget.Toast; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; @@ -71,6 +71,8 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.Timer; +import java.util.TimerTask; import ie.macinnes.htsp.SimpleHtspConnection; import ie.macinnes.tvheadend.Constants; @@ -114,6 +116,8 @@ public interface Listener { private final SimpleHtspConnection mConnection; private final Listener mListener; + private final Handler mHandler; + private final Timer mTimer; private final SharedPreferences mSharedPreferences; private SimpleExoPlayer mExoPlayer; @@ -135,11 +139,16 @@ public interface Listener { private Uri mCurrentChannelUri; + private float mSpeed = 1.0f; + private TimerTask mRewindTimerTask; + public TvheadendPlayer(Context context, SimpleHtspConnection connection, Listener listener) { mContext = context; mConnection = connection; mListener = listener; + mHandler = new Handler(); + mTimer = new Timer(); mSharedPreferences = mContext.getSharedPreferences( Constants.PREFERENCE_TVHEADEND, Context.MODE_PRIVATE); @@ -195,10 +204,12 @@ public boolean selectTrack(int type, String trackId) { public void play() { // Start playback when ready mExoPlayer.setPlayWhenReady(true); + cancelRewind(); } public void resume() { mExoPlayer.setPlayWhenReady(true); + cancelRewind(); if (mDataSource != null) { Log.d(TAG, "Resuming HtspDataSource"); @@ -210,6 +221,7 @@ public void resume() { public void pause() { mExoPlayer.setPlayWhenReady(false); + cancelRewind(); if (mDataSource != null) { Log.d(TAG, "Pausing HtspDataSource"); @@ -237,24 +249,78 @@ public void seek(long timeMs) { public void setPlaybackParams(PlaybackParams params) { Log.d(TAG, "setPlaybackParams: Speed: " + params.getSpeed()); - float speed = params.getSpeed(); + if (mDataSource != null) { + mSpeed = params.getSpeed(); + + if (mSpeed == 1.0f) { + setVolume(1.0f); + } else { + setVolume(0f); + } - if (speed > 0) { - // Forward Playback - if (mDataSource != null) { + if (mSpeed > 0) { + // Forward Playback // Convert from TIF speed format, over to TVH and ExoPlayer formats - int tvhSpeed = TvhMappings.androidSpeedToTvhSpeed(speed); - float exoSpeed = ExoPlayerUtils.androidSpeedToExoPlayerSpeed(speed); + int tvhSpeed = TvhMappings.androidSpeedToTvhSpeed(mSpeed); + float exoSpeed = ExoPlayerUtils.androidSpeedToExoPlayerSpeed(mSpeed); mDataSource.setSpeed(tvhSpeed); mExoPlayer.setPlaybackParameters(new PlaybackParameters(exoSpeed, 1)); + } else { + // Reverse Playback + rewind(); } - } else { - // Reverse Playback - Toast.makeText(mContext, "Rewind unsupported", Toast.LENGTH_SHORT).show(); } } + private void rewind() { + cancelRewind(); + + mExoPlayer.setPlayWhenReady(false); + + mRewindTimerTask = new TimerTask() { + @Override + public void run() { + mHandler.post(new Runnable() { + @Override + public void run() { + int seekSize; + + switch((int) mSpeed) { + case -2: // 2x Rewind + seekSize = -2000; + break; + case -4: // 3x Rewind + seekSize = -3000; + break; + case -12: // 4x Rewind + seekSize = -4000; + break; + case -48: // 5x Rewind + seekSize = -5000; + break; + + default: + throw new IllegalArgumentException("Unknown speed: " + mSpeed); + } + + seek(Math.max(getTimeshiftCurrentPosition() - seekSize, getTimeshiftStartPosition())); + } + }); + } + }; + + mTimer.scheduleAtFixedRate(mRewindTimerTask, 0, 1000); + } + + private void cancelRewind() { + if (mRewindTimerTask != null) { + mRewindTimerTask.cancel(); + } + + mExoPlayer.setPlayWhenReady(true); + } + private void stop() { mExoPlayer.stop(); mTrackSelector.clearSelectionOverrides(); @@ -522,7 +588,7 @@ public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray tra } } - if(hasVideoTrack) { + if (hasVideoTrack) { disableRadioInfoScreen(); } else { enableRadioInfoScreen(); diff --git a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java index 9109fa1..508d3ea 100644 --- a/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java +++ b/app/src/main/java/ie/macinnes/tvheadend/tvinput/HtspSession.java @@ -211,12 +211,6 @@ public void onTimeShiftSeekTo(long timeMs) { public void onTimeShiftSetPlaybackParams(PlaybackParams params) { Log.d(TAG, "onTimeShiftSetPlaybackParams: Speed: " + params.getSpeed()); - if (params.getSpeed() == 1) { - mTvheadendPlayer.setVolume(1.0f); - } else { - mTvheadendPlayer.setVolume(0f); - } - mTvheadendPlayer.setPlaybackParams(params); }