diff options
author | Wei Jia <wjia@google.com> | 2015-02-04 17:01:11 -0800 |
---|---|---|
committer | Wei Jia <wjia@google.com> | 2015-02-24 16:34:11 -0800 |
commit | 9816016afb2a13c6a866cd047d57020566a8b9a9 (patch) | |
tree | 176a616a7d5da21447e880158cef57516efee9c3 /media/libmedia | |
parent | 658fc18d8e632441cd5d83a4f74b53620cbac1fe (diff) | |
download | frameworks_av-9816016afb2a13c6a866cd047d57020566a8b9a9.zip frameworks_av-9816016afb2a13c6a866cd047d57020566a8b9a9.tar.gz frameworks_av-9816016afb2a13c6a866cd047d57020566a8b9a9.tar.bz2 |
mediaplayer: support dynamic playback rate
Bug: 19196501
Change-Id: I856b1507d5fa2cedfb645706d2435683a7d3e050
Diffstat (limited to 'media/libmedia')
-rw-r--r-- | media/libmedia/IMediaPlayer.cpp | 15 | ||||
-rw-r--r-- | media/libmedia/mediaplayer.cpp | 19 |
2 files changed, 34 insertions, 0 deletions
diff --git a/media/libmedia/IMediaPlayer.cpp b/media/libmedia/IMediaPlayer.cpp index 7f3e5cc..dcd5670 100644 --- a/media/libmedia/IMediaPlayer.cpp +++ b/media/libmedia/IMediaPlayer.cpp @@ -39,6 +39,7 @@ enum { START, STOP, IS_PLAYING, + SET_PLAYBACK_RATE, PAUSE, SEEK_TO, GET_CURRENT_POSITION, @@ -164,6 +165,15 @@ public: return reply.readInt32(); } + status_t setPlaybackRate(float rate) + { + Parcel data, reply; + data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor()); + data.writeFloat(rate); + remote()->transact(SET_PLAYBACK_RATE, data, &reply); + return reply.readInt32(); + } + status_t pause() { Parcel data, reply; @@ -426,6 +436,11 @@ status_t BnMediaPlayer::onTransact( reply->writeInt32(ret); return NO_ERROR; } break; + case SET_PLAYBACK_RATE: { + CHECK_INTERFACE(IMediaPlayer, data, reply); + reply->writeInt32(setPlaybackRate(data.readFloat())); + return NO_ERROR; + } break; case PAUSE: { CHECK_INTERFACE(IMediaPlayer, data, reply); reply->writeInt32(pause()); diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index 432ecda..d1d51cc 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -59,6 +59,7 @@ MediaPlayer::MediaPlayer() mLoop = false; mLeftVolume = mRightVolume = 1.0; mVideoWidth = mVideoHeight = 0; + mPlaybackRate = 1.0; mLockThreadId = 0; mAudioSessionId = AudioSystem::newAudioUniqueId(); AudioSystem::acquireAudioSessionId(mAudioSessionId, -1); @@ -378,6 +379,24 @@ bool MediaPlayer::isPlaying() return false; } +status_t MediaPlayer::setPlaybackRate(float rate) +{ + ALOGV("setPlaybackRate: %f", rate); + if (rate <= 0.0) { + return BAD_VALUE; + } + Mutex::Autolock _l(mLock); + if (mPlayer != 0) { + if (mPlaybackRate == rate) { + return NO_ERROR; + } + mPlaybackRate = rate; + return mPlayer->setPlaybackRate(rate); + } + ALOGV("setPlaybackRate: no active player"); + return INVALID_OPERATION; +} + status_t MediaPlayer::getVideoWidth(int *w) { ALOGV("getVideoWidth"); |