Skip to content

Commit fbd2e64

Browse files
jmtriviAndroid (Google) Code Review
authored andcommitted
Merge "Playback rate on MediaPlayer"
2 parents a17032e + e901a5c commit fbd2e64

File tree

8 files changed

+54
-2
lines changed

8 files changed

+54
-2
lines changed

include/media/MediaPlayerInterface.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ class MediaPlayerBase : public RefBase
9696
virtual void flush() = 0;
9797
virtual void pause() = 0;
9898
virtual void close() = 0;
99+
100+
virtual status_t setPlaybackRatePermille(int32_t rate) { return INVALID_OPERATION; }
99101
};
100102

101103
MediaPlayerBase() : mCookie(0), mNotify(0) {}

include/media/mediaplayer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@ enum media_parameter_keys {
145145
// audio track, or zero for error (e.g. no audio track) or unknown.
146146
KEY_PARAMETER_AUDIO_CHANNEL_COUNT = 1200, // get only
147147

148+
// Playback rate expressed in permille (1000 is normal speed), saved as int32_t, with negative
149+
// values used for rewinding or reverse playback.
150+
KEY_PARAMETER_PLAYBACK_RATE_PERMILLE = 1300, // set only
148151
};
149152

150153
// ----------------------------------------------------------------------------

include/media/stagefright/AudioPlayer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ class AudioPlayer : public TimeSource {
6464
bool isSeeking();
6565
bool reachedEOS(status_t *finalStatus);
6666

67+
status_t setPlaybackRatePermille(int32_t ratePermille);
68+
6769
private:
6870
friend class VideoEditorAudioPlayer;
6971
sp<MediaSource> mSource;

media/libmediaplayerservice/MediaPlayerService.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1265,6 +1265,8 @@ MediaPlayerService::AudioOutput::AudioOutput(int sessionId)
12651265
mStreamType = AUDIO_STREAM_MUSIC;
12661266
mLeftVolume = 1.0;
12671267
mRightVolume = 1.0;
1268+
mPlaybackRatePermille = 1000;
1269+
mSampleRateHz = 0;
12681270
mLatency = 0;
12691271
mMsecsPerFrame = 0;
12701272
mAuxEffectId = 0;
@@ -1402,10 +1404,15 @@ status_t MediaPlayerService::AudioOutput::open(
14021404
ALOGV("setVolume");
14031405
t->setVolume(mLeftVolume, mRightVolume);
14041406

1405-
mMsecsPerFrame = 1.e3 / (float) sampleRate;
1407+
mSampleRateHz = sampleRate;
1408+
mMsecsPerFrame = mPlaybackRatePermille / (float) sampleRate;
14061409
mLatency = t->latency();
14071410
mTrack = t;
14081411

1412+
status_t res = t->setSampleRate(mPlaybackRatePermille * mSampleRateHz / 1000);
1413+
if (res != NO_ERROR) {
1414+
return res;
1415+
}
14091416
t->setAuxEffectSendLevel(mSendLevel);
14101417
return t->attachAuxEffect(mAuxEffectId);;
14111418
}
@@ -1469,6 +1476,22 @@ void MediaPlayerService::AudioOutput::setVolume(float left, float right)
14691476
}
14701477
}
14711478

1479+
status_t MediaPlayerService::AudioOutput::setPlaybackRatePermille(int32_t ratePermille)
1480+
{
1481+
ALOGV("setPlaybackRatePermille(%d)", ratePermille);
1482+
status_t res = NO_ERROR;
1483+
if (mTrack) {
1484+
res = mTrack->setSampleRate(ratePermille * mSampleRateHz / 1000);
1485+
} else {
1486+
res = NO_INIT;
1487+
}
1488+
mPlaybackRatePermille = ratePermille;
1489+
if (mSampleRateHz != 0) {
1490+
mMsecsPerFrame = mPlaybackRatePermille / (float) mSampleRateHz;
1491+
}
1492+
return res;
1493+
}
1494+
14721495
status_t MediaPlayerService::AudioOutput::setAuxEffectSendLevel(float level)
14731496
{
14741497
ALOGV("setAuxEffectSendLevel(%f)", level);

media/libmediaplayerservice/MediaPlayerService.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ class MediaPlayerService : public BnMediaPlayerService
9595
virtual void close();
9696
void setAudioStreamType(audio_stream_type_t streamType) { mStreamType = streamType; }
9797
void setVolume(float left, float right);
98+
virtual status_t setPlaybackRatePermille(int32_t ratePermille);
9899
status_t setAuxEffectSendLevel(float level);
99100
status_t attachAuxEffect(int effectId);
100101
virtual status_t dump(int fd, const Vector<String16>& args) const;
@@ -112,6 +113,8 @@ class MediaPlayerService : public BnMediaPlayerService
112113
audio_stream_type_t mStreamType;
113114
float mLeftVolume;
114115
float mRightVolume;
116+
int32_t mPlaybackRatePermille;
117+
uint32_t mSampleRateHz; // sample rate of the content, as set in open()
115118
float mMsecsPerFrame;
116119
uint32_t mLatency;
117120
int mSessionId;
@@ -152,6 +155,7 @@ class MediaPlayerService : public BnMediaPlayerService
152155
virtual void close() {}
153156
void setAudioStreamType(audio_stream_type_t streamType) {}
154157
void setVolume(float left, float right) {}
158+
virtual status_t setPlaybackRatePermille(int32_t ratePermille) { return INVALID_OPERATION; }
155159
uint32_t sampleRate() const { return mSampleRate; }
156160
audio_format_t format() const { return mFormat; }
157161
size_t size() const { return mSize; }

media/libmediaplayerservice/StagefrightPlayer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
176176
}
177177

178178
status_t StagefrightPlayer::setParameter(int key, const Parcel &request) {
179-
ALOGV("setParameter");
179+
ALOGV("setParameter(key=%d)", key);
180180
return mPlayer->setParameter(key, request);
181181
}
182182

media/libstagefright/AudioPlayer.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,16 @@ bool AudioPlayer::reachedEOS(status_t *finalStatus) {
268268
return mReachedEOS;
269269
}
270270

271+
status_t AudioPlayer::setPlaybackRatePermille(int32_t ratePermille) {
272+
if (mAudioSink.get() != NULL) {
273+
return mAudioSink->setPlaybackRatePermille(ratePermille);
274+
} else if (mAudioTrack != NULL){
275+
return mAudioTrack->setSampleRate(ratePermille * mSampleRate / 1000);
276+
} else {
277+
return NO_INIT;
278+
}
279+
}
280+
271281
// static
272282
size_t AudioPlayer::AudioSinkCallback(
273283
MediaPlayerBase::AudioSink *audioSink,

media/libstagefright/AwesomePlayer.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2251,6 +2251,14 @@ status_t AwesomePlayer::setParameter(int key, const Parcel &request) {
22512251
{
22522252
return setCacheStatCollectFreq(request);
22532253
}
2254+
case KEY_PARAMETER_PLAYBACK_RATE_PERMILLE:
2255+
{
2256+
if (mAudioPlayer != NULL) {
2257+
return mAudioPlayer->setPlaybackRatePermille(request.readInt32());
2258+
} else {
2259+
return NO_INIT;
2260+
}
2261+
}
22542262
default:
22552263
{
22562264
return ERROR_UNSUPPORTED;

0 commit comments

Comments
 (0)