diff options
author | Andreas Huber <andih@google.com> | 2011-04-04 09:12:56 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2011-04-04 11:29:35 -0700 |
commit | bd7b7177f88ae6e83bd7bb8bfd9b7018be923931 (patch) | |
tree | b9a21fec8b27e404eb871682ca7de36c1df2e810 /media/libstagefright | |
parent | 94baecca5e14b083c46615a1bcf18ea6cf7cad46 (diff) | |
download | frameworks_av-bd7b7177f88ae6e83bd7bb8bfd9b7018be923931.zip frameworks_av-bd7b7177f88ae6e83bd7bb8bfd9b7018be923931.tar.gz frameworks_av-bd7b7177f88ae6e83bd7bb8bfd9b7018be923931.tar.bz2 |
Avoid a race condition while signaling audio EOS/seek complete by acquiring the lock.
Change-Id: Idfea452ff661b264e013fe515bcd2a2762bd959c
related-to-bug: 4193552
Diffstat (limited to 'media/libstagefright')
-rw-r--r-- | media/libstagefright/AudioPlayer.cpp | 23 | ||||
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 2 |
2 files changed, 21 insertions, 4 deletions
diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp index 162d2e6..07b9522 100644 --- a/media/libstagefright/AudioPlayer.cpp +++ b/media/libstagefright/AudioPlayer.cpp @@ -311,6 +311,10 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) { return size; } + bool postSeekComplete = false; + bool postEOS = false; + int64_t postEOSDelayUs = 0; + size_t size_done = 0; size_t size_remaining = size; while (size_remaining > 0) { @@ -337,7 +341,7 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) { mSeeking = false; if (mObserver) { - mObserver->postAudioSeekComplete(); + postSeekComplete = true; } } } @@ -389,7 +393,8 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) { numFramesPendingPlayout, timeToCompletionUs, timeToCompletionUs / 1E6); - mObserver->postAudioEOS(timeToCompletionUs + mLatencyUs); + postEOS = true; + postEOSDelayUs = timeToCompletionUs + mLatencyUs; } mReachedEOS = true; @@ -433,8 +438,18 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) { size_remaining -= copy; } - Mutex::Autolock autoLock(mLock); - mNumFramesPlayed += size_done / mFrameSize; + { + Mutex::Autolock autoLock(mLock); + mNumFramesPlayed += size_done / mFrameSize; + } + + if (postEOS) { + mObserver->postAudioEOS(postEOSDelayUs); + } + + if (postSeekComplete) { + mObserver->postAudioSeekComplete(); + } return size_done; } diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index f25d498..f31c2ac 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -1859,10 +1859,12 @@ uint32_t AwesomePlayer::flags() const { } void AwesomePlayer::postAudioEOS(int64_t delayUs) { + Mutex::Autolock autoLock(mLock); postCheckAudioStatusEvent_l(delayUs); } void AwesomePlayer::postAudioSeekComplete() { + Mutex::Autolock autoLock(mLock); postCheckAudioStatusEvent_l(0 /* delayUs */); } |