diff options
author | Andreas Huber <andih@google.com> | 2010-02-03 11:37:29 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-02-03 13:24:26 -0800 |
commit | 1862a33b246249630b654182afb5914da3480d4c (patch) | |
tree | 60a1a9875e6c6a1b64aa7685021c18e6ef540884 /media/libstagefright/AudioPlayer.cpp | |
parent | 2eeabb1f98d162786b45a09659674025a0559251 (diff) | |
download | frameworks_av-1862a33b246249630b654182afb5914da3480d4c.zip frameworks_av-1862a33b246249630b654182afb5914da3480d4c.tar.gz frameworks_av-1862a33b246249630b654182afb5914da3480d4c.tar.bz2 |
Fix a deadlock caused by the AudioPlayer notifying the observer that the stream had ended at the same time the observer was shutting down the AudioPlayer.
related-to-bug: 2414536
Diffstat (limited to 'media/libstagefright/AudioPlayer.cpp')
-rw-r--r-- | media/libstagefright/AudioPlayer.cpp | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp index 01578c1..31157ce 100644 --- a/media/libstagefright/AudioPlayer.cpp +++ b/media/libstagefright/AudioPlayer.cpp @@ -37,6 +37,7 @@ AudioPlayer::AudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink) mPositionTimeMediaUs(-1), mPositionTimeRealUs(-1), mSeeking(false), + mReachedEOS(false), mStarted(false), mAudioSink(audioSink) { } @@ -47,12 +48,6 @@ AudioPlayer::~AudioPlayer() { } } -void AudioPlayer::setListenerCallback( - void (*notify)(void *cookie, int what), void *cookie) { - mListenerCallback = notify; - mListenerCookie = cookie; -} - void AudioPlayer::setSource(const sp<MediaSource> &source) { CHECK_EQ(mSource, NULL); mSource = source; @@ -172,6 +167,7 @@ void AudioPlayer::stop() { mPositionTimeMediaUs = -1; mPositionTimeRealUs = -1; mSeeking = false; + mReachedEOS = false; mStarted = false; } @@ -180,6 +176,16 @@ void AudioPlayer::AudioCallback(int event, void *user, void *info) { static_cast<AudioPlayer *>(user)->AudioCallback(event, info); } +bool AudioPlayer::isSeeking() { + Mutex::Autolock autoLock(mLock); + return mSeeking; +} + +bool AudioPlayer::reachedEOS() { + Mutex::Autolock autoLock(mLock); + return mReachedEOS; +} + // static void AudioPlayer::AudioSinkCallback( MediaPlayerBase::AudioSink *audioSink, @@ -203,6 +209,11 @@ void AudioPlayer::fillBuffer(void *data, size_t size) { LOGV("AudioCallback"); } + if (mReachedEOS) { + memset(data, 0, size); + return; + } + size_t size_done = 0; size_t size_remaining = size; while (size_remaining > 0) { @@ -227,24 +238,16 @@ void AudioPlayer::fillBuffer(void *data, size_t size) { CHECK((err == OK && mInputBuffer != NULL) || (err != OK && mInputBuffer == NULL)); - if (mSeeking) { - mSeeking = false; + Mutex::Autolock autoLock(mLock); - if (mListenerCallback) { - (*mListenerCallback)(mListenerCookie, SEEK_COMPLETE); - } - } + mSeeking = false; if (err != OK) { - if (mListenerCallback) { - (*mListenerCallback)(mListenerCookie, REACHED_EOS); - } - + mReachedEOS = true; memset((char *)data + size_done, 0, size_remaining); break; } - Mutex::Autolock autoLock(mLock); CHECK(mInputBuffer->meta_data()->findInt64( kKeyTime, &mPositionTimeMediaUs)); @@ -319,6 +322,7 @@ status_t AudioPlayer::seekTo(int64_t time_us) { Mutex::Autolock autoLock(mLock); mSeeking = true; + mReachedEOS = false; mSeekTimeUs = time_us; return OK; |