summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java55
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java4
2 files changed, 39 insertions, 20 deletions
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 7f2db7bef..5648024de 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
@@ -73,6 +73,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
private final PlayerLock playerLock;
private final PlayerExecutor executor;
private boolean useCallerThread = true;
+ private boolean isShutDown = false;
private CountDownLatch seekLatch;
@@ -719,32 +720,22 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
*/
@Override
public void shutdown() {
- executor.shutdown();
if (mediaPlayer != null) {
try {
- removeMediaPlayerErrorListener();
+ clearMediaPlayerListeners();
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
} catch (Exception ignore) { }
mediaPlayer.release();
+ mediaPlayer = null;
}
+ isShutDown = true;
+ executor.shutdown();
+ abandonAudioFocus();
releaseWifiLockIfNecessary();
}
- private void removeMediaPlayerErrorListener() {
- if (mediaPlayer instanceof VideoPlayer) {
- VideoPlayer vp = (VideoPlayer) mediaPlayer;
- vp.setOnErrorListener((mp, what, extra) -> true);
- } else if (mediaPlayer instanceof AudioPlayer) {
- AudioPlayer ap = (AudioPlayer) mediaPlayer;
- ap.setOnErrorListener((mediaPlayer, i, i1) -> true);
- } else if (mediaPlayer instanceof ExoPlayerWrapper) {
- ExoPlayerWrapper ap = (ExoPlayerWrapper) mediaPlayer;
- ap.setOnErrorListener(message -> { });
- }
- }
-
/**
* Releases internally used resources. This method should only be called when the object is not used anymore.
* This method is executed on an internal executor service.
@@ -864,10 +855,14 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
@Override
public void onAudioFocusChange(final int focusChange) {
+ if (isShutDown) {
+ return;
+ }
if (!PlaybackService.isRunning) {
abandonAudioFocus();
Log.d(TAG, "onAudioFocusChange: PlaybackService is no longer running");
if (focusChange == AudioManager.AUDIOFOCUS_GAIN && pausedBecauseOfTransientAudiofocusLoss) {
+ pausedBecauseOfTransientAudiofocusLoss = false;
new PlaybackServiceStarter(context, getPlayable())
.startWhenPrepared(true)
.streamIfLastWasStream()
@@ -1011,9 +1006,9 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
return stream;
}
- private IPlayer setMediaPlayerListeners(IPlayer mp) {
+ private void setMediaPlayerListeners(IPlayer mp) {
if (mp == null || media == null) {
- return mp;
+ return;
}
if (mp instanceof VideoPlayer) {
if (media.getMediaType() != MediaType.VIDEO) {
@@ -1045,7 +1040,31 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
} else {
Log.w(TAG, "Unknown media player: " + mp);
}
- return mp;
+ }
+
+ private void clearMediaPlayerListeners() {
+ if (mediaPlayer instanceof VideoPlayer) {
+ VideoPlayer vp = (VideoPlayer) mediaPlayer;
+ vp.setOnCompletionListener(x -> { });
+ vp.setOnSeekCompleteListener(x -> { });
+ vp.setOnErrorListener((mediaPlayer, i, i1) -> false);
+ vp.setOnBufferingUpdateListener((mediaPlayer, i) -> { });
+ vp.setOnInfoListener((mediaPlayer, i, i1) -> false);
+ } else if (mediaPlayer instanceof AudioPlayer) {
+ AudioPlayer ap = (AudioPlayer) mediaPlayer;
+ ap.setOnCompletionListener(x -> { });
+ ap.setOnSeekCompleteListener(x -> { });
+ ap.setOnErrorListener((x, y, z) -> false);
+ ap.setOnBufferingUpdateListener((arg0, percent) -> { });
+ ap.setOnInfoListener((arg0, what, extra) -> false);
+ } else if (mediaPlayer instanceof ExoPlayerWrapper) {
+ ExoPlayerWrapper ap = (ExoPlayerWrapper) mediaPlayer;
+ ap.setOnCompletionListener(x -> { });
+ ap.setOnSeekCompleteListener(x -> { });
+ ap.setOnBufferingUpdateListener((arg0, percent) -> { });
+ ap.setOnErrorListener(x -> { });
+ ap.setOnInfoListener((arg0, what, extra) -> false);
+ }
}
private final MediaPlayer.OnCompletionListener audioCompletionListener =
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java
index 7ddb65c8e..9ca7b6647 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java
@@ -350,10 +350,10 @@ public class PlaybackServiceTaskManager {
* Cancels all tasks and shuts down the internal executor service of the PSTM. The object should not be used after
* execution of this method.
*/
- public synchronized void shutdown() {
+ public void shutdown() {
EventBus.getDefault().unregister(this);
cancelAllTasks();
- schedExecutor.shutdown();
+ schedExecutor.shutdownNow();
}
private Runnable useMainThreadIfNecessary(Runnable runnable) {