在stagefright中,所有操作,实际都是调用AwesomePlayer完成的。
AwesomePlayer中的触发事件,是通过TimedEventQueue完成的。
TimedEventQueue是一个事件触发器,当给定的时间到达后,触发TimedEventQueue::Event
Event是以queue进行管理的
TimedEventQueue::TimedEventQueue()
: mNextEventID(1),
mRunning(false), //标志queue已经开始run了
mStopped(false) { //标志queue还在stop
}
void TimedEventQueue::start() {
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&mThread, &attr, ThreadWrapper, this); //创建queue线程
pthread_attr_destroy(&attr);
}
void TimedEventQueue::stop(bool flush) {
if (flush) {
postEventToBack(new StopEvent);
} else {
postTimedEvent(new StopEvent, INT64_MIN); //清空queue中的event
}
void *dummy;
pthread_join(mThread, &dummy);
mQueue.clear();
}
//下面是event的控制函数
// Posts an event to the front of the queue (after all events that
// have previously been posted to the front but before timed events).
event_id postEvent(const sp<Event> &event);
event_id postEventToBack(const sp<Event> &event);
// It is an error to post an event with a negative delay.
event_id postEventWithDelay(const sp<Event> &event, int64_t delay_us);
// If the event is to be posted at a time that has already passed,
// it will fire as soon as possible.
event_id postTimedEvent(const sp<Event> &event, int64_t realtime_us);
// Returns true iff event is currently in the queue and has been
// successfully cancelled. In this case the event will have been
// removed from the queue and won't fire.
bool cancelEvent(event_id id);
// Cancel any pending event that satisfies the predicate.
// If stopAfterFirstMatch is true, only cancels the first event
// satisfying the predicate (if any).
void cancelEvents(
bool (*predicate)(void *cookie, const sp<Event> &event),
void *cookie,
bool stopAfterFirstMatch = false);
void TimedEventQueue::threadEntry() {
........
if (event != NULL) {
// Fire event with the lock NOT held.
event->fire(this, now_us); //当达到触发时间后,event->fire
}
}
//在AwesomePlayer中的成员mQueue,所有event都是由其管理
TimedEventQueue mQueue;
//在AwesomePlayer中Event事件被封装了一层:
struct AwesomeEvent : public TimedEventQueue::Event {
}
// 触发时,通过调用注册的方法实现,其不关心是哪样的方法,只是去触发这个方法
virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) {
(mPlayer->*mMethod)();
}
AwesomePlayer::AwesomePlayer() {
mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent);
mVideoEventPending = false;
mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone);
mStreamDoneEventPending = false;
mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate);
mBufferingEventPending = false;
mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate);
mVideoEventPending = false;
mCheckAudioStatusEvent = new AwesomeEvent(
this, &AwesomePlayer::onCheckAudioStatus);
mAudioStatusEventPending = false;
}
//以mVideoEvent为例:
mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent);
AwesomePlayer::onVideoEvent()是其触发的method