From d50dcac96e223f48a218093007130eb7fd5ca0c2 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sat, 21 Apr 2018 17:58:14 +0200 Subject: Added ExoPlayer setting --- .../de/danoeh/antennapod/core/UpdateManager.java | 2 +- .../core/preferences/UserPreferences.java | 14 +- .../core/service/playback/ExoPlayer.java | 300 --------------------- .../core/service/playback/ExoPlayerWrapper.java | 300 +++++++++++++++++++++ .../core/service/playback/LocalPSMP.java | 29 +- .../antennapod/core/util/playback/AudioPlayer.java | 2 +- 6 files changed, 332 insertions(+), 315 deletions(-) delete mode 100644 core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayer.java create mode 100644 core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java (limited to 'core/src/main/java/de/danoeh/antennapod') diff --git a/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java index 96e3a77be..f7db11af6 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java +++ b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java @@ -89,7 +89,7 @@ class UpdateManager { } if(oldVersionCode < 1050004) { if(MediaPlayer.isPrestoLibraryInstalled(context) && Build.VERSION.SDK_INT >= 16) { - UserPreferences.enableSonic(true); + UserPreferences.enableSonic(); } } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java index 743ee135d..420288c14 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java @@ -103,6 +103,7 @@ public class UserPreferences { public static final String PREF_IMAGE_CACHE_SIZE = "prefImageCacheSize"; // Mediaplayer + public static final String PREF_MEDIA_PLAYER = "prefMediaPlayer"; private static final String PREF_PLAYBACK_SPEED = "prefPlaybackSpeed"; private static final String PREF_FAST_FORWARD_SECS = "prefFastForwardSecs"; private static final String PREF_REWIND_SECS = "prefRewindSecs"; @@ -113,7 +114,6 @@ public class UserPreferences { private static final String PREF_RIGHT_VOLUME = "prefRightVolume"; // Experimental - public static final String PREF_SONIC = "prefSonic"; private static final String PREF_STEREO_TO_MONO = "PrefStereoToMono"; public static final String PREF_NORMALIZER = "prefNormalizer"; public static final String PREF_CAST_ENABLED = "prefCast"; //Used for enabling Chromecast support @@ -642,13 +642,15 @@ public class UserPreferences { } public static boolean useSonic() { - return prefs.getBoolean(PREF_SONIC, false); + return prefs.getString(PREF_MEDIA_PLAYER, "sonic").equals("sonic"); } - public static void enableSonic(boolean enable) { - prefs.edit() - .putBoolean(PREF_SONIC, enable) - .apply(); + public static boolean useExoplayer() { + return prefs.getString(PREF_MEDIA_PLAYER, "sonic").equals("exoplayer"); + } + + public static void enableSonic() { + prefs.edit().putString(PREF_MEDIA_PLAYER, "sonic").apply(); } public static boolean stereoToMono() { diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayer.java deleted file mode 100644 index 8b4678cb2..000000000 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayer.java +++ /dev/null @@ -1,300 +0,0 @@ -package de.danoeh.antennapod.core.service.playback; - -import android.content.Context; -import android.net.Uri; -import android.view.SurfaceHolder; -import com.google.android.exoplayer2.DefaultLoadControl; -import com.google.android.exoplayer2.DefaultRenderersFactory; -import com.google.android.exoplayer2.ExoPlaybackException; -import com.google.android.exoplayer2.ExoPlayerFactory; -import com.google.android.exoplayer2.PlaybackParameters; -import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SeekParameters; -import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.Timeline; -import com.google.android.exoplayer2.audio.AudioAttributes; -import com.google.android.exoplayer2.source.ExtractorMediaSource; -import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.source.TrackGroupArray; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; -import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; -import com.google.android.exoplayer2.util.Util; -import de.danoeh.antennapod.core.util.playback.IPlayer; -import org.antennapod.audio.MediaPlayer; - - -public class ExoPlayer implements IPlayer { - private final Context mContext; - private SimpleExoPlayer mExoPlayer; - private MediaSource mediaSource; - private MediaPlayer.OnSeekCompleteListener audioSeekCompleteListener; - private MediaPlayer.OnCompletionListener audioCompletionListener; - private MediaPlayer.OnErrorListener audioErrorListener; - - ExoPlayer(Context context) { - mContext = context; - mExoPlayer = createPlayer(); - } - - private SimpleExoPlayer createPlayer() { - SimpleExoPlayer p = ExoPlayerFactory.newSimpleInstance(new DefaultRenderersFactory(mContext), - new DefaultTrackSelector(), new DefaultLoadControl()); - p.setSeekParameters(SeekParameters.PREVIOUS_SYNC); - p.addListener(new Player.EventListener() { - @Override - public void onTimelineChanged(Timeline timeline, Object manifest, int reason) { - - } - - @Override - public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { - - } - - @Override - public void onLoadingChanged(boolean isLoading) { - - } - - @Override - public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { - if (playbackState == Player.STATE_ENDED) { - audioCompletionListener.onCompletion(null); - } - } - - @Override - public void onRepeatModeChanged(int repeatMode) { - - } - - @Override - public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { - - } - - @Override - public void onPlayerError(ExoPlaybackException error) { - audioErrorListener.onError(null, 0, 0); - } - - @Override - public void onPositionDiscontinuity(int reason) { - - } - - @Override - public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { - - } - - @Override - public void onSeekProcessed() { - - } - }); - return p; - } - - @Override - public boolean canSetPitch() { - return true; - } - - @Override - public boolean canSetSpeed() { - return true; - } - - @Override - public boolean canDownmix() { - return false; - } - - @Override - public float getCurrentPitchStepsAdjustment() { - return 0; - } - - @Override - public int getCurrentPosition() { - return (int) mExoPlayer.getCurrentPosition(); - } - - @Override - public float getCurrentSpeedMultiplier() { - return 0; - } - - @Override - public int getDuration() { - return (int) mExoPlayer.getDuration(); - } - - @Override - public float getMaxSpeedMultiplier() { - return 0; - } - - @Override - public float getMinSpeedMultiplier() { - return 0; - } - - @Override - public boolean isLooping() { - return mExoPlayer.getRepeatMode() == Player.REPEAT_MODE_ONE; - } - - @Override - public boolean isPlaying() { - return mExoPlayer.getPlayWhenReady(); - } - - @Override - public void pause() { - mExoPlayer.setPlayWhenReady(false); - } - - @Override - public void prepare() throws IllegalStateException { - mExoPlayer.prepare(mediaSource); - } - - @Override - public void prepareAsync() { - mExoPlayer.prepare(mediaSource); - } - - @Override - public void release() { - if (mExoPlayer != null) { - mExoPlayer.release(); - } - } - - @Override - public void reset() { - mExoPlayer.release(); - mExoPlayer = createPlayer(); - } - - @Override - public void seekTo(int i) throws IllegalStateException { - mExoPlayer.seekTo(i); - audioSeekCompleteListener.onSeekComplete(null); - } - - @Override - public void setAudioStreamType(int i) { - AudioAttributes a = mExoPlayer.getAudioAttributes(); - AudioAttributes.Builder b = new AudioAttributes.Builder(); - b.setContentType(i); - b.setFlags(a.flags); - b.setUsage(a.usage); - mExoPlayer.setAudioAttributes(b.build()); - } - - @Override - public void setScreenOnWhilePlaying(boolean screenOn) { - - } - - @Override - public void setDataSource(String s) throws IllegalArgumentException, IllegalStateException { - DataSource.Factory dataSourceFactory = - new DefaultDataSourceFactory(mContext, Util.getUserAgent(mContext, mContext.getPackageName()), null); - ExtractorMediaSource.Factory f = new ExtractorMediaSource.Factory(dataSourceFactory); - mediaSource = f.createMediaSource(Uri.parse(s)); - } - - @Override - public void setDisplay(SurfaceHolder sh) { - mExoPlayer.setVideoSurfaceHolder(sh); - } - - @Override - public void setEnableSpeedAdjustment(boolean b) { - - } - - @Override - public void setLooping(boolean b) { - mExoPlayer.setRepeatMode(b ? Player.REPEAT_MODE_ONE : Player.REPEAT_MODE_OFF); - } - - @Override - public void setPitchStepsAdjustment(float v) { - - } - - @Override - public void setPlaybackPitch(float v) { - PlaybackParameters params = mExoPlayer.getPlaybackParameters(); - mExoPlayer.setPlaybackParameters(new PlaybackParameters(params.speed, v)); - } - - @Override - public void setPlaybackSpeed(float v) { - PlaybackParameters params = mExoPlayer.getPlaybackParameters(); - mExoPlayer.setPlaybackParameters(new PlaybackParameters(v, params.pitch)); - } - - @Override - public void setDownmix(boolean b) { - - } - - @Override - public void setVolume(float v, float v1) { - mExoPlayer.setVolume(v); - } - - @Override - public void setWakeMode(Context context, int i) { - - } - - @Override - public void start() { - mExoPlayer.setPlayWhenReady(true); - } - - @Override - public void stop() { - mExoPlayer.stop(); - } - - @Override - public void setVideoScalingMode(int mode) { - mExoPlayer.setVideoScalingMode(mode); - } - - void setOnCompletionListener(MediaPlayer.OnCompletionListener audioCompletionListener) { - this.audioCompletionListener = audioCompletionListener; - } - - void setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener audioSeekCompleteListener) { - this.audioSeekCompleteListener = audioSeekCompleteListener; - } - - void setOnErrorListener(MediaPlayer.OnErrorListener audioErrorListener) { - this.audioErrorListener = audioErrorListener; - } - - int getVideoWidth() { - if (mExoPlayer.getVideoFormat() == null) { - return 0; - } - return mExoPlayer.getVideoFormat().width; - } - - int getVideoHeight() { - if (mExoPlayer.getVideoFormat() == null) { - return 0; - } - return mExoPlayer.getVideoFormat().height; - } -} 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 new file mode 100644 index 000000000..1d233ff0c --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java @@ -0,0 +1,300 @@ +package de.danoeh.antennapod.core.service.playback; + +import android.content.Context; +import android.net.Uri; +import android.view.SurfaceHolder; +import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.DefaultRenderersFactory; +import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.ExoPlayerFactory; +import com.google.android.exoplayer2.PlaybackParameters; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.SeekParameters; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.audio.AudioAttributes; +import com.google.android.exoplayer2.source.ExtractorMediaSource; +import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; +import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.util.Util; +import de.danoeh.antennapod.core.util.playback.IPlayer; +import org.antennapod.audio.MediaPlayer; + + +public class ExoPlayerWrapper implements IPlayer { + private final Context mContext; + private SimpleExoPlayer mExoPlayer; + private MediaSource mediaSource; + private MediaPlayer.OnSeekCompleteListener audioSeekCompleteListener; + private MediaPlayer.OnCompletionListener audioCompletionListener; + private MediaPlayer.OnErrorListener audioErrorListener; + + ExoPlayerWrapper(Context context) { + mContext = context; + mExoPlayer = createPlayer(); + } + + private SimpleExoPlayer createPlayer() { + SimpleExoPlayer p = ExoPlayerFactory.newSimpleInstance(new DefaultRenderersFactory(mContext), + new DefaultTrackSelector(), new DefaultLoadControl()); + p.setSeekParameters(SeekParameters.PREVIOUS_SYNC); + p.addListener(new Player.EventListener() { + @Override + public void onTimelineChanged(Timeline timeline, Object manifest, int reason) { + + } + + @Override + public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { + + } + + @Override + public void onLoadingChanged(boolean isLoading) { + + } + + @Override + public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { + if (playbackState == Player.STATE_ENDED) { + audioCompletionListener.onCompletion(null); + } + } + + @Override + public void onRepeatModeChanged(int repeatMode) { + + } + + @Override + public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { + + } + + @Override + public void onPlayerError(ExoPlaybackException error) { + audioErrorListener.onError(null, 0, 0); + } + + @Override + public void onPositionDiscontinuity(int reason) { + + } + + @Override + public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { + + } + + @Override + public void onSeekProcessed() { + + } + }); + return p; + } + + @Override + public boolean canSetPitch() { + return true; + } + + @Override + public boolean canSetSpeed() { + return true; + } + + @Override + public boolean canDownmix() { + return false; + } + + @Override + public float getCurrentPitchStepsAdjustment() { + return 0; + } + + @Override + public int getCurrentPosition() { + return (int) mExoPlayer.getCurrentPosition(); + } + + @Override + public float getCurrentSpeedMultiplier() { + return 0; + } + + @Override + public int getDuration() { + return (int) mExoPlayer.getDuration(); + } + + @Override + public float getMaxSpeedMultiplier() { + return 0; + } + + @Override + public float getMinSpeedMultiplier() { + return 0; + } + + @Override + public boolean isLooping() { + return mExoPlayer.getRepeatMode() == Player.REPEAT_MODE_ONE; + } + + @Override + public boolean isPlaying() { + return mExoPlayer.getPlayWhenReady(); + } + + @Override + public void pause() { + mExoPlayer.setPlayWhenReady(false); + } + + @Override + public void prepare() throws IllegalStateException { + mExoPlayer.prepare(mediaSource); + } + + @Override + public void prepareAsync() { + mExoPlayer.prepare(mediaSource); + } + + @Override + public void release() { + if (mExoPlayer != null) { + mExoPlayer.release(); + } + } + + @Override + public void reset() { + mExoPlayer.release(); + mExoPlayer = createPlayer(); + } + + @Override + public void seekTo(int i) throws IllegalStateException { + mExoPlayer.seekTo(i); + audioSeekCompleteListener.onSeekComplete(null); + } + + @Override + public void setAudioStreamType(int i) { + AudioAttributes a = mExoPlayer.getAudioAttributes(); + AudioAttributes.Builder b = new AudioAttributes.Builder(); + b.setContentType(i); + b.setFlags(a.flags); + b.setUsage(a.usage); + mExoPlayer.setAudioAttributes(b.build()); + } + + @Override + public void setScreenOnWhilePlaying(boolean screenOn) { + + } + + @Override + public void setDataSource(String s) throws IllegalArgumentException, IllegalStateException { + DataSource.Factory dataSourceFactory = + new DefaultDataSourceFactory(mContext, Util.getUserAgent(mContext, mContext.getPackageName()), null); + ExtractorMediaSource.Factory f = new ExtractorMediaSource.Factory(dataSourceFactory); + mediaSource = f.createMediaSource(Uri.parse(s)); + } + + @Override + public void setDisplay(SurfaceHolder sh) { + mExoPlayer.setVideoSurfaceHolder(sh); + } + + @Override + public void setEnableSpeedAdjustment(boolean b) { + + } + + @Override + public void setLooping(boolean b) { + mExoPlayer.setRepeatMode(b ? Player.REPEAT_MODE_ONE : Player.REPEAT_MODE_OFF); + } + + @Override + public void setPitchStepsAdjustment(float v) { + + } + + @Override + public void setPlaybackPitch(float v) { + PlaybackParameters params = mExoPlayer.getPlaybackParameters(); + mExoPlayer.setPlaybackParameters(new PlaybackParameters(params.speed, v)); + } + + @Override + public void setPlaybackSpeed(float v) { + PlaybackParameters params = mExoPlayer.getPlaybackParameters(); + mExoPlayer.setPlaybackParameters(new PlaybackParameters(v, params.pitch)); + } + + @Override + public void setDownmix(boolean b) { + + } + + @Override + public void setVolume(float v, float v1) { + mExoPlayer.setVolume(v); + } + + @Override + public void setWakeMode(Context context, int i) { + + } + + @Override + public void start() { + mExoPlayer.setPlayWhenReady(true); + } + + @Override + public void stop() { + mExoPlayer.stop(); + } + + @Override + public void setVideoScalingMode(int mode) { + mExoPlayer.setVideoScalingMode(mode); + } + + void setOnCompletionListener(MediaPlayer.OnCompletionListener audioCompletionListener) { + this.audioCompletionListener = audioCompletionListener; + } + + void setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener audioSeekCompleteListener) { + this.audioSeekCompleteListener = audioSeekCompleteListener; + } + + void setOnErrorListener(MediaPlayer.OnErrorListener audioErrorListener) { + this.audioErrorListener = audioErrorListener; + } + + int getVideoWidth() { + if (mExoPlayer.getVideoFormat() == null) { + return 0; + } + return mExoPlayer.getVideoFormat().width; + } + + int getVideoHeight() { + if (mExoPlayer.getVideoFormat() == null) { + return 0; + } + return mExoPlayer.getVideoFormat().height; + } +} 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 ce8993cbd..7abcc413b 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 @@ -313,8 +313,11 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { Log.d(TAG, "Resource prepared"); - if (mediaType == MediaType.VIDEO) { - ExoPlayer vp = (ExoPlayer) mediaPlayer; + if (mediaType == MediaType.VIDEO && mediaPlayer instanceof ExoPlayerWrapper) { + ExoPlayerWrapper vp = (ExoPlayerWrapper) mediaPlayer; + videoSize = new Pair<>(vp.getVideoWidth(), vp.getVideoHeight()); + } else if(mediaType == MediaType.VIDEO && mediaPlayer instanceof VideoPlayer) { + VideoPlayer vp = (VideoPlayer) mediaPlayer; videoSize = new Pair<>(vp.getVideoWidth(), vp.getVideoHeight()); } @@ -666,8 +669,12 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { Pair res; if (mediaPlayer == null || playerStatus == PlayerStatus.ERROR || mediaType != MediaType.VIDEO) { res = null; + } else if (mediaPlayer instanceof ExoPlayerWrapper) { + ExoPlayerWrapper vp = (ExoPlayerWrapper) mediaPlayer; + videoSize = new Pair<>(vp.getVideoWidth(), vp.getVideoHeight()); + res = videoSize; } else { - ExoPlayer vp = (ExoPlayer) mediaPlayer; + VideoPlayer vp = (VideoPlayer) mediaPlayer; videoSize = new Pair<>(vp.getVideoWidth(), vp.getVideoHeight()); res = videoSize; } @@ -695,11 +702,19 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { if (mediaPlayer != null) { mediaPlayer.release(); } - if(media == null) { + if (media == null) { mediaPlayer = null; return; } - mediaPlayer = new ExoPlayer(context); + + if (UserPreferences.useExoplayer()) { + mediaPlayer = new ExoPlayerWrapper(context); + } else if (media.getMediaType() == MediaType.VIDEO) { + mediaPlayer = new VideoPlayer(); + } else { + mediaPlayer = new AudioPlayer(context); + } + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK); setMediaPlayerListeners(mediaPlayer); @@ -876,8 +891,8 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { ap.setOnBufferingUpdateListener(audioBufferingUpdateListener); ap.setOnInfoListener(audioInfoListener); ap.setOnSpeedAdjustmentAvailableChangedListener(audioSetSpeedAbilityListener); - } else if (mp instanceof ExoPlayer) { - ExoPlayer ap = (ExoPlayer) mp; + } else if (mp instanceof ExoPlayerWrapper) { + ExoPlayerWrapper ap = (ExoPlayerWrapper) mp; ap.setOnCompletionListener(audioCompletionListener); ap.setOnSeekCompleteListener(audioSeekCompleteListener); ap.setOnErrorListener(audioErrorListener); diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java index 846733882..a1530e808 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java @@ -21,7 +21,7 @@ public class AudioPlayer extends MediaPlayer implements IPlayer { private final SharedPreferences.OnSharedPreferenceChangeListener sonicListener = (sharedPreferences, key) -> { - if (key.equals(UserPreferences.PREF_SONIC)) { + if (key.equals(UserPreferences.PREF_MEDIA_PLAYER)) { checkMpi(); } }; -- cgit v1.2.3