jWakeLock
replace native binder with java PowerManager in JWakeLock
Test: MediaPlayer2Test
Bug: 122470692
Change-Id: I488758892d225ca31defbe3d96ebf68a57dc9e35
diff --git a/media/libmediaplayer2/nuplayer2/JWakeLock.cpp b/media/libmediaplayer2/nuplayer2/JWakeLock.cpp
index c9a1071..983d77e 100644
--- a/media/libmediaplayer2/nuplayer2/JWakeLock.cpp
+++ b/media/libmediaplayer2/nuplayer2/JWakeLock.cpp
@@ -20,55 +20,50 @@
#include "JWakeLock.h"
-#include <binder/IPCThreadState.h>
-#include <binder/IServiceManager.h>
#include <media/stagefright/foundation/ADebug.h>
-#include <powermanager/PowerManager.h>
-
namespace android {
-//TODO: use JAVA PowerManager, instead of binder
-JWakeLock::JWakeLock() :
- mPowerManager(NULL),
- mWakeLockToken(NULL),
+JWakeLock::JWakeLock(const sp<JObjectHolder> &context) :
mWakeLockCount(0),
- mDeathRecipient(new PMDeathRecipient(this)) {}
+ mWakeLock(NULL),
+ mContext(context) {}
JWakeLock::~JWakeLock() {
- if (mPowerManager != NULL) {
- sp<IBinder> binder = IInterface::asBinder(mPowerManager);
- binder->unlinkToDeath(mDeathRecipient);
- }
- clearPowerManager();
+ clearJavaWakeLock();
}
bool JWakeLock::acquire() {
if (mWakeLockCount == 0) {
- CHECK(mWakeLockToken == NULL);
- if (mPowerManager == NULL) {
- // use checkService() to avoid blocking if power service is not up yet
- sp<IBinder> binder =
- defaultServiceManager()->checkService(String16("power"));
- if (binder == NULL) {
- ALOGW("could not get the power manager service");
- } else {
- mPowerManager = interface_cast<IPowerManager>(binder);
- binder->linkToDeath(mDeathRecipient);
- }
+ if (mWakeLock == NULL) {
+ JNIEnv *env = JavaVMHelper::getJNIEnv();
+ jclass jContextCls = env->FindClass("android/content/Context");
+ jclass jPowerManagerCls = env->FindClass("android/os/PowerManager");
+
+ jmethodID jGetSystemService = env->GetMethodID(jContextCls,
+ "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
+ jobject javaPowerManagerObj = env->CallObjectMethod(mContext->getJObject(),
+ jGetSystemService, env->NewStringUTF("power"));
+
+ jfieldID jPARTIAL_WAKE_LOCK = env->GetStaticFieldID(jPowerManagerCls,
+ "PARTIAL_WAKE_LOCK", "I");
+ jint PARTIAL_WAKE_LOCK = env->GetStaticIntField(jPowerManagerCls, jPARTIAL_WAKE_LOCK);
+
+ jmethodID jNewWakeLock = env->GetMethodID(jPowerManagerCls,
+ "newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;");
+ jobject javaWakeLock = env->CallObjectMethod(javaPowerManagerObj,
+ jNewWakeLock, PARTIAL_WAKE_LOCK, env->NewStringUTF("JWakeLock"));
+ mWakeLock = new JObjectHolder(javaWakeLock);
+ env->DeleteLocalRef(javaPowerManagerObj);
+ env->DeleteLocalRef(javaWakeLock);
}
- if (mPowerManager != NULL) {
- sp<IBinder> binder = new BBinder();
- int64_t token = IPCThreadState::self()->clearCallingIdentity();
- status_t status = mPowerManager->acquireWakeLock(
- POWERMANAGER_PARTIAL_WAKE_LOCK,
- binder, String16("JWakeLock"), String16("media"));
- IPCThreadState::self()->restoreCallingIdentity(token);
- if (status == NO_ERROR) {
- mWakeLockToken = binder;
- mWakeLockCount++;
- return true;
- }
+ if (mWakeLock != NULL) {
+ JNIEnv *env = JavaVMHelper::getJNIEnv();
+ jclass wakeLockCls = env->FindClass("android/os/PowerManager$WakeLock");
+ jmethodID jAcquire = env->GetMethodID(wakeLockCls, "acquire", "()V");
+ env->CallVoidMethod(mWakeLock->getJObject(), jAcquire);
+ mWakeLockCount++;
+ return true;
}
} else {
mWakeLockCount++;
@@ -86,25 +81,17 @@
mWakeLockCount = 1;
}
if (--mWakeLockCount == 0) {
- CHECK(mWakeLockToken != NULL);
- if (mPowerManager != NULL) {
- int64_t token = IPCThreadState::self()->clearCallingIdentity();
- mPowerManager->releaseWakeLock(mWakeLockToken, 0 /* flags */);
- IPCThreadState::self()->restoreCallingIdentity(token);
+ if (mWakeLock != NULL) {
+ JNIEnv *env = JavaVMHelper::getJNIEnv();
+ jclass wakeLockCls = env->FindClass("android/os/PowerManager$WakeLock");
+ jmethodID jRelease = env->GetMethodID(wakeLockCls, "release", "()V");
+ env->CallVoidMethod(mWakeLock->getJObject(), jRelease);
}
- mWakeLockToken.clear();
}
}
-void JWakeLock::clearPowerManager() {
+void JWakeLock::clearJavaWakeLock() {
release(true);
- mPowerManager.clear();
-}
-
-void JWakeLock::PMDeathRecipient::binderDied(const wp<IBinder>& who __unused) {
- if (mWakeLock != NULL) {
- mWakeLock->clearPowerManager();
- }
}
} // namespace android
diff --git a/media/libmediaplayer2/nuplayer2/JWakeLock.h b/media/libmediaplayer2/nuplayer2/JWakeLock.h
index eace87e..36c542e 100644
--- a/media/libmediaplayer2/nuplayer2/JWakeLock.h
+++ b/media/libmediaplayer2/nuplayer2/JWakeLock.h
@@ -18,7 +18,7 @@
#define J_WAKELOCK_H_
#include <media/stagefright/foundation/ABase.h>
-#include <powermanager/IPowerManager.h>
+#include <mediaplayer2/JObjectHolder.h>
#include <utils/RefBase.h>
namespace android {
@@ -26,7 +26,7 @@
class JWakeLock : public RefBase {
public:
- JWakeLock();
+ JWakeLock(const sp<JObjectHolder> &context);
// NOTE: acquire and release are not thread safe
@@ -37,28 +37,11 @@
virtual ~JWakeLock();
private:
- sp<IPowerManager> mPowerManager;
- sp<IBinder> mWakeLockToken;
- uint32_t mWakeLockCount;
+ uint32_t mWakeLockCount;
+ sp<JObjectHolder> mWakeLock;
+ const sp<JObjectHolder> mContext;
- class PMDeathRecipient : public IBinder::DeathRecipient {
- public:
- explicit PMDeathRecipient(JWakeLock *wakeLock) : mWakeLock(wakeLock) {}
- virtual ~PMDeathRecipient() {}
-
- // IBinder::DeathRecipient
- virtual void binderDied(const wp<IBinder> &who);
-
- private:
- PMDeathRecipient(const PMDeathRecipient&);
- PMDeathRecipient& operator= (const PMDeathRecipient&);
-
- JWakeLock *mWakeLock;
- };
-
- const sp<PMDeathRecipient> mDeathRecipient;
-
- void clearPowerManager();
+ void clearJavaWakeLock();
DISALLOW_EVIL_CONSTRUCTORS(JWakeLock);
};
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
index 080d923..5da6e24 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
@@ -209,7 +209,8 @@
////////////////////////////////////////////////////////////////////////////////
-NuPlayer2::NuPlayer2(pid_t pid, uid_t uid, const sp<MediaClock> &mediaClock)
+NuPlayer2::NuPlayer2(
+ pid_t pid, uid_t uid, const sp<MediaClock> &mediaClock, const sp<JObjectHolder> &context)
: mPID(pid),
mUID(uid),
mMediaClock(mediaClock),
@@ -240,7 +241,8 @@
mVideoDecoderError(false),
mPaused(false),
mPausedByClient(true),
- mPausedForBuffering(false) {
+ mPausedForBuffering(false),
+ mContext(context) {
CHECK(mediaClock != NULL);
clearFlushComplete();
}
@@ -1738,7 +1740,7 @@
sp<AMessage> notify = new AMessage(kWhatRendererNotify, this);
++mRendererGeneration;
notify->setInt32("generation", mRendererGeneration);
- mRenderer = new Renderer(mAudioSink, mMediaClock, notify, flags);
+ mRenderer = new Renderer(mAudioSink, mMediaClock, notify, mContext, flags);
mRendererLooper = new ALooper;
mRendererLooper->setName("NuPlayer2Renderer");
mRendererLooper->start(false, true, ANDROID_PRIORITY_AUDIO);
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2.h b/media/libmediaplayer2/nuplayer2/NuPlayer2.h
index fdc128f..798c725 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2.h
@@ -22,6 +22,7 @@
#include <media/stagefright/foundation/AHandler.h>
#include <mediaplayer2/MediaPlayer2Interface.h>
+#include <mediaplayer2/JObjectHolder.h>
#include "mediaplayer2.pb.h"
@@ -42,7 +43,8 @@
struct NuPlayer2Driver;
struct NuPlayer2 : public AHandler {
- explicit NuPlayer2(pid_t pid, uid_t uid, const sp<MediaClock> &mediaClock);
+ explicit NuPlayer2(pid_t pid, uid_t uid,
+ const sp<MediaClock> &mediaClock, const sp<JObjectHolder> &context);
void setDriver(const wp<NuPlayer2Driver> &driver);
@@ -272,6 +274,9 @@
// Pause state as requested by source (internally) due to buffering
bool mPausedForBuffering;
+ // Passed from JAVA
+ const sp<JObjectHolder> mContext;
+
inline const sp<DecoderBase> &getDecoder(bool audio) {
return audio ? mAudioDecoder : mVideoDecoder;
}
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
index 3c11b17..56e9471 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
@@ -108,7 +108,7 @@
static const char *kPlayerRebufferingAtExit = "android.media.mediaplayer.rebufferExit";
-NuPlayer2Driver::NuPlayer2Driver(pid_t pid, uid_t uid)
+NuPlayer2Driver::NuPlayer2Driver(pid_t pid, uid_t uid, const sp<JObjectHolder> &context)
: mState(STATE_IDLE),
mAsyncResult(UNKNOWN_ERROR),
mSrcId(0),
@@ -123,7 +123,7 @@
mLooper(new ALooper),
mNuPlayer2Looper(new ALooper),
mMediaClock(new MediaClock),
- mPlayer(new NuPlayer2(pid, uid, mMediaClock)),
+ mPlayer(new NuPlayer2(pid, uid, mMediaClock, context)),
mPlayerFlags(0),
mAnalyticsItem(NULL),
mClientUid(uid),
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
index fe17d03..0ec3a4b 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
@@ -18,6 +18,7 @@
#include <media/MediaAnalyticsItem.h>
#include <media/stagefright/foundation/ABase.h>
+#include <mediaplayer2/JObjectHolder.h>
namespace android {
@@ -26,7 +27,7 @@
struct NuPlayer2;
struct NuPlayer2Driver : public MediaPlayer2Interface {
- explicit NuPlayer2Driver(pid_t pid, uid_t uid);
+ explicit NuPlayer2Driver(pid_t pid, uid_t uid, const sp<JObjectHolder> &context);
virtual status_t initCheck() override;
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Renderer.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2Renderer.cpp
index 2881fd4..3be7e36 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Renderer.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Renderer.cpp
@@ -106,6 +106,7 @@
const sp<MediaPlayer2Interface::AudioSink> &sink,
const sp<MediaClock> &mediaClock,
const sp<AMessage> ¬ify,
+ const sp<JObjectHolder> &context,
uint32_t flags)
: mAudioSink(sink),
mUseVirtualAudioSink(false),
@@ -147,7 +148,7 @@
mTotalBuffersQueued(0),
mLastAudioBufferDrained(0),
mUseAudioCallback(false),
- mWakeLock(new JWakeLock()) {
+ mWakeLock(new JWakeLock(context)) {
CHECK(mediaClock != NULL);
mMediaClock->setPlaybackRate(mPlaybackSettings.mSpeed);
}
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Renderer.h b/media/libmediaplayer2/nuplayer2/NuPlayer2Renderer.h
index 484d9b7..d065dee 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Renderer.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Renderer.h
@@ -20,6 +20,7 @@
#include <media/AudioResamplerPublic.h>
#include <media/AVSyncSettings.h>
+#include <mediaplayer2/JObjectHolder.h>
#include "NuPlayer2.h"
@@ -38,6 +39,7 @@
Renderer(const sp<MediaPlayer2Interface::AudioSink> &sink,
const sp<MediaClock> &mediaClock,
const sp<AMessage> ¬ify,
+ const sp<JObjectHolder> &context,
uint32_t flags = 0);
static size_t AudioSinkCallback(