Loading media/libmediaplayerservice/MediaPlayerService.cpp +34 −8 Original line number Diff line number Diff line Loading @@ -82,6 +82,9 @@ #include "HTTPBase.h" #include "RemoteDisplay.h" static const int kDumpLockRetries = 50; static const int kDumpLockSleepUs = 20000; namespace { using android::media::Metadata; using android::status_t; Loading Loading @@ -405,12 +408,32 @@ status_t MediaPlayerService::Client::dump(int fd, const Vector<String16>& args) snprintf(buffer, 255, " pid(%d), connId(%d), status(%d), looping(%s)\n", mPid, mConnId, mStatus, mLoop?"true": "false"); result.append(buffer); sp<MediaPlayerBase> p; sp<AudioOutput> audioOutput; bool locked = false; for (int i = 0; i < kDumpLockRetries; ++i) { if (mLock.tryLock() == NO_ERROR) { locked = true; break; } usleep(kDumpLockSleepUs); } if (locked) { p = mPlayer; audioOutput = mAudioOutput; mLock.unlock(); } else { result.append(" lock is taken, no dump from player and audio output\n"); } write(fd, result.string(), result.size()); if (mPlayer != NULL) { mPlayer->dump(fd, args); if (p != NULL) { p->dump(fd, args); } if (mAudioOutput != 0) { mAudioOutput->dump(fd, args); if (audioOutput != 0) { audioOutput->dump(fd, args); } write(fd, "\n", 1); return NO_ERROR; Loading Loading @@ -590,7 +613,10 @@ MediaPlayerService::Client::Client( MediaPlayerService::Client::~Client() { ALOGV("Client(%d) destructor pid = %d", mConnId, mPid); { Mutex::Autolock l(mLock); mAudioOutput.clear(); } wp<Client> client(this); disconnect(); mService->removeClient(client); Loading @@ -609,9 +635,8 @@ void MediaPlayerService::Client::disconnect() Mutex::Autolock l(mLock); p = mPlayer; mClient.clear(); } mPlayer.clear(); } // clear the notification to prevent callbacks to dead client // and reset the player. We assume the player will serialize Loading @@ -633,7 +658,7 @@ void MediaPlayerService::Client::disconnect() sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType) { // determine if we have the right player type sp<MediaPlayerBase> p = mPlayer; sp<MediaPlayerBase> p = getPlayer(); if ((p != NULL) && (p->playerType() != playerType)) { ALOGV("delete player"); p.clear(); Loading Loading @@ -721,6 +746,7 @@ void MediaPlayerService::Client::setDataSource_post( } if (mStatus == OK) { Mutex::Autolock l(mLock); mPlayer = p; } } Loading Loading
media/libmediaplayerservice/MediaPlayerService.cpp +34 −8 Original line number Diff line number Diff line Loading @@ -82,6 +82,9 @@ #include "HTTPBase.h" #include "RemoteDisplay.h" static const int kDumpLockRetries = 50; static const int kDumpLockSleepUs = 20000; namespace { using android::media::Metadata; using android::status_t; Loading Loading @@ -405,12 +408,32 @@ status_t MediaPlayerService::Client::dump(int fd, const Vector<String16>& args) snprintf(buffer, 255, " pid(%d), connId(%d), status(%d), looping(%s)\n", mPid, mConnId, mStatus, mLoop?"true": "false"); result.append(buffer); sp<MediaPlayerBase> p; sp<AudioOutput> audioOutput; bool locked = false; for (int i = 0; i < kDumpLockRetries; ++i) { if (mLock.tryLock() == NO_ERROR) { locked = true; break; } usleep(kDumpLockSleepUs); } if (locked) { p = mPlayer; audioOutput = mAudioOutput; mLock.unlock(); } else { result.append(" lock is taken, no dump from player and audio output\n"); } write(fd, result.string(), result.size()); if (mPlayer != NULL) { mPlayer->dump(fd, args); if (p != NULL) { p->dump(fd, args); } if (mAudioOutput != 0) { mAudioOutput->dump(fd, args); if (audioOutput != 0) { audioOutput->dump(fd, args); } write(fd, "\n", 1); return NO_ERROR; Loading Loading @@ -590,7 +613,10 @@ MediaPlayerService::Client::Client( MediaPlayerService::Client::~Client() { ALOGV("Client(%d) destructor pid = %d", mConnId, mPid); { Mutex::Autolock l(mLock); mAudioOutput.clear(); } wp<Client> client(this); disconnect(); mService->removeClient(client); Loading @@ -609,9 +635,8 @@ void MediaPlayerService::Client::disconnect() Mutex::Autolock l(mLock); p = mPlayer; mClient.clear(); } mPlayer.clear(); } // clear the notification to prevent callbacks to dead client // and reset the player. We assume the player will serialize Loading @@ -633,7 +658,7 @@ void MediaPlayerService::Client::disconnect() sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType) { // determine if we have the right player type sp<MediaPlayerBase> p = mPlayer; sp<MediaPlayerBase> p = getPlayer(); if ((p != NULL) && (p->playerType() != playerType)) { ALOGV("delete player"); p.clear(); Loading Loading @@ -721,6 +746,7 @@ void MediaPlayerService::Client::setDataSource_post( } if (mStatus == OK) { Mutex::Autolock l(mLock); mPlayer = p; } } Loading