Loading media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h +3 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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. Loading Loading @@ -153,6 +153,7 @@ private: int mVideoHeight; int32_t mAudioSessionId; sp<JObjectHolder> mAudioAttributes; sp<JObjectHolder> mContext; float mSendLevel; sp<ANativeWindowWrapper> mConnectedWindow; }; Loading media/libmediaplayer2/mediaplayer2.cpp +6 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading media/libmediaplayer2/nuplayer2/JWakeLock.cpp +38 −51 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 media/libmediaplayer2/nuplayer2/JWakeLock.h +6 −23 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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 Loading @@ -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); }; Loading media/libmediaplayer2/nuplayer2/NuPlayer2.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -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), Loading Loading @@ -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(); } Loading Loading @@ -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 Loading
media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h +3 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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. Loading Loading @@ -153,6 +153,7 @@ private: int mVideoHeight; int32_t mAudioSessionId; sp<JObjectHolder> mAudioAttributes; sp<JObjectHolder> mContext; float mSendLevel; sp<ANativeWindowWrapper> mConnectedWindow; }; Loading
media/libmediaplayer2/mediaplayer2.cpp +6 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading
media/libmediaplayer2/nuplayer2/JWakeLock.cpp +38 −51 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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
media/libmediaplayer2/nuplayer2/JWakeLock.h +6 −23 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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 Loading @@ -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); }; Loading
media/libmediaplayer2/nuplayer2/NuPlayer2.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -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), Loading Loading @@ -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(); } Loading Loading @@ -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