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
This commit is contained in:
committed by
Android (Google) Code Review
commit
be04506195
@@ -27,6 +27,7 @@ namespace android {
|
||||
|
||||
class MediaSource;
|
||||
class AudioTrack;
|
||||
class AwesomePlayer;
|
||||
|
||||
class AudioPlayer : public TimeSource {
|
||||
public:
|
||||
@@ -35,7 +36,9 @@ public:
|
||||
SEEK_COMPLETE
|
||||
};
|
||||
|
||||
AudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink);
|
||||
AudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink,
|
||||
AwesomePlayer *audioObserver = NULL);
|
||||
|
||||
virtual ~AudioPlayer();
|
||||
|
||||
// Caller retains ownership of "source".
|
||||
@@ -91,6 +94,7 @@ private:
|
||||
MediaBuffer *mFirstBuffer;
|
||||
|
||||
sp<MediaPlayerBase::AudioSink> mAudioSink;
|
||||
AwesomePlayer *mObserver;
|
||||
|
||||
static void AudioCallback(int event, void *user, void *info);
|
||||
void AudioCallback(int event, void *info);
|
||||
|
||||
@@ -27,9 +27,13 @@
|
||||
#include <media/stagefright/MediaSource.h>
|
||||
#include <media/stagefright/MetaData.h>
|
||||
|
||||
#include "include/AwesomePlayer.h"
|
||||
|
||||
namespace android {
|
||||
|
||||
AudioPlayer::AudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink)
|
||||
AudioPlayer::AudioPlayer(
|
||||
const sp<MediaPlayerBase::AudioSink> &audioSink,
|
||||
AwesomePlayer *observer)
|
||||
: mAudioTrack(NULL),
|
||||
mInputBuffer(NULL),
|
||||
mSampleRate(0),
|
||||
@@ -45,7 +49,8 @@ AudioPlayer::AudioPlayer(const sp<MediaPlayerBase::AudioSink> &audioSink)
|
||||
mIsFirstBuffer(false),
|
||||
mFirstBufferResult(OK),
|
||||
mFirstBuffer(NULL),
|
||||
mAudioSink(audioSink) {
|
||||
mAudioSink(audioSink),
|
||||
mObserver(observer) {
|
||||
}
|
||||
|
||||
AudioPlayer::~AudioPlayer() {
|
||||
@@ -301,6 +306,9 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {
|
||||
}
|
||||
|
||||
mSeeking = false;
|
||||
if (mObserver) {
|
||||
mObserver->postAudioSeekComplete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -323,6 +331,10 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {
|
||||
Mutex::Autolock autoLock(mLock);
|
||||
|
||||
if (err != OK) {
|
||||
if (mObserver && !mReachedEOS) {
|
||||
mObserver->postAudioEOS();
|
||||
}
|
||||
|
||||
mReachedEOS = true;
|
||||
mFinalStatus = err;
|
||||
break;
|
||||
|
||||
@@ -639,7 +639,7 @@ status_t AwesomePlayer::play_l() {
|
||||
if (mAudioSource != NULL) {
|
||||
if (mAudioPlayer == NULL) {
|
||||
if (mAudioSink != NULL) {
|
||||
mAudioPlayer = new AudioPlayer(mAudioSink);
|
||||
mAudioPlayer = new AudioPlayer(mAudioSink, this);
|
||||
mAudioPlayer->setSource(mAudioSource);
|
||||
|
||||
// We've already started the MediaSource in order to enable
|
||||
@@ -666,8 +666,6 @@ status_t AwesomePlayer::play_l() {
|
||||
} else {
|
||||
mAudioPlayer->resume();
|
||||
}
|
||||
|
||||
postCheckAudioStatusEvent_l();
|
||||
}
|
||||
|
||||
if (mTimeSource == NULL && mAudioPlayer == NULL) {
|
||||
@@ -1169,7 +1167,7 @@ void AwesomePlayer::postCheckAudioStatusEvent_l() {
|
||||
return;
|
||||
}
|
||||
mAudioStatusEventPending = true;
|
||||
mQueue.postEventWithDelay(mCheckAudioStatusEvent, 100000ll);
|
||||
mQueue.postEvent(mCheckAudioStatusEvent);
|
||||
}
|
||||
|
||||
void AwesomePlayer::onCheckAudioStatus() {
|
||||
@@ -1200,8 +1198,6 @@ void AwesomePlayer::onCheckAudioStatus() {
|
||||
mFlags |= FIRST_FRAME;
|
||||
postStreamDoneEvent_l(finalStatus);
|
||||
}
|
||||
|
||||
postCheckAudioStatusEvent_l();
|
||||
}
|
||||
|
||||
status_t AwesomePlayer::prepare() {
|
||||
@@ -1662,5 +1658,13 @@ uint32_t AwesomePlayer::flags() const {
|
||||
return mExtractorFlags;
|
||||
}
|
||||
|
||||
void AwesomePlayer::postAudioEOS() {
|
||||
postCheckAudioStatusEvent_l();
|
||||
}
|
||||
|
||||
void AwesomePlayer::postAudioSeekComplete() {
|
||||
postCheckAudioStatusEvent_l();
|
||||
}
|
||||
|
||||
} // namespace android
|
||||
|
||||
|
||||
@@ -92,6 +92,9 @@ struct AwesomePlayer {
|
||||
// This is a mask of MediaExtractor::Flags.
|
||||
uint32_t flags() const;
|
||||
|
||||
void postAudioEOS();
|
||||
void postAudioSeekComplete();
|
||||
|
||||
private:
|
||||
friend struct AwesomeEvent;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user