Merge "Playback rate on MediaPlayer"
This commit is contained in:
committed by
Android (Google) Code Review
commit
fbd2e64346
@@ -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) {}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user