summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Lajos Molnar <lajos@google.com> 2013-09-06 06:30:35 -0700
committer Lajos Molnar <lajos@google.com> 2013-09-06 08:53:20 -0700
commita67a4439cacdaa04cb53566b77053694b26d06ad (patch)
tree0a45795990fd452e65e62192f44f8a224fed7b5f
parentf96b104a7f6e4c2a8883b6d4de69e6de24aa8edc (diff)
MediaPlayer.MTP: fix issue when main thread had no looper
We fall back to using the application's main looper similarly to MP, and even create our own looper if MP was created outside of an application context. Always creating our own looper is a waste of resources. Also resolved issue with MP.reset() when created outside of an application context, and removed MP.MTP's unused getHandler(). Change-Id: I9c3b8a2f05a9e231ae9c008bc1a48d6b991cec1d Signed-off-by: Lajos Molnar <lajos@google.com> Bug: 10634238
-rw-r--r--media/java/android/media/MediaPlayer.java51
1 files changed, 42 insertions, 9 deletions
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index d286be417c9e..ce1896a3b648 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -1351,8 +1351,10 @@ public class MediaPlayer implements SubtitleController.Listener
mOnInfoListener = null;
mOnVideoSizeChangedListener = null;
mOnTimedTextListener = null;
- mTimeProvider.close();
- mTimeProvider = null;
+ if (mTimeProvider != null) {
+ mTimeProvider.close();
+ mTimeProvider = null;
+ }
mOnSubtitleDataListener = null;
_release();
}
@@ -1380,11 +1382,17 @@ public class MediaPlayer implements SubtitleController.Listener
if (mSubtitleController != null) {
mSubtitleController.reset();
}
+ if (mTimeProvider != null) {
+ mTimeProvider.close();
+ mTimeProvider = null;
+ }
stayAwake(false);
_reset();
// make sure none of the listeners get called anymore
- mEventHandler.removeCallbacksAndMessages(null);
+ if (mEventHandler != null) {
+ mEventHandler.removeCallbacksAndMessages(null);
+ }
disableProxyListener();
}
@@ -2121,6 +2129,9 @@ public class MediaPlayer implements SubtitleController.Listener
/** @hide */
public MediaTimeProvider getMediaTimeProvider() {
+ if (mTimeProvider == null) {
+ mTimeProvider = new TimeProvider(this);
+ }
return mTimeProvider;
}
@@ -2761,6 +2772,7 @@ public class MediaPlayer implements SubtitleController.Listener
private static final int REFRESH_AND_NOTIFY_TIME = 1;
private static final int NOTIFY_STOP = 2;
private static final int NOTIFY_SEEK = 3;
+ private HandlerThread mHandlerThread;
/** @hide */
public boolean DEBUG = false;
@@ -2773,7 +2785,18 @@ public class MediaPlayer implements SubtitleController.Listener
// we assume starting position
mRefresh = true;
}
- mEventHandler = new EventHandler();
+
+ Looper looper;
+ if ((looper = Looper.myLooper()) == null &&
+ (looper = Looper.getMainLooper()) == null) {
+ // Create our own looper here in case MP was created without one
+ mHandlerThread = new HandlerThread("MediaPlayerMTPEventThread",
+ Process.THREAD_PRIORITY_FOREGROUND);
+ mHandlerThread.start();
+ looper = mHandlerThread.getLooper();
+ }
+ mEventHandler = new EventHandler(looper);
+
mListeners = new MediaTimeProvider.OnMediaTimeListener[0];
mTimes = new long[0];
mLastTimeUs = 0;
@@ -2790,6 +2813,17 @@ public class MediaPlayer implements SubtitleController.Listener
/** @hide */
public void close() {
mEventHandler.removeMessages(NOTIFY);
+ if (mHandlerThread != null) {
+ mHandlerThread.quitSafely();
+ mHandlerThread = null;
+ }
+ }
+
+ /** @hide */
+ protected void finalize() {
+ if (mHandlerThread != null) {
+ mHandlerThread.quitSafely();
+ }
}
/** @hide */
@@ -3055,6 +3089,10 @@ public class MediaPlayer implements SubtitleController.Listener
}
private class EventHandler extends Handler {
+ public EventHandler(Looper looper) {
+ super(looper);
+ }
+
@Override
public void handleMessage(Message msg) {
if (msg.what == NOTIFY) {
@@ -3075,10 +3113,5 @@ public class MediaPlayer implements SubtitleController.Listener
}
}
}
-
- /** @hide */
- public Handler getHandler() {
- return mEventHandler;
- }
}
}