Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 04a6a019 authored by Dichen Zhang's avatar Dichen Zhang Committed by Android (Google) Code Review
Browse files

Merge "jWakeLock"

parents a09fa50c fc9f40f3
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ class MediaPlayer2 : public MediaPlayer2InterfaceListener
public:
    ~MediaPlayer2();

    static sp<MediaPlayer2> Create(int32_t sessionId);
    static sp<MediaPlayer2> Create(int32_t sessionId, jobject context);
    static status_t DumpAll(int fd, const Vector<String16>& args);

            void            disconnect();
@@ -117,7 +117,7 @@ public:
            status_t        dump(int fd, const Vector<String16>& args);

private:
    MediaPlayer2(int32_t sessionId);
    MediaPlayer2(int32_t sessionId, jobject context);
    bool init();

    // Disconnect from the currently connected ANativeWindow.
@@ -153,6 +153,7 @@ private:
    int                         mVideoHeight;
    int32_t                     mAudioSessionId;
    sp<JObjectHolder>           mAudioAttributes;
    sp<JObjectHolder>           mContext;
    float                       mSendLevel;
    sp<ANativeWindowWrapper>    mConnectedWindow;
};
+6 −5
Original line number Diff line number Diff line
@@ -211,8 +211,8 @@ status_t dumpPlayers(int fd, const Vector<String16>& args) {
}  // anonymous namespace

//static
sp<MediaPlayer2> MediaPlayer2::Create(int32_t sessionId) {
    sp<MediaPlayer2> player = new MediaPlayer2(sessionId);
sp<MediaPlayer2> MediaPlayer2::Create(int32_t sessionId, jobject context) {
    sp<MediaPlayer2> player = new MediaPlayer2(sessionId, context);

    if (!player->init()) {
        return NULL;
@@ -229,13 +229,14 @@ status_t MediaPlayer2::DumpAll(int fd, const Vector<String16>& args) {
    return dumpPlayers(fd, args);
}

MediaPlayer2::MediaPlayer2(int32_t sessionId) {
MediaPlayer2::MediaPlayer2(int32_t sessionId, jobject context) {
    ALOGV("constructor");
    mSrcId = 0;
    mLockThreadId = 0;
    mListener = NULL;
    mStreamType = AUDIO_STREAM_MUSIC;
    mAudioAttributes = NULL;
    mContext = new JObjectHolder(context);
    mCurrentPosition = -1;
    mCurrentSeekMode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC;
    mSeekPosition = -1;
@@ -326,15 +327,15 @@ status_t MediaPlayer2::setDataSource(const sp<DataSourceDesc> &dsd) {

    sp<MediaPlayer2Interface> oldPlayer;

    Mutex::Autolock _l(mLock);
    {
        Mutex::Autolock _l(mLock);
        if (!((mCurrentState & MEDIA_PLAYER2_IDLE)
              || mCurrentState == MEDIA_PLAYER2_STATE_ERROR)) {
            ALOGE("setDataSource called in wrong state %d", mCurrentState);
            return INVALID_OPERATION;
        }

        sp<MediaPlayer2Interface> player = new NuPlayer2Driver(mPid, mUid);
        sp<MediaPlayer2Interface> player = new NuPlayer2Driver(mPid, mUid, mContext);
        status_t err = player->initCheck();
        if (err != NO_ERROR) {
            ALOGE("Failed to create player object, initCheck failed(%d)", err);
+38 −51
Original line number Diff line number Diff line
@@ -20,56 +20,51 @@

#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;
        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++;
        return true;
@@ -86,25 +81,17 @@ void JWakeLock::release(bool force) {
        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
+6 −23
Original line number Diff line number Diff line
@@ -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 @@ namespace android {
class JWakeLock : public RefBase {

public:
    JWakeLock();
    JWakeLock(const sp<JObjectHolder> &context);

    // NOTE: acquire and release are not thread safe

@@ -37,28 +37,11 @@ public:
    virtual ~JWakeLock();

private:
    sp<IPowerManager> mPowerManager;
    sp<IBinder>       mWakeLockToken;
    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);
};
+5 −3
Original line number Diff line number Diff line
@@ -209,7 +209,8 @@ private:

////////////////////////////////////////////////////////////////////////////////

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 @@ NuPlayer2::NuPlayer2(pid_t pid, uid_t uid, const sp<MediaClock> &mediaClock)
      mVideoDecoderError(false),
      mPaused(false),
      mPausedByClient(true),
      mPausedForBuffering(false) {
      mPausedForBuffering(false),
      mContext(context) {
    CHECK(mediaClock != NULL);
    clearFlushComplete();
}
@@ -1738,7 +1740,7 @@ void NuPlayer2::onStart(bool play) {
    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);
Loading