diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 84be8746b813b..9d2c779e70e30 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -225,7 +225,10 @@ MediaPlayerService::~MediaPlayerService() sp MediaPlayerService::createMediaRecorder(pid_t pid) { #ifndef NO_OPENCORE - sp recorder = new MediaRecorderClient(pid); + sp recorder = new MediaRecorderClient(this, pid); + wp w = recorder; + Mutex::Autolock lock(mLock); + mMediaRecorderClients.add(w); #else sp recorder = NULL; #endif @@ -233,6 +236,13 @@ sp MediaPlayerService::createMediaRecorder(pid_t pid) return recorder; } +void MediaPlayerService::removeMediaRecorderClient(wp client) +{ + Mutex::Autolock lock(mLock); + mMediaRecorderClients.remove(client); + LOGV("Delete media recorder client"); +} + sp MediaPlayerService::createMetadataRetriever(pid_t pid) { sp retriever = new MetadataRetrieverClient(pid); @@ -460,6 +470,13 @@ status_t MediaPlayerService::dump(int fd, const Vector& args) sp c = mClients[i].promote(); if (c != 0) c->dump(fd, args); } + for (int i = 0, n = mMediaRecorderClients.size(); i < n; ++i) { + result.append(" MediaRecorderClient\n"); + sp c = mMediaRecorderClients[i].promote(); + snprintf(buffer, 255, " pid(%d)\n\n", c->mPid); + result.append(buffer); + } + result.append(" Files opened and/or mapped:\n"); snprintf(buffer, SIZE, "/proc/%d/maps", myTid()); FILE *f = fopen(buffer, "r"); diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index 7d2e611838d91..43c4915522ab7 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -35,6 +35,7 @@ namespace android { class IMediaRecorder; class IMediaMetadataRetriever; class IOMX; +class MediaRecorderClient; #define CALLBACK_ANTAGONIZER 0 #if CALLBACK_ANTAGONIZER @@ -175,6 +176,7 @@ public: // IMediaPlayerService interface virtual sp createMediaRecorder(pid_t pid); + void removeMediaRecorderClient(wp client); virtual sp createMetadataRetriever(pid_t pid); // House keeping for media player clients @@ -280,6 +282,7 @@ private: mutable Mutex mLock; SortedVector< wp > mClients; + SortedVector< wp > mMediaRecorderClients; int32_t mNextConnId; }; diff --git a/media/libmediaplayerservice/MediaRecorderClient.cpp b/media/libmediaplayerservice/MediaRecorderClient.cpp index e54f20d5ab620..95ee3e46218a8 100644 --- a/media/libmediaplayerservice/MediaRecorderClient.cpp +++ b/media/libmediaplayerservice/MediaRecorderClient.cpp @@ -32,7 +32,10 @@ #include #include +#include + #include "MediaRecorderClient.h" +#include "MediaPlayerService.h" namespace android { @@ -80,6 +83,7 @@ status_t MediaRecorderClient::setVideoSource(int vs) Mutex::Autolock lock(mLock); if (mRecorder == NULL) { LOGE("recorder is not initialized"); + return NO_INIT; } return mRecorder->setVideoSource((video_source)vs); } @@ -93,6 +97,7 @@ status_t MediaRecorderClient::setAudioSource(int as) Mutex::Autolock lock(mLock); if (mRecorder == NULL) { LOGE("recorder is not initialized"); + return NO_INIT; } return mRecorder->setAudioSource((audio_source)as); } @@ -271,15 +276,18 @@ status_t MediaRecorderClient::release() if (mRecorder != NULL) { delete mRecorder; mRecorder = NULL; + wp client(this); + mMediaPlayerService->removeMediaRecorderClient(client); } return NO_ERROR; } -MediaRecorderClient::MediaRecorderClient(pid_t pid) +MediaRecorderClient::MediaRecorderClient(const sp& service, pid_t pid) { LOGV("Client constructor"); mPid = pid; mRecorder = new PVMediaRecorder(); + mMediaPlayerService = service; } MediaRecorderClient::~MediaRecorderClient() diff --git a/media/libmediaplayerservice/MediaRecorderClient.h b/media/libmediaplayerservice/MediaRecorderClient.h index 6a1c2d5c46364..6260441a8825e 100644 --- a/media/libmediaplayerservice/MediaRecorderClient.h +++ b/media/libmediaplayerservice/MediaRecorderClient.h @@ -24,6 +24,7 @@ namespace android { class PVMediaRecorder; class ISurface; +class MediaPlayerService; class MediaRecorderClient : public BnMediaRecorder { @@ -53,12 +54,13 @@ public: private: friend class MediaPlayerService; // for accessing private constructor - MediaRecorderClient(pid_t pid); + MediaRecorderClient(const sp& service, pid_t pid); virtual ~MediaRecorderClient(); pid_t mPid; Mutex mLock; PVMediaRecorder *mRecorder; + sp mMediaPlayerService; }; }; // namespace android