diff options
author | Andreas Huber <andih@google.com> | 2011-03-22 10:31:21 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2011-03-22 13:18:09 -0700 |
commit | 84b343f29063fbfa2ee61b2e3d37ba059ca507d4 (patch) | |
tree | b1bb4c481a3348b4ca480f262b7016e45106f8e5 /media/libstagefright/AudioPlayer.cpp | |
parent | 0b500c2e81288190a6ce8b20c842a83a19e038b5 (diff) | |
download | frameworks_av-84b343f29063fbfa2ee61b2e3d37ba059ca507d4.zip frameworks_av-84b343f29063fbfa2ee61b2e3d37ba059ca507d4.tar.gz frameworks_av-84b343f29063fbfa2ee61b2e3d37ba059ca507d4.tar.bz2 |
Delay signaling the end of audio playback until all frames have actually played.
Change-Id: I1fa07358a885a818fd0a5d7da425740f86095e10
related-to-bug: 3404000
Diffstat (limited to 'media/libstagefright/AudioPlayer.cpp')
-rw-r--r-- | media/libstagefright/AudioPlayer.cpp | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp index e7c0299..07f250a 100644 --- a/media/libstagefright/AudioPlayer.cpp +++ b/media/libstagefright/AudioPlayer.cpp @@ -280,6 +280,26 @@ void AudioPlayer::AudioCallback(int event, void *info) { buffer->size = numBytesWritten; } +uint32_t AudioPlayer::getNumFramesPendingPlayout() const { + uint32_t numFramesPlayedOut; + status_t err; + + if (mAudioSink != NULL) { + err = mAudioSink->getPosition(&numFramesPlayedOut); + } else { + err = mAudioTrack->getPosition(&numFramesPlayedOut); + } + + if (err != OK || mNumFramesPlayed < numFramesPlayedOut) { + return 0; + } + + // mNumFramesPlayed is the number of frames submitted + // to the audio sink for playback, but not all of them + // may have played out by now. + return mNumFramesPlayed - numFramesPlayedOut; +} + size_t AudioPlayer::fillBuffer(void *data, size_t size) { if (mNumFramesPlayed == 0) { LOGV("AudioCallback"); @@ -342,7 +362,34 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) { if (err != OK) { if (mObserver && !mReachedEOS) { - mObserver->postAudioEOS(); + // We don't want to post EOS right away but only + // after all frames have actually been played out. + + // These are the number of frames submitted to the + // AudioTrack that you haven't heard yet. + uint32_t numFramesPendingPlayout = + getNumFramesPendingPlayout(); + + // These are the number of frames we're going to + // submit to the AudioTrack by returning from this + // callback. + uint32_t numAdditionalFrames = size_done / mFrameSize; + + numFramesPendingPlayout += numAdditionalFrames; + + int64_t timeToCompletionUs = + (1000000ll * numFramesPendingPlayout) / mSampleRate; + + LOGV("total number of frames played: %lld (%lld us)", + (mNumFramesPlayed + numAdditionalFrames), + 1000000ll * (mNumFramesPlayed + numAdditionalFrames) + / mSampleRate); + + LOGV("%d frames left to play, %lld us (%.2f secs)", + numFramesPendingPlayout, + timeToCompletionUs, timeToCompletionUs / 1E6); + + mObserver->postAudioEOS(timeToCompletionUs + mLatencyUs); } mReachedEOS = true; |