Make sure to call AudioTrack::stop() instead of AudioTrack::pause() after submitting all samples to AudioTrack to make sure those remaining samples are actually played out.

Change-Id: Id574a0203efcb5e565f1b0fe77869fc33b9a9d56
This commit is contained in:
Andreas Huber
2010-10-05 10:25:34 -07:00
parent 78d15acfb2
commit c743f4506f
4 changed files with 29 additions and 14 deletions

View File

@ -49,11 +49,9 @@ public:
status_t start(bool sourceAlreadyStarted = false);
void pause();
void pause(bool playPendingSamples = false);
void resume();
void stop();
// Returns the timestamp of the last buffer played (in us).
int64_t getMediaTimeUs();
@ -107,6 +105,8 @@ private:
int64_t getRealTimeUsLocked() const;
void reset();
AudioPlayer(const AudioPlayer &);
AudioPlayer &operator=(const AudioPlayer &);
};

View File

@ -55,7 +55,7 @@ AudioPlayer::AudioPlayer(
AudioPlayer::~AudioPlayer() {
if (mStarted) {
stop();
reset();
}
}
@ -165,13 +165,21 @@ status_t AudioPlayer::start(bool sourceAlreadyStarted) {
return OK;
}
void AudioPlayer::pause() {
void AudioPlayer::pause(bool playPendingSamples) {
CHECK(mStarted);
if (mAudioSink.get() != NULL) {
mAudioSink->pause();
if (playPendingSamples) {
if (mAudioSink.get() != NULL) {
mAudioSink->stop();
} else {
mAudioTrack->stop();
}
} else {
mAudioTrack->stop();
if (mAudioSink.get() != NULL) {
mAudioSink->pause();
} else {
mAudioTrack->pause();
}
}
}
@ -185,7 +193,7 @@ void AudioPlayer::resume() {
}
}
void AudioPlayer::stop() {
void AudioPlayer::reset() {
CHECK(mStarted);
if (mAudioSink.get() != NULL) {

View File

@ -576,7 +576,7 @@ void AwesomePlayer::onStreamDone() {
notifyListener_l(
MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus);
pause_l();
pause_l(true /* at eos */);
mFlags |= AT_EOS;
return;
@ -600,7 +600,7 @@ void AwesomePlayer::onStreamDone() {
LOGV("MEDIA_PLAYBACK_COMPLETE");
notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
pause_l();
pause_l(true /* at eos */);
mFlags |= AT_EOS;
}
@ -738,7 +738,7 @@ status_t AwesomePlayer::pause() {
return pause_l();
}
status_t AwesomePlayer::pause_l() {
status_t AwesomePlayer::pause_l(bool at_eos) {
if (!(mFlags & PLAYING)) {
return OK;
}
@ -746,7 +746,14 @@ status_t AwesomePlayer::pause_l() {
cancelPlayerEvents(true /* keepBufferingGoing */);
if (mAudioPlayer != NULL) {
mAudioPlayer->pause();
if (at_eos) {
// If we played the audio stream to completion we
// want to make sure that all samples remaining in the audio
// track's queue are played out.
mAudioPlayer->pause(true /* playPendingSamples */);
} else {
mAudioPlayer->pause();
}
}
mFlags &= ~PLAYING;

View File

@ -221,7 +221,7 @@ private:
status_t setDataSource_l(const sp<MediaExtractor> &extractor);
void reset_l();
status_t seekTo_l(int64_t timeUs);
status_t pause_l();
status_t pause_l(bool at_eos = false);
void initRenderer_l();
void seekAudioIfNecessary_l();