首页 > Android, Multimedia > Android源码阅读笔记:StageFright中的事件驱动机制

Android源码阅读笔记:StageFright中的事件驱动机制

2011-12-17 21:36 星期六    浏览: 4,930    绿 发表评论 阅读评论

based on ICS

事件驱动机制
在目录frameworks/base/media/libstagefright/foundation/下定义了stagefright需要使用的基础类,生成动态链接库文件libstagefright_foundation.so。事件驱动机制就在该库中实现,主要由ALooper、AHandler、AMessage和ALooperRoster等类完成。StageFright中的OMX软编解码将使用它们。
消息的发送
调用者可以使用ALooper的post函数发送消息,并指定一个延迟时间即何时处理该消息。在post函数中,将消息(AMessage)和需要在何时处理它封装成Event,添加到ALooper维护的队列mEventQueue上中,然后由循环线程去处理它。下面是post函数(见文件ALooper.cpp):

消息处理循环的启动
开启消息处理过程,需要调用start函数。在start函数中,要么使用调用者的线程,要么它自己启动一个线程,这通过一个参数runOnCallingThread来指定,见下面的代码示例(见文件ALooper.cpp):

线程循环与消息处理
在线程里,调用ALooper的loop循环函数,不断去检查mEventQueue队列上是否有event事件以及是否达到执行时间。若有并到了指定时间,则调用
gLooperRoster.deliverMessage(event.mMessage);
分发事件消息,从而最终调用AHandler去处理消息:
handler->onMessageReceived(msg);
去处理消息。loop函数代码如下(见文件ALooper.cpp):

ALooperRoster的分发处理函数如下,它根据待处理消息msg中的target得到相关信息,即由谁(即哪个handler的info)来处理msg。查找到handler info索引后得到弱指针,提升为强指针后,不为空的情况下则调用handler的onMessageReceived去处理消息。
消息处理是AHandler子类完成的,子类实现其纯虚函数onMessageReceived用于处理队列上的某个时刻的Amessage消息。

文件hexdump.cpp中的hexdump函数用于将某块内存区域中的数据以16进制的形式输出出来,用于调试。在ICS版本中,还添加了状态机AHierarchicalStateMachine(见AHierarchicalStateMachine.cpp),但暂时还没有用到它。

本文链接地址: http://blog.redwolf-soft.com/?p=1027

原创文章,版权©红狼博客所有, 转载随意,但请注明出处。

    分享到:

相关文章:

  • 无相关文章
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
订阅评论
  欢迎参与讨论,请在这里发表您的看法、交流您的观点。