Merge "Playback rate on MediaPlayer"

This commit is contained in:
Jean-Michel Trivi
2012-02-13 14:21:36 -08:00
committed by Android (Google) Code Review
8 changed files with 54 additions and 2 deletions

View File

@@ -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) {}

View File

@@ -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
};
// ----------------------------------------------------------------------------

View File

@@ -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;

View File

@@ -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);

View File

@@ -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; }

View File

@@ -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);
}

View File

@@ -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,

View File

@@ -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;