am be045061: Merge "Instead of constantly polling the AudioPlayer to see if it reached EOS or finished seeking, initiate the notification from the AudioPlayer when the event happens." into gingerbread

Merge commit 'be0450619528e65eebfa1d7eab78fde757d094cc' into gingerbread-plus-aosp

* commit 'be0450619528e65eebfa1d7eab78fde757d094cc':
  Instead of constantly polling the AudioPlayer to see if it reached EOS or finished seeking, initiate the notification from the AudioPlayer when the event happens.
This commit is contained in:
Andreas Huber
2010-09-28 12:05:08 -07:00
committed by Android Git Automerger
4 changed files with 32 additions and 9 deletions

View File

@@ -27,6 +27,7 @@ namespace android {
class MediaSource; class MediaSource;
class AudioTrack; class AudioTrack;
class AwesomePlayer;
class AudioPlayer : public TimeSource { class AudioPlayer : public TimeSource {
public: public:
@@ -35,7 +36,9 @@ public:
SEEK_COMPLETE SEEK_COMPLETE
}; };
AudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink); AudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink,
AwesomePlayer *audioObserver = NULL);
virtual ~AudioPlayer(); virtual ~AudioPlayer();
// Caller retains ownership of "source". // Caller retains ownership of "source".
@@ -91,6 +94,7 @@ private:
MediaBuffer *mFirstBuffer; MediaBuffer *mFirstBuffer;
sp<MediaPlayerBase::AudioSink> mAudioSink; sp<MediaPlayerBase::AudioSink> mAudioSink;
AwesomePlayer *mObserver;
static void AudioCallback(int event, void *user, void *info); static void AudioCallback(int event, void *user, void *info);
void AudioCallback(int event, void *info); void AudioCallback(int event, void *info);

View File

@@ -27,9 +27,13 @@
#include <media/stagefright/MediaSource.h> #include <media/stagefright/MediaSource.h>
#include <media/stagefright/MetaData.h> #include <media/stagefright/MetaData.h>
#include "include/AwesomePlayer.h"
namespace android { namespace android {
AudioPlayer::AudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink) AudioPlayer::AudioPlayer(
const sp<MediaPlayerBase::AudioSink> &audioSink,
AwesomePlayer *observer)
: mAudioTrack(NULL), : mAudioTrack(NULL),
mInputBuffer(NULL), mInputBuffer(NULL),
mSampleRate(0), mSampleRate(0),
@@ -45,7 +49,8 @@ AudioPlayer::AudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink)
mIsFirstBuffer(false), mIsFirstBuffer(false),
mFirstBufferResult(OK), mFirstBufferResult(OK),
mFirstBuffer(NULL), mFirstBuffer(NULL),
mAudioSink(audioSink) { mAudioSink(audioSink),
mObserver(observer) {
} }
AudioPlayer::~AudioPlayer() { AudioPlayer::~AudioPlayer() {
@@ -301,6 +306,9 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {
} }
mSeeking = false; mSeeking = false;
if (mObserver) {
mObserver->postAudioSeekComplete();
}
} }
} }
@@ -323,6 +331,10 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {
Mutex::Autolock autoLock(mLock); Mutex::Autolock autoLock(mLock);
if (err != OK) { if (err != OK) {
if (mObserver && !mReachedEOS) {
mObserver->postAudioEOS();
}
mReachedEOS = true; mReachedEOS = true;
mFinalStatus = err; mFinalStatus = err;
break; break;

View File

@@ -639,7 +639,7 @@ status_t AwesomePlayer::play_l() {
if (mAudioSource != NULL) { if (mAudioSource != NULL) {
if (mAudioPlayer == NULL) { if (mAudioPlayer == NULL) {
if (mAudioSink != NULL) { if (mAudioSink != NULL) {
mAudioPlayer = new AudioPlayer(mAudioSink); mAudioPlayer = new AudioPlayer(mAudioSink, this);
mAudioPlayer->setSource(mAudioSource); mAudioPlayer->setSource(mAudioSource);
// We've already started the MediaSource in order to enable // We've already started the MediaSource in order to enable
@@ -666,8 +666,6 @@ status_t AwesomePlayer::play_l() {
} else { } else {
mAudioPlayer->resume(); mAudioPlayer->resume();
} }
postCheckAudioStatusEvent_l();
} }
if (mTimeSource == NULL && mAudioPlayer == NULL) { if (mTimeSource == NULL && mAudioPlayer == NULL) {
@@ -1169,7 +1167,7 @@ void AwesomePlayer::postCheckAudioStatusEvent_l() {
return; return;
} }
mAudioStatusEventPending = true; mAudioStatusEventPending = true;
mQueue.postEventWithDelay(mCheckAudioStatusEvent, 100000ll); mQueue.postEvent(mCheckAudioStatusEvent);
} }
void AwesomePlayer::onCheckAudioStatus() { void AwesomePlayer::onCheckAudioStatus() {
@@ -1200,8 +1198,6 @@ void AwesomePlayer::onCheckAudioStatus() {
mFlags |= FIRST_FRAME; mFlags |= FIRST_FRAME;
postStreamDoneEvent_l(finalStatus); postStreamDoneEvent_l(finalStatus);
} }
postCheckAudioStatusEvent_l();
} }
status_t AwesomePlayer::prepare() { status_t AwesomePlayer::prepare() {
@@ -1662,5 +1658,13 @@ uint32_t AwesomePlayer::flags() const {
return mExtractorFlags; return mExtractorFlags;
} }
void AwesomePlayer::postAudioEOS() {
postCheckAudioStatusEvent_l();
}
void AwesomePlayer::postAudioSeekComplete() {
postCheckAudioStatusEvent_l();
}
} // namespace android } // namespace android

View File

@@ -92,6 +92,9 @@ struct AwesomePlayer {
// This is a mask of MediaExtractor::Flags. // This is a mask of MediaExtractor::Flags.
uint32_t flags() const; uint32_t flags() const;
void postAudioEOS();
void postAudioSeekComplete();
private: private:
friend struct AwesomeEvent; friend struct AwesomeEvent;