Refactor MediaPlayerBase's notify

Test: make cts -j123 && cts-tradefed run cts-dev -m \
CtsMediaTestCases --compatibility:module-arg \
CtsMediaTestCases:include-annotation:\
android.platform.test.annotations.RequiresDevice

Bug: 70546581
Change-Id: Ia3a8eb99c2faf6935c63800ba08f65970cede48e
gugelfrei
Pawin Vongmasa 7 years ago
parent 028cf0973f
commit 082e4f75a3

@ -126,8 +126,7 @@ player_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
sp<MediaPlayerBase> MediaPlayerFactory::createPlayer( sp<MediaPlayerBase> MediaPlayerFactory::createPlayer(
player_type playerType, player_type playerType,
const wp<IMediaPlayer> &client, const sp<MediaPlayerBase::Listener> &listener,
notify_callback_f notifyFunc,
pid_t pid) { pid_t pid) {
sp<MediaPlayerBase> p; sp<MediaPlayerBase> p;
IFactory* factory; IFactory* factory;
@ -152,7 +151,7 @@ sp<MediaPlayerBase> MediaPlayerFactory::createPlayer(
init_result = p->initCheck(); init_result = p->initCheck();
if (init_result == NO_ERROR) { if (init_result == NO_ERROR) {
p->setNotifyCallback(client, notifyFunc); p->setNotifyCallback(listener);
} else { } else {
ALOGE("Failed to create player object of type %d, initCheck failed" ALOGE("Failed to create player object of type %d, initCheck failed"
" (res = %d)", playerType, init_result); " (res = %d)", playerType, init_result);

@ -65,8 +65,7 @@ class MediaPlayerFactory {
const sp<DataSource> &source); const sp<DataSource> &source);
static sp<MediaPlayerBase> createPlayer(player_type playerType, static sp<MediaPlayerBase> createPlayer(player_type playerType,
const wp<IMediaPlayer> &client, const sp<MediaPlayerBase::Listener> &listener,
notify_callback_f notifyFunc,
pid_t pid); pid_t pid);
static void registerBuiltinFactories(); static void registerBuiltinFactories();

@ -590,10 +590,11 @@ MediaPlayerService::Client::Client(
mUid = uid; mUid = uid;
mRetransmitEndpointValid = false; mRetransmitEndpointValid = false;
mAudioAttributes = NULL; mAudioAttributes = NULL;
mListener = new Listener(this);
#if CALLBACK_ANTAGONIZER #if CALLBACK_ANTAGONIZER
ALOGD("create Antagonizer"); ALOGD("create Antagonizer");
mAntagonizer = new Antagonizer(notify, this); mAntagonizer = new Antagonizer(mListener);
#endif #endif
} }
@ -627,7 +628,7 @@ void MediaPlayerService::Client::disconnect()
// and reset the player. We assume the player will serialize // and reset the player. We assume the player will serialize
// access to itself if necessary. // access to itself if necessary.
if (p != 0) { if (p != 0) {
p->setNotifyCallback(0, 0); p->setNotifyCallback(0);
#if CALLBACK_ANTAGONIZER #if CALLBACK_ANTAGONIZER
ALOGD("kill Antagonizer"); ALOGD("kill Antagonizer");
mAntagonizer->kill(); mAntagonizer->kill();
@ -652,7 +653,7 @@ sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerT
p.clear(); p.clear();
} }
if (p == NULL) { if (p == NULL) {
p = MediaPlayerFactory::createPlayer(playerType, this, notify, mPid); p = MediaPlayerFactory::createPlayer(playerType, mListener, mPid);
} }
if (p != NULL) { if (p != NULL) {
@ -1430,25 +1431,19 @@ status_t MediaPlayerService::Client::getRetransmitEndpoint(
} }
void MediaPlayerService::Client::notify( void MediaPlayerService::Client::notify(
const wp<IMediaPlayer> &listener, int msg, int ext1, int ext2, const Parcel *obj) int msg, int ext1, int ext2, const Parcel *obj)
{ {
sp<IMediaPlayer> spListener = listener.promote();
if (spListener == NULL) {
return;
}
Client* client = static_cast<Client*>(spListener.get());
sp<IMediaPlayerClient> c; sp<IMediaPlayerClient> c;
sp<Client> nextClient; sp<Client> nextClient;
status_t errStartNext = NO_ERROR; status_t errStartNext = NO_ERROR;
{ {
Mutex::Autolock l(client->mLock); Mutex::Autolock l(mLock);
c = client->mClient; c = mClient;
if (msg == MEDIA_PLAYBACK_COMPLETE && client->mNextClient != NULL) { if (msg == MEDIA_PLAYBACK_COMPLETE && mNextClient != NULL) {
nextClient = client->mNextClient; nextClient = mNextClient;
if (client->mAudioOutput != NULL) if (mAudioOutput != NULL)
client->mAudioOutput->switchToNextOutput(); mAudioOutput->switchToNextOutput();
errStartNext = nextClient->start(); errStartNext = nextClient->start();
} }
@ -1474,17 +1469,17 @@ void MediaPlayerService::Client::notify(
MEDIA_INFO_METADATA_UPDATE == ext1) { MEDIA_INFO_METADATA_UPDATE == ext1) {
const media::Metadata::Type metadata_type = ext2; const media::Metadata::Type metadata_type = ext2;
if(client->shouldDropMetadata(metadata_type)) { if(shouldDropMetadata(metadata_type)) {
return; return;
} }
// Update the list of metadata that have changed. getMetadata // Update the list of metadata that have changed. getMetadata
// also access mMetadataUpdated and clears it. // also access mMetadataUpdated and clears it.
client->addNewMetadataUpdate(metadata_type); addNewMetadataUpdate(metadata_type);
} }
if (c != NULL) { if (c != NULL) {
ALOGV("[%d] notify (%p, %d, %d, %d)", client->mConnId, spListener.get(), msg, ext1, ext2); ALOGV("[%d] notify (%d, %d, %d)", mConnId, msg, ext1, ext2);
c->notify(msg, ext1, ext2, obj); c->notify(msg, ext1, ext2, obj);
} }
} }
@ -1542,8 +1537,8 @@ status_t MediaPlayerService::Client::releaseDrm()
#if CALLBACK_ANTAGONIZER #if CALLBACK_ANTAGONIZER
const int Antagonizer::interval = 10000; // 10 msecs const int Antagonizer::interval = 10000; // 10 msecs
Antagonizer::Antagonizer(notify_callback_f cb, const wp<IMediaPlayer> &client) : Antagonizer::Antagonizer(const sp<MediaPlayerBase::Listener> &listener) :
mExit(false), mActive(false), mClient(client), mCb(cb) mExit(false), mActive(false), mListener(listener)
{ {
createThread(callbackThread, this); createThread(callbackThread, this);
} }
@ -1563,7 +1558,7 @@ int Antagonizer::callbackThread(void* user)
while (!p->mExit) { while (!p->mExit) {
if (p->mActive) { if (p->mActive) {
ALOGV("send event"); ALOGV("send event");
p->mCb(p->mClient, 0, 0, 0); p->mListener->notify(0, 0, 0, 0);
} }
usleep(interval); usleep(interval);
} }

@ -51,7 +51,7 @@ class MediaRecorderClient;
#if CALLBACK_ANTAGONIZER #if CALLBACK_ANTAGONIZER
class Antagonizer { class Antagonizer {
public: public:
Antagonizer(notify_callback_f cb, const wp<IMediaPlayer> &client); Antagonizer(const sp<MediaPlayerBase::Listener> &listener);
void start() { mActive = true; } void start() { mActive = true; }
void stop() { mActive = false; } void stop() { mActive = false; }
void kill(); void kill();
@ -59,12 +59,11 @@ private:
static const int interval; static const int interval;
Antagonizer(); Antagonizer();
static int callbackThread(void* cookie); static int callbackThread(void* cookie);
Mutex mLock; Mutex mLock;
Condition mCondition; Condition mCondition;
bool mExit; bool mExit;
bool mActive; bool mActive;
wp<IMediaPlayer> mClient; sp<MediaPlayerBase::Listener> mListener;
notify_callback_f mCb;
}; };
#endif #endif
@ -215,7 +214,6 @@ class MediaPlayerService : public BnMediaPlayerService
}; // AudioOutput }; // AudioOutput
public: public:
static void instantiate(); static void instantiate();
@ -365,8 +363,7 @@ private:
status_t setDataSource_post(const sp<MediaPlayerBase>& p, status_t setDataSource_post(const sp<MediaPlayerBase>& p,
status_t status); status_t status);
static void notify(const wp<IMediaPlayer> &cookie, int msg, void notify(int msg, int ext1, int ext2, const Parcel *obj);
int ext1, int ext2, const Parcel *obj);
pid_t pid() const { return mPid; } pid_t pid() const { return mPid; }
virtual status_t dump(int fd, const Vector<String16>& args); virtual status_t dump(int fd, const Vector<String16>& args);
@ -437,23 +434,38 @@ private:
status_t setAudioAttributes_l(const Parcel &request); status_t setAudioAttributes_l(const Parcel &request);
mutable Mutex mLock; class Listener : public MediaPlayerBase::Listener {
sp<MediaPlayerBase> mPlayer; public:
sp<MediaPlayerService> mService; Listener(const wp<Client> &client) : mClient(client) {}
sp<IMediaPlayerClient> mClient; virtual ~Listener() {}
sp<AudioOutput> mAudioOutput; virtual void notify(int msg, int ext1, int ext2, const Parcel *obj) {
pid_t mPid; sp<Client> client = mClient.promote();
status_t mStatus; if (client != NULL) {
bool mLoop; client->notify(msg, ext1, ext2, obj);
int32_t mConnId; }
audio_session_t mAudioSessionId; }
audio_attributes_t * mAudioAttributes; private:
uid_t mUid; wp<Client> mClient;
sp<ANativeWindow> mConnectedWindow; };
sp<IBinder> mConnectedWindowBinder;
struct sockaddr_in mRetransmitEndpoint; mutable Mutex mLock;
bool mRetransmitEndpointValid; sp<MediaPlayerBase> mPlayer;
sp<Client> mNextClient; sp<MediaPlayerService> mService;
sp<IMediaPlayerClient> mClient;
sp<AudioOutput> mAudioOutput;
pid_t mPid;
status_t mStatus;
bool mLoop;
int32_t mConnId;
audio_session_t mAudioSessionId;
audio_attributes_t * mAudioAttributes;
uid_t mUid;
sp<ANativeWindow> mConnectedWindow;
sp<IBinder> mConnectedWindowBinder;
struct sockaddr_in mRetransmitEndpoint;
bool mRetransmitEndpointValid;
sp<Client> mNextClient;
sp<MediaPlayerBase::Listener> mListener;
// Metadata filters. // Metadata filters.
media::Metadata::Filter mMetadataAllow; // protected by mLock media::Metadata::Filter mMetadataAllow; // protected by mLock
@ -468,7 +480,7 @@ private:
sp<ServiceDeathNotifier> mExtractorDeathListener; sp<ServiceDeathNotifier> mExtractorDeathListener;
sp<ServiceDeathNotifier> mCodecDeathListener; sp<ServiceDeathNotifier> mCodecDeathListener;
#if CALLBACK_ANTAGONIZER #if CALLBACK_ANTAGONIZER
Antagonizer* mAntagonizer; Antagonizer* mAntagonizer;
#endif #endif
}; // Client }; // Client

@ -66,14 +66,17 @@ enum player_type {
// duration below which we do not allow deep audio buffering // duration below which we do not allow deep audio buffering
#define AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US 5000000 #define AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US 5000000
// callback mechanism for passing messages to MediaPlayer object
typedef void (*notify_callback_f)(const wp<IMediaPlayer> &listener,
int msg, int ext1, int ext2, const Parcel *obj);
// abstract base class - use MediaPlayerInterface // abstract base class - use MediaPlayerInterface
class MediaPlayerBase : public RefBase class MediaPlayerBase : public RefBase
{ {
public: public:
// callback mechanism for passing messages to MediaPlayer object
class Listener : public RefBase {
public:
virtual void notify(int msg, int ext1, int ext2, const Parcel *obj) = 0;
virtual ~Listener() {}
};
// AudioSink: abstraction layer for audio output // AudioSink: abstraction layer for audio output
class AudioSink : public RefBase { class AudioSink : public RefBase {
public: public:
@ -152,7 +155,7 @@ public:
virtual sp<VolumeShaper::State> getVolumeShaperState(int id); virtual sp<VolumeShaper::State> getVolumeShaperState(int id);
}; };
MediaPlayerBase() : mClient(0), mNotify(0) {} MediaPlayerBase() {}
virtual ~MediaPlayerBase() {} virtual ~MediaPlayerBase() {}
virtual status_t initCheck() = 0; virtual status_t initCheck() = 0;
virtual bool hardwareOutput() = 0; virtual bool hardwareOutput() = 0;
@ -263,22 +266,22 @@ public:
}; };
void setNotifyCallback( void setNotifyCallback(
const wp<IMediaPlayer> &client, notify_callback_f notifyFunc) { const sp<Listener> &listener) {
Mutex::Autolock autoLock(mNotifyLock); Mutex::Autolock autoLock(mNotifyLock);
mClient = client; mNotify = notifyFunc; mListener = listener;
} }
void sendEvent(int msg, int ext1=0, int ext2=0, void sendEvent(int msg, int ext1=0, int ext2=0,
const Parcel *obj=NULL) { const Parcel *obj=NULL) {
notify_callback_f notifyCB; sp<Listener> listener;
wp<IMediaPlayer> client;
{ {
Mutex::Autolock autoLock(mNotifyLock); Mutex::Autolock autoLock(mNotifyLock);
notifyCB = mNotify; listener = mListener;
client = mClient;
} }
if (notifyCB) notifyCB(client, msg, ext1, ext2, obj); if (listener != NULL) {
listener->notify(msg, ext1, ext2, obj);
}
} }
virtual status_t dump(int /* fd */, const Vector<String16>& /* args */) const { virtual status_t dump(int /* fd */, const Vector<String16>& /* args */) const {
@ -297,8 +300,7 @@ private:
friend class MediaPlayerService; friend class MediaPlayerService;
Mutex mNotifyLock; Mutex mNotifyLock;
wp<IMediaPlayer> mClient; sp<Listener> mListener;
notify_callback_f mNotify;
}; };
// Implement this class for media players that use the AudioFlinger software mixer // Implement this class for media players that use the AudioFlinger software mixer

Loading…
Cancel
Save