summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/AudioPlayer.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2011-03-22 10:31:21 -0700
committerAndreas Huber <andih@google.com>2011-03-22 13:18:09 -0700
commit84b343f29063fbfa2ee61b2e3d37ba059ca507d4 (patch)
treeb1bb4c481a3348b4ca480f262b7016e45106f8e5 /media/libstagefright/AudioPlayer.cpp
parent0b500c2e81288190a6ce8b20c842a83a19e038b5 (diff)
downloadframeworks_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.cpp49
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;