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 /media/libmediaplayerservice/MediaPlayerService.cpp | |
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
Diffstat (limited to 'media/libmediaplayerservice/MediaPlayerService.cpp')
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
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); |