Loading include/media/MediaPlayerInterface.h +16 −2 Original line number Diff line number Diff line Loading @@ -29,7 +29,10 @@ namespace android { typedef int32_t MetadataType; class Parcel; template<typename T> class SortedVector; enum player_type { PV_PLAYER = 1, Loading Loading @@ -112,12 +115,23 @@ public: mCookie = cookie; mNotify = notifyFunc; } // Invoke a generic method on the player by using opaque parcels // for the request and reply. // // @param request Parcel that is positioned at the start of the // data sent by the java layer. // @param[out] reply Parcel to hold the reply data. Cannot be null. // @return OK if the invocation was made successfully. A player // not supporting the direct API should return INVALID_OPERATION. // @return OK if the call was successful. virtual status_t invoke(const Parcel& request, Parcel *reply) = 0; // The Client in the MetadataPlayerService calls this method on // the native player to retrieve all or a subset of metadata. // // @param ids SortedList of metadata ID to be fetch. If empty, all // the known metadata should be returned. // @param[inout] records Parcel where the player appends its metadata. // @return OK if the call was successful. virtual status_t getMetadata(const SortedVector<MetadataType>& ids, Parcel *records) = 0; protected: virtual void sendEvent(int msg, int ext1=0, int ext2=0) { if (mNotify) mNotify(mCookie, msg, ext1, ext2); } Loading include/media/PVPlayer.h +2 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,8 @@ public: virtual status_t setLooping(int loop); virtual player_type playerType() { return PV_PLAYER; } virtual status_t invoke(const Parcel& request, Parcel *reply); virtual status_t getMetadata(const SortedVector<MetadataType>& ids, Parcel *records); // make available to PlayerDriver void sendEvent(int msg, int ext1=0, int ext2=0) { MediaPlayerBase::sendEvent(msg, ext1, ext2); } Loading media/libmediaplayerservice/MediaPlayerService.cpp +31 −6 Original line number Diff line number Diff line Loading @@ -99,6 +99,8 @@ const int kMaxFilterSize = 64; // I pulled that out of thin air. // Keep in sync with ANY in Metadata.java const int32_t kAny = 0; const int32_t kMetaMarker = 0x4d455441; // 'M' 'E' 'T' 'A' // Unmarshall a filter from a Parcel. // Filter format in a parcel: Loading Loading @@ -870,10 +872,14 @@ status_t MediaPlayerService::Client::setMetadataFilter(const Parcel& filter) status_t MediaPlayerService::Client::getMetadata( bool update_only, bool apply_filter, Parcel *reply) { sp<MediaPlayerBase> p = getPlayer(); if (p == 0) return UNKNOWN_ERROR; status_t status; reply->writeInt32(-1); // Placeholder for the return code // Placeholder for the return code, updated by the caller. reply->writeInt32(-1); SortedVector<MetadataType> updates; SortedVector<MetadataType> ids; // We don't block notifications while we fetch the data. We clear // mMetadataUpdated first so we don't lose notifications happening Loading @@ -881,17 +887,36 @@ status_t MediaPlayerService::Client::getMetadata( { Mutex::Autolock lock(mLock); if (update_only) { updates = mMetadataUpdated; ids = mMetadataUpdated; } mMetadataUpdated.clear(); } // FIXME: Implement, query the native player and do the optional filtering, etc... status = OK; const size_t begin = reply->dataPosition(); reply->writeInt32(-1); // Placeholder for the length of the metadata reply->writeInt32(kMetaMarker); status = p->getMetadata(ids, reply); if (status != OK) { reply->setDataPosition(begin); LOGE("getMetadata failed %d", status); return status; } // FIXME: Implement filtering on the result. Not critical since // filtering takes place on the update notifications already. This // would be when all the metadata are fetch and a filter is set. const size_t end = reply->dataPosition(); // Everything is fine, update the metadata length. reply->setDataPosition(begin); reply->writeInt32(end - begin); reply->setDataPosition(end); return OK; } status_t MediaPlayerService::Client::prepareAsync() { LOGV("[%d] prepareAsync", mConnId); Loading media/libmediaplayerservice/MidiFile.h +7 −1 Original line number Diff line number Diff line Loading @@ -46,7 +46,13 @@ public: virtual status_t reset(); virtual status_t setLooping(int loop); virtual player_type playerType() { return SONIVOX_PLAYER; } virtual status_t invoke(const Parcel& request, Parcel *reply) {return INVALID_OPERATION;} virtual status_t invoke(const Parcel& request, Parcel *reply) { return INVALID_OPERATION; } virtual status_t getMetadata(const SortedVector<MetadataType>& ids, Parcel *records) { return INVALID_OPERATION; } private: status_t createOutputTrack(); Loading media/libmediaplayerservice/TestPlayerStub.h +4 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,10 @@ class TestPlayerStub : public MediaPlayerInterface { virtual status_t invoke(const android::Parcel& in, android::Parcel *out) { return mPlayer->invoke(in, out); } virtual status_t getMetadata(const SortedVector<MetadataType>& ids, Parcel *records) { return INVALID_OPERATION; } // @return true if the current build is 'eng' or 'test' and the Loading Loading
include/media/MediaPlayerInterface.h +16 −2 Original line number Diff line number Diff line Loading @@ -29,7 +29,10 @@ namespace android { typedef int32_t MetadataType; class Parcel; template<typename T> class SortedVector; enum player_type { PV_PLAYER = 1, Loading Loading @@ -112,12 +115,23 @@ public: mCookie = cookie; mNotify = notifyFunc; } // Invoke a generic method on the player by using opaque parcels // for the request and reply. // // @param request Parcel that is positioned at the start of the // data sent by the java layer. // @param[out] reply Parcel to hold the reply data. Cannot be null. // @return OK if the invocation was made successfully. A player // not supporting the direct API should return INVALID_OPERATION. // @return OK if the call was successful. virtual status_t invoke(const Parcel& request, Parcel *reply) = 0; // The Client in the MetadataPlayerService calls this method on // the native player to retrieve all or a subset of metadata. // // @param ids SortedList of metadata ID to be fetch. If empty, all // the known metadata should be returned. // @param[inout] records Parcel where the player appends its metadata. // @return OK if the call was successful. virtual status_t getMetadata(const SortedVector<MetadataType>& ids, Parcel *records) = 0; protected: virtual void sendEvent(int msg, int ext1=0, int ext2=0) { if (mNotify) mNotify(mCookie, msg, ext1, ext2); } Loading
include/media/PVPlayer.h +2 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,8 @@ public: virtual status_t setLooping(int loop); virtual player_type playerType() { return PV_PLAYER; } virtual status_t invoke(const Parcel& request, Parcel *reply); virtual status_t getMetadata(const SortedVector<MetadataType>& ids, Parcel *records); // make available to PlayerDriver void sendEvent(int msg, int ext1=0, int ext2=0) { MediaPlayerBase::sendEvent(msg, ext1, ext2); } Loading
media/libmediaplayerservice/MediaPlayerService.cpp +31 −6 Original line number Diff line number Diff line Loading @@ -99,6 +99,8 @@ const int kMaxFilterSize = 64; // I pulled that out of thin air. // Keep in sync with ANY in Metadata.java const int32_t kAny = 0; const int32_t kMetaMarker = 0x4d455441; // 'M' 'E' 'T' 'A' // Unmarshall a filter from a Parcel. // Filter format in a parcel: Loading Loading @@ -870,10 +872,14 @@ status_t MediaPlayerService::Client::setMetadataFilter(const Parcel& filter) status_t MediaPlayerService::Client::getMetadata( bool update_only, bool apply_filter, Parcel *reply) { sp<MediaPlayerBase> p = getPlayer(); if (p == 0) return UNKNOWN_ERROR; status_t status; reply->writeInt32(-1); // Placeholder for the return code // Placeholder for the return code, updated by the caller. reply->writeInt32(-1); SortedVector<MetadataType> updates; SortedVector<MetadataType> ids; // We don't block notifications while we fetch the data. We clear // mMetadataUpdated first so we don't lose notifications happening Loading @@ -881,17 +887,36 @@ status_t MediaPlayerService::Client::getMetadata( { Mutex::Autolock lock(mLock); if (update_only) { updates = mMetadataUpdated; ids = mMetadataUpdated; } mMetadataUpdated.clear(); } // FIXME: Implement, query the native player and do the optional filtering, etc... status = OK; const size_t begin = reply->dataPosition(); reply->writeInt32(-1); // Placeholder for the length of the metadata reply->writeInt32(kMetaMarker); status = p->getMetadata(ids, reply); if (status != OK) { reply->setDataPosition(begin); LOGE("getMetadata failed %d", status); return status; } // FIXME: Implement filtering on the result. Not critical since // filtering takes place on the update notifications already. This // would be when all the metadata are fetch and a filter is set. const size_t end = reply->dataPosition(); // Everything is fine, update the metadata length. reply->setDataPosition(begin); reply->writeInt32(end - begin); reply->setDataPosition(end); return OK; } status_t MediaPlayerService::Client::prepareAsync() { LOGV("[%d] prepareAsync", mConnId); Loading
media/libmediaplayerservice/MidiFile.h +7 −1 Original line number Diff line number Diff line Loading @@ -46,7 +46,13 @@ public: virtual status_t reset(); virtual status_t setLooping(int loop); virtual player_type playerType() { return SONIVOX_PLAYER; } virtual status_t invoke(const Parcel& request, Parcel *reply) {return INVALID_OPERATION;} virtual status_t invoke(const Parcel& request, Parcel *reply) { return INVALID_OPERATION; } virtual status_t getMetadata(const SortedVector<MetadataType>& ids, Parcel *records) { return INVALID_OPERATION; } private: status_t createOutputTrack(); Loading
media/libmediaplayerservice/TestPlayerStub.h +4 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,10 @@ class TestPlayerStub : public MediaPlayerInterface { virtual status_t invoke(const android::Parcel& in, android::Parcel *out) { return mPlayer->invoke(in, out); } virtual status_t getMetadata(const SortedVector<MetadataType>& ids, Parcel *records) { return INVALID_OPERATION; } // @return true if the current build is 'eng' or 'test' and the Loading