diff options
author | Jean-Michel Trivi <jmtrivi@google.com> | 2012-02-02 09:06:31 -0800 |
---|---|---|
committer | Jean-Michel Trivi <jmtrivi@google.com> | 2012-02-13 12:39:54 -0800 |
commit | 7a8b0ed6419e57dd8b41d3806893d63d3df91aab (patch) | |
tree | da2076d221f7eb3e26db190d51173c04a91e0788 | |
parent | 1f5ce8b0941c9c6baadd40d151634145f6d5a35c (diff) | |
download | frameworks_av-7a8b0ed6419e57dd8b41d3806893d63d3df91aab.zip frameworks_av-7a8b0ed6419e57dd8b41d3806893d63d3df91aab.tar.gz frameworks_av-7a8b0ed6419e57dd8b41d3806893d63d3df91aab.tar.bz2 |
Playback rate on MediaPlayer
Add support for modifying the playback rate of a MediaPlayer
by altering the sample rate of its AudioTrack.
The playback rate is expressed in permille, where 1000 is the
playback at normal speed.
Change-Id: I981d060ab32f7bae7a767e82c60c88ae635dceed
-rw-r--r-- | include/media/MediaPlayerInterface.h | 2 | ||||
-rw-r--r-- | include/media/mediaplayer.h | 3 | ||||
-rw-r--r-- | include/media/stagefright/AudioPlayer.h | 2 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 25 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.h | 4 | ||||
-rw-r--r-- | media/libmediaplayerservice/StagefrightPlayer.cpp | 2 | ||||
-rw-r--r-- | media/libstagefright/AudioPlayer.cpp | 10 | ||||
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 8 |
8 files changed, 54 insertions, 2 deletions
diff --git a/include/media/MediaPlayerInterface.h b/include/media/MediaPlayerInterface.h index 7beb176..77c82b2 100644 --- a/include/media/MediaPlayerInterface.h +++ b/include/media/MediaPlayerInterface.h @@ -96,6 +96,8 @@ public: virtual void flush() = 0; virtual void pause() = 0; virtual void close() = 0; + + virtual status_t setPlaybackRatePermille(int32_t rate) { return INVALID_OPERATION; } }; MediaPlayerBase() : mCookie(0), mNotify(0) {} diff --git a/include/media/mediaplayer.h b/include/media/mediaplayer.h index 00b7dd5..d0b87c8 100644 --- a/include/media/mediaplayer.h +++ b/include/media/mediaplayer.h @@ -145,6 +145,9 @@ enum media_parameter_keys { // audio track, or zero for error (e.g. no audio track) or unknown. KEY_PARAMETER_AUDIO_CHANNEL_COUNT = 1200, // get only + // Playback rate expressed in permille (1000 is normal speed), saved as int32_t, with negative + // values used for rewinding or reverse playback. + KEY_PARAMETER_PLAYBACK_RATE_PERMILLE = 1300, // set only }; // ---------------------------------------------------------------------------- diff --git a/include/media/stagefright/AudioPlayer.h b/include/media/stagefright/AudioPlayer.h index 0b79324..70c47ae 100644 --- a/include/media/stagefright/AudioPlayer.h +++ b/include/media/stagefright/AudioPlayer.h @@ -64,6 +64,8 @@ public: bool isSeeking(); bool reachedEOS(status_t *finalStatus); + status_t setPlaybackRatePermille(int32_t ratePermille); + private: friend class VideoEditorAudioPlayer; sp<MediaSource> mSource; diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index a0c20ae..4df7f3d 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -1265,6 +1265,8 @@ MediaPlayerService::AudioOutput::AudioOutput(int sessionId) mStreamType = AUDIO_STREAM_MUSIC; mLeftVolume = 1.0; mRightVolume = 1.0; + mPlaybackRatePermille = 1000; + mSampleRateHz = 0; mLatency = 0; mMsecsPerFrame = 0; mAuxEffectId = 0; @@ -1402,10 +1404,15 @@ status_t MediaPlayerService::AudioOutput::open( ALOGV("setVolume"); t->setVolume(mLeftVolume, mRightVolume); - mMsecsPerFrame = 1.e3 / (float) sampleRate; + mSampleRateHz = sampleRate; + mMsecsPerFrame = mPlaybackRatePermille / (float) sampleRate; mLatency = t->latency(); mTrack = t; + status_t res = t->setSampleRate(mPlaybackRatePermille * mSampleRateHz / 1000); + if (res != NO_ERROR) { + return res; + } t->setAuxEffectSendLevel(mSendLevel); return t->attachAuxEffect(mAuxEffectId);; } @@ -1469,6 +1476,22 @@ void MediaPlayerService::AudioOutput::setVolume(float left, float right) } } +status_t MediaPlayerService::AudioOutput::setPlaybackRatePermille(int32_t ratePermille) +{ + ALOGV("setPlaybackRatePermille(%d)", ratePermille); + status_t res = NO_ERROR; + if (mTrack) { + res = mTrack->setSampleRate(ratePermille * mSampleRateHz / 1000); + } else { + res = NO_INIT; + } + mPlaybackRatePermille = ratePermille; + if (mSampleRateHz != 0) { + mMsecsPerFrame = mPlaybackRatePermille / (float) mSampleRateHz; + } + return res; +} + status_t MediaPlayerService::AudioOutput::setAuxEffectSendLevel(float level) { ALOGV("setAuxEffectSendLevel(%f)", level); diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index fa71d11..52af64d 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -95,6 +95,7 @@ class MediaPlayerService : public BnMediaPlayerService virtual void close(); void setAudioStreamType(audio_stream_type_t streamType) { mStreamType = streamType; } void setVolume(float left, float right); + virtual status_t setPlaybackRatePermille(int32_t ratePermille); status_t setAuxEffectSendLevel(float level); status_t attachAuxEffect(int effectId); virtual status_t dump(int fd, const Vector<String16>& args) const; @@ -112,6 +113,8 @@ class MediaPlayerService : public BnMediaPlayerService audio_stream_type_t mStreamType; float mLeftVolume; float mRightVolume; + int32_t mPlaybackRatePermille; + uint32_t mSampleRateHz; // sample rate of the content, as set in open() float mMsecsPerFrame; uint32_t mLatency; int mSessionId; @@ -152,6 +155,7 @@ class MediaPlayerService : public BnMediaPlayerService virtual void close() {} void setAudioStreamType(audio_stream_type_t streamType) {} void setVolume(float left, float right) {} + virtual status_t setPlaybackRatePermille(int32_t ratePermille) { return INVALID_OPERATION; } uint32_t sampleRate() const { return mSampleRate; } audio_format_t format() const { return mFormat; } size_t size() const { return mSize; } diff --git a/media/libmediaplayerservice/StagefrightPlayer.cpp b/media/libmediaplayerservice/StagefrightPlayer.cpp index 6d7771a..052ebf0 100644 --- a/media/libmediaplayerservice/StagefrightPlayer.cpp +++ b/media/libmediaplayerservice/StagefrightPlayer.cpp @@ -176,7 +176,7 @@ void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) { } status_t StagefrightPlayer::setParameter(int key, const Parcel &request) { - ALOGV("setParameter"); + ALOGV("setParameter(key=%d)", key); return mPlayer->setParameter(key, request); } diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp index 9a9c3ef..df27566 100644 --- a/media/libstagefright/AudioPlayer.cpp +++ b/media/libstagefright/AudioPlayer.cpp @@ -268,6 +268,16 @@ bool AudioPlayer::reachedEOS(status_t *finalStatus) { return mReachedEOS; } +status_t AudioPlayer::setPlaybackRatePermille(int32_t ratePermille) { + if (mAudioSink.get() != NULL) { + return mAudioSink->setPlaybackRatePermille(ratePermille); + } else if (mAudioTrack != NULL){ + return mAudioTrack->setSampleRate(ratePermille * mSampleRate / 1000); + } else { + return NO_INIT; + } +} + // static size_t AudioPlayer::AudioSinkCallback( MediaPlayerBase::AudioSink *audioSink, diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 85b7979..70945e3 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -2251,6 +2251,14 @@ status_t AwesomePlayer::setParameter(int key, const Parcel &request) { { return setCacheStatCollectFreq(request); } + case KEY_PARAMETER_PLAYBACK_RATE_PERMILLE: + { + if (mAudioPlayer != NULL) { + return mAudioPlayer->setPlaybackRatePermille(request.readInt32()); + } else { + return NO_INIT; + } + } default: { return ERROR_UNSUPPORTED; |