diff options
author | Andreas Huber <andih@google.com> | 2010-02-12 12:35:58 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-02-12 12:44:10 -0800 |
commit | 4e92c7efc68b5d7635a32dbd283ab8558ad9bdd6 (patch) | |
tree | 6a214e4fd02b792810f73e881d6312685ee1d722 | |
parent | 328901bdc7c00ab361c5ef16d0d69c94a0458e95 (diff) | |
download | frameworks_av-4e92c7efc68b5d7635a32dbd283ab8558ad9bdd6.zip frameworks_av-4e92c7efc68b5d7635a32dbd283ab8558ad9bdd6.tar.gz frameworks_av-4e92c7efc68b5d7635a32dbd283ab8558ad9bdd6.tar.bz2 |
New API on java's MediaPlayer to suspend/resume a session.
related-to-bug: 2231576
-rw-r--r-- | include/media/IMediaPlayer.h | 2 | ||||
-rw-r--r-- | include/media/MediaPlayerInterface.h | 3 | ||||
-rw-r--r-- | include/media/mediaplayer.h | 2 | ||||
-rw-r--r-- | media/libmedia/IMediaPlayer.cpp | 32 | ||||
-rw-r--r-- | media/libmedia/mediaplayer.cpp | 10 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 14 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.h | 2 | ||||
-rw-r--r-- | media/libmediaplayerservice/StagefrightPlayer.cpp | 10 | ||||
-rw-r--r-- | media/libmediaplayerservice/StagefrightPlayer.h | 2 |
9 files changed, 77 insertions, 0 deletions
diff --git a/include/media/IMediaPlayer.h b/include/media/IMediaPlayer.h index b6f654f..2619691 100644 --- a/include/media/IMediaPlayer.h +++ b/include/media/IMediaPlayer.h @@ -46,6 +46,8 @@ public: virtual status_t setAudioStreamType(int type) = 0; virtual status_t setLooping(int loop) = 0; virtual status_t setVolume(float leftVolume, float rightVolume) = 0; + virtual status_t suspend() = 0; + virtual status_t resume() = 0; // Invoke a generic method on the player by using opaque parcels // for the request and reply. diff --git a/include/media/MediaPlayerInterface.h b/include/media/MediaPlayerInterface.h index ecb20e8..9e606d9 100644 --- a/include/media/MediaPlayerInterface.h +++ b/include/media/MediaPlayerInterface.h @@ -118,6 +118,9 @@ public: virtual status_t reset() = 0; virtual status_t setLooping(int loop) = 0; virtual player_type playerType() = 0; + virtual status_t suspend() { return INVALID_OPERATION; } + virtual status_t resume() { return INVALID_OPERATION; } + virtual void setNotifyCallback(void* cookie, notify_callback_f notifyFunc) { mCookie = cookie; mNotify = notifyFunc; } // Invoke a generic method on the player by using opaque parcels diff --git a/include/media/mediaplayer.h b/include/media/mediaplayer.h index 8dc7c8a..7fad1b7 100644 --- a/include/media/mediaplayer.h +++ b/include/media/mediaplayer.h @@ -165,6 +165,8 @@ public: status_t invoke(const Parcel& request, Parcel *reply); status_t setMetadataFilter(const Parcel& filter); status_t getMetadata(bool update_only, bool apply_filter, Parcel *metadata); + status_t suspend(); + status_t resume(); private: void clear_l(); status_t seekTo_l(int msec); diff --git a/media/libmedia/IMediaPlayer.cpp b/media/libmedia/IMediaPlayer.cpp index 9c127d4..ed792b3 100644 --- a/media/libmedia/IMediaPlayer.cpp +++ b/media/libmedia/IMediaPlayer.cpp @@ -43,6 +43,8 @@ enum { INVOKE, SET_METADATA_FILTER, GET_METADATA, + SUSPEND, + RESUME, }; class BpMediaPlayer: public BpInterface<IMediaPlayer> @@ -199,6 +201,26 @@ public: remote()->transact(GET_METADATA, request, reply); return reply->readInt32(); } + + status_t suspend() { + Parcel request; + request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor()); + + Parcel reply; + remote()->transact(SUSPEND, request, &reply); + + return reply.readInt32(); + } + + status_t resume() { + Parcel request; + request.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor()); + + Parcel reply; + remote()->transact(RESUME, request, &reply); + + return reply.readInt32(); + } }; IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer"); @@ -299,6 +321,16 @@ status_t BnMediaPlayer::onTransact( reply->writeInt32(setMetadataFilter(data)); return NO_ERROR; } break; + case SUSPEND: { + CHECK_INTERFACE(IMediaPlayer, data, reply); + reply->writeInt32(suspend()); + return NO_ERROR; + } break; + case RESUME: { + CHECK_INTERFACE(IMediaPlayer, data, reply); + reply->writeInt32(resume()); + return NO_ERROR; + } break; case GET_METADATA: { CHECK_INTERFACE(IMediaPlayer, data, reply); const status_t retcode = getMetadata(data.readInt32(), data.readInt32(), reply); diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index 01cd8ce..2157814 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -167,6 +167,16 @@ status_t MediaPlayer::invoke(const Parcel& request, Parcel *reply) return INVALID_OPERATION; } +status_t MediaPlayer::suspend() { + Mutex::Autolock _l(mLock); + return mPlayer->suspend(); +} + +status_t MediaPlayer::resume() { + Mutex::Autolock _l(mLock); + return mPlayer->resume(); +} + status_t MediaPlayer::setMetadataFilter(const Parcel& filter) { LOGD("setMetadataFilter"); diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 55b06f4..b4fc035 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -970,6 +970,20 @@ status_t MediaPlayerService::Client::getMetadata( return OK; } +status_t MediaPlayerService::Client::suspend() { + sp<MediaPlayerBase> p = getPlayer(); + if (p == 0) return UNKNOWN_ERROR; + + return p->suspend(); +} + +status_t MediaPlayerService::Client::resume() { + sp<MediaPlayerBase> p = getPlayer(); + if (p == 0) return UNKNOWN_ERROR; + + return p->resume(); +} + status_t MediaPlayerService::Client::prepareAsync() { LOGV("[%d] prepareAsync", mConnId); diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index c9cae35..2408c62 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -222,6 +222,8 @@ private: virtual status_t getMetadata(bool update_only, bool apply_filter, Parcel *reply); + virtual status_t suspend(); + virtual status_t resume(); sp<MediaPlayerBase> createPlayer(player_type playerType); diff --git a/media/libmediaplayerservice/StagefrightPlayer.cpp b/media/libmediaplayerservice/StagefrightPlayer.cpp index 1bfcf65..7776b4e 100644 --- a/media/libmediaplayerservice/StagefrightPlayer.cpp +++ b/media/libmediaplayerservice/StagefrightPlayer.cpp @@ -136,6 +136,16 @@ player_type StagefrightPlayer::playerType() { return STAGEFRIGHT_PLAYER; } +status_t StagefrightPlayer::suspend() { + LOGV("suspend"); + return mPlayer->suspend(); +} + +status_t StagefrightPlayer::resume() { + LOGV("resume"); + return mPlayer->resume(); +} + status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) { return INVALID_OPERATION; } diff --git a/media/libmediaplayerservice/StagefrightPlayer.h b/media/libmediaplayerservice/StagefrightPlayer.h index 9e6674a..4446582 100644 --- a/media/libmediaplayerservice/StagefrightPlayer.h +++ b/media/libmediaplayerservice/StagefrightPlayer.h @@ -50,6 +50,8 @@ public: virtual player_type playerType(); virtual status_t invoke(const Parcel &request, Parcel *reply); virtual void setAudioSink(const sp<AudioSink> &audioSink); + virtual status_t suspend(); + virtual status_t resume(); private: AwesomePlayer *mPlayer; |