diff options
-rw-r--r-- | include/media/IMediaPlayer.h | 10 | ||||
-rw-r--r-- | include/media/IMediaPlayerService.h | 2 | ||||
-rw-r--r-- | include/media/MediaPlayerInterface.h | 13 | ||||
-rw-r--r-- | include/media/PVPlayer.h | 1 | ||||
-rw-r--r-- | include/media/mediaplayer.h | 2 | ||||
-rw-r--r-- | media/libmedia/IMediaPlayer.cpp | 15 | ||||
-rw-r--r-- | media/libmedia/IMediaPlayerService.cpp | 1 | ||||
-rw-r--r-- | media/libmedia/mediaplayer.cpp | 14 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 12 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.h | 2 | ||||
-rw-r--r-- | media/libmediaplayerservice/MidiFile.h | 2 | ||||
-rw-r--r-- | media/libmediaplayerservice/VorbisPlayer.h | 2 |
12 files changed, 66 insertions, 10 deletions
diff --git a/include/media/IMediaPlayer.h b/include/media/IMediaPlayer.h index 2c4bc2a..85aeb30 100644 --- a/include/media/IMediaPlayer.h +++ b/include/media/IMediaPlayer.h @@ -23,6 +23,7 @@ namespace android { +class Parcel; class ISurface; class IMediaPlayer: public IInterface @@ -45,6 +46,14 @@ public: virtual status_t setAudioStreamType(int type) = 0; virtual status_t setLooping(int loop) = 0; virtual status_t setVolume(float leftVolume, float rightVolume) = 0; + + // Invoke a generic method on the player by using opaque parcels + // for the request and reply. + // @param request Parcel that must start with the media player + // interface token. + // @param[out] reply Parcel to hold the reply data. Cannot be null. + // @return OK if the invocation was made. PERMISSION_DENIED otherwise. + virtual status_t invoke(const Parcel& request, Parcel *reply) = 0; }; // ---------------------------------------------------------------------------- @@ -61,4 +70,3 @@ public: }; // namespace android #endif // ANDROID_IMEDIAPLAYER_H - diff --git a/include/media/IMediaPlayerService.h b/include/media/IMediaPlayerService.h index 207e4e7..f6faf14 100644 --- a/include/media/IMediaPlayerService.h +++ b/include/media/IMediaPlayerService.h @@ -17,6 +17,7 @@ #ifndef ANDROID_IMEDIAPLAYERSERVICE_H #define ANDROID_IMEDIAPLAYERSERVICE_H +#include <utils/Errors.h> // for status_t #include <utils/RefBase.h> #include <binder/IInterface.h> #include <binder/Parcel.h> @@ -36,7 +37,6 @@ public: virtual sp<IMediaRecorder> createMediaRecorder(pid_t pid) = 0; virtual sp<IMediaMetadataRetriever> createMetadataRetriever(pid_t pid) = 0; - virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, const char* url) = 0; virtual sp<IMediaPlayer> create(pid_t pid, const sp<IMediaPlayerClient>& client, int fd, int64_t offset, int64_t length) = 0; virtual sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat) = 0; diff --git a/include/media/MediaPlayerInterface.h b/include/media/MediaPlayerInterface.h index 7bf555a..21600b2 100644 --- a/include/media/MediaPlayerInterface.h +++ b/include/media/MediaPlayerInterface.h @@ -27,12 +27,15 @@ namespace android { +class Parcel; + enum player_type { PV_PLAYER = 1, SONIVOX_PLAYER = 2, VORBIS_PLAYER = 3 }; + #define DEFAULT_AUDIOSINK_BUFFERCOUNT 4 #define DEFAULT_AUDIOSINK_BUFFERSIZE 1200 #define DEFAULT_AUDIOSINK_SAMPLERATE 44100 @@ -45,7 +48,6 @@ typedef void (*notify_callback_f)(void* cookie, int msg, int ext1, int ext2); class MediaPlayerBase : public RefBase { public: - // AudioSink: abstraction layer for audio output class AudioSink : public RefBase { public: @@ -88,7 +90,14 @@ public: virtual player_type playerType() = 0; virtual void setNotifyCallback(void* cookie, notify_callback_f notifyFunc) { 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. + virtual status_t invoke(const Parcel& request, Parcel *reply) = 0; protected: virtual void sendEvent(int msg, int ext1=0, int ext2=0) { if (mNotify) mNotify(mCookie, msg, ext1, ext2); } diff --git a/include/media/PVPlayer.h b/include/media/PVPlayer.h index 8122df6..eb4595b 100644 --- a/include/media/PVPlayer.h +++ b/include/media/PVPlayer.h @@ -52,6 +52,7 @@ public: virtual status_t reset(); virtual status_t setLooping(int loop); virtual player_type playerType() { return PV_PLAYER; } + virtual status_t invoke(const Parcel& request, Parcel *reply); // make available to PlayerDriver void sendEvent(int msg, int ext1=0, int ext2=0) { MediaPlayerBase::sendEvent(msg, ext1, ext2); } diff --git a/include/media/mediaplayer.h b/include/media/mediaplayer.h index ffb325d..dd8ea19 100644 --- a/include/media/mediaplayer.h +++ b/include/media/mediaplayer.h @@ -151,7 +151,7 @@ public: void notify(int msg, int ext1, int ext2); static sp<IMemory> decode(const char* url, uint32_t *pSampleRate, int* pNumChannels, int* pFormat); static sp<IMemory> decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, int* pNumChannels, int* pFormat); - + status_t invoke(const Parcel& request, Parcel *reply); private: void clear_l(); status_t seekTo_l(int msec); diff --git a/media/libmedia/IMediaPlayer.cpp b/media/libmedia/IMediaPlayer.cpp index fa2d81d..3f278f4 100644 --- a/media/libmedia/IMediaPlayer.cpp +++ b/media/libmedia/IMediaPlayer.cpp @@ -39,7 +39,8 @@ enum { RESET, SET_AUDIO_STREAM_TYPE, SET_LOOPING, - SET_VOLUME + SET_VOLUME, + INVOKE, }; class BpMediaPlayer: public BpInterface<IMediaPlayer> @@ -170,6 +171,13 @@ public: remote()->transact(SET_VOLUME, data, &reply); return reply.readInt32(); } + + status_t invoke(const Parcel& request, Parcel *reply) + { // Avoid doing any extra copy. The interface descriptor should + // have been set by MediaPlayer.java. + status_t retcode = remote()->transact(INVOKE, request, reply); + return retcode; + } }; IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer"); @@ -260,6 +268,11 @@ status_t BnMediaPlayer::onTransact( reply->writeInt32(setVolume(data.readFloat(), data.readFloat())); return NO_ERROR; } break; + case INVOKE: { + CHECK_INTERFACE(IMediaPlayer, data, reply); + invoke(data, reply); + return NO_ERROR; + } break; default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/media/libmedia/IMediaPlayerService.cpp b/media/libmedia/IMediaPlayerService.cpp index 33b3e22..0f64259 100644 --- a/media/libmedia/IMediaPlayerService.cpp +++ b/media/libmedia/IMediaPlayerService.cpp @@ -20,6 +20,7 @@ #include <binder/Parcel.h> #include <binder/IMemory.h> +#include <utils/Errors.h> // for status_t #include <media/IMediaPlayerService.h> #include <media/IMediaRecorder.h> diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index 220c998..4683166 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -196,6 +196,20 @@ status_t MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length) return err; } +status_t MediaPlayer::invoke(const Parcel& request, Parcel *reply) +{ + Mutex::Autolock _l(mLock); + if ((mPlayer != NULL) && ( mCurrentState & MEDIA_PLAYER_INITIALIZED )) + { + LOGV("invoke %d", request.dataSize()); + return mPlayer->invoke(request, reply); + } + LOGE("invoke failed: wrong state %X", mCurrentState); + return INVALID_OPERATION; +} + + + status_t MediaPlayer::setVideoSurface(const sp<Surface>& surface) { LOGV("setVideoSurface"); diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index a17e651..e39495b 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -34,6 +34,9 @@ #include <binder/IServiceManager.h> #include <binder/MemoryHeapBase.h> #include <binder/MemoryBase.h> +#include <utils/Errors.h> // for status_t +#include <utils/String8.h> +#include <utils/Vector.h> #include <cutils/properties.h> #include <media/MediaPlayerInterface.h> @@ -61,7 +64,6 @@ pid_t gettid() { return syscall(__NR_gettid);} #undef __KERNEL__ #endif - namespace android { // TODO: Temp hack until we can register players @@ -671,6 +673,14 @@ status_t MediaPlayerService::Client::setVideoSurface(const sp<ISurface>& surface return p->setVideoSurface(surface); } +status_t MediaPlayerService::Client::invoke(const Parcel& request, + Parcel *reply) +{ + sp<MediaPlayerBase> p = getPlayer(); + if (p == NULL) return UNKNOWN_ERROR; + return p->invoke(request, reply); +} + status_t MediaPlayerService::Client::prepareAsync() { LOGV("[%d] prepareAsync", mConnId); diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index 5a296bf..12f2231 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -187,6 +187,7 @@ private: virtual status_t setAudioStreamType(int type); virtual status_t setLooping(int loop); virtual status_t setVolume(float leftVolume, float rightVolume); + virtual status_t invoke(const Parcel& request, Parcel *reply); sp<MediaPlayerBase> createPlayer(player_type playerType); status_t setDataSource(const char *url); @@ -238,4 +239,3 @@ private: }; // namespace android #endif // ANDROID_MEDIAPLAYERSERVICE_H - diff --git a/media/libmediaplayerservice/MidiFile.h b/media/libmediaplayerservice/MidiFile.h index 302f1cf..83d97fe 100644 --- a/media/libmediaplayerservice/MidiFile.h +++ b/media/libmediaplayerservice/MidiFile.h @@ -46,6 +46,7 @@ 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;} private: status_t createOutputTrack(); @@ -74,4 +75,3 @@ private: }; // namespace android #endif // ANDROID_MIDIFILE_H - diff --git a/media/libmediaplayerservice/VorbisPlayer.h b/media/libmediaplayerservice/VorbisPlayer.h index c30dc1b..4024654 100644 --- a/media/libmediaplayerservice/VorbisPlayer.h +++ b/media/libmediaplayerservice/VorbisPlayer.h @@ -53,6 +53,7 @@ public: virtual status_t reset(); virtual status_t setLooping(int loop); virtual player_type playerType() { return VORBIS_PLAYER; } + virtual status_t invoke(const Parcel& request, Parcel *reply) {return INVALID_OPERATION;} private: status_t setdatasource(const char *path, int fd, int64_t offset, int64_t length); @@ -88,4 +89,3 @@ private: }; // namespace android #endif // ANDROID_VORBISPLAYER_H - |