summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/AudioPlayer.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-02-03 11:37:29 -0800
committerAndreas Huber <andih@google.com>2010-02-03 13:24:26 -0800
commit1862a33b246249630b654182afb5914da3480d4c (patch)
tree60a1a9875e6c6a1b64aa7685021c18e6ef540884 /media/libstagefright/AudioPlayer.cpp
parent2eeabb1f98d162786b45a09659674025a0559251 (diff)
downloadframeworks_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.cpp38
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;