全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
阅读mediaplayer源代码(first)第一次阅读mediaplayer源代码2006-1-3mediaplayer源代码是BREW SDK 3.1.4中自带的,一个简单的多媒体应用,2000多行代码,实现了一个支持音频、视频和图片播放,还支持录音的程序。该程序出自高通公司内部开发人员之手,其与高通BREW平台的其他底层应用的实现有异曲同工之妙。该程序的实现充分利用了贯穿于BREW平台的QInterface宏,用C语言巧妙地模仿了面向对象中的多态,继承等特点。感兴趣的朋友,可以在高通的网站上下载最新的SDK安装后,在BREW 3.1.4sdkexamplesmediaplayer中可以找到对应的源代码。由于是第一次阅读,很多东西理解还不深刻,叙述难免有偏差,希望大虾们人过留言,帮忙指出错误。给出下载SDK的地址:/brew/sdk/download.jsp/下面是一些结构体的展开,从阅读代码的角度来说,莫名其妙的宏定义给阅读带来了不少麻烦,但是对于程序开发人员来说,精致的宏定义又给开发带来不小的渐变性,从阅读的角度来说,把宏展开,可以清晰地看到程序设计的脉络,不过在开发的过程中,可以直接使用宏,减少代码的输入量,同时也能保证伴随BREW平台升级所带来的兼容性问题。原定义typedef struct _IWindow IWindow;QINTERFACE(IWindow) void (*Enable)(IWindow * po, boolean bEnable); void (*Redraw)(IWindow * po); boolean (*HandleEvent)(IWindow * po, AEEEvent eCode, uint16 wParam, uint32 dwParam); void (*Delete)(IWindow * po);展开后实际定义typedef struct _IWindow IWindow;struct _IWindow struct IWindowVtbl *pvt;typedef struct IWindowVtbl IWindowVtbl;struct IWindowVtbl void (*Enable)(IWindow * po, boolean bEnable); void (*Redraw)(IWindow * po); boolean (*HandleEvent)(IWindow * po, AEEEvent eCode, uint16 wParam, uint32 dwParam); void (*Delete)(IWindow * po);/注意,其实以下的两者是一样的。#define VTBL(iname)iname#Vtbl#define AEEVTBL(iname)iname#Vtbl/定义了枚举类型MPWindow(程序窗口类型)和MPPlayerWin(播放窗口类型:play,record,image)/关于内部几个关键结构体的创建。#define INHERIT_CWindow(iname) DECLARE_VTBL(iname) CMediaPlayer * m_pOwner; IShell * m_pIShell; IDisplay * m_pIDisplay; flg m_bActive:1从命名的角度来看,主要是用来继承父类,虽然是C不过仍然用C+的思想来设计。CWindow是一个基类,其他所有显示的window都是根据这个基类派生出来的。用INHERIT_CWindow这个宏来完成派生功能。/ Base class of all IWindow objects.struct CWindow IWindow vtIWindow; CMediaPlayer * m_pOwner; IShell * m_pIShell; IDisplay * m_pIDisplay; flg m_bActive:1;对应创建函数CWindow_New/ Main window: Displays main menu.struct CMainWin /从这个地方,我们就简单的认为,CMainWin是从CWindow派生出来的,它继承了CWindow的所有数据成员和IWindow的函数指针 IWindow vtIWindow; CMediaPlayer * m_pOwner; IShell * m_pIShell; IDisplay * m_pIDisplay; flg m_bActive:1; IImage * m_pLogo; AEERect m_rectLogo; IMenuCtl * m_pMainMenu; flg m_bAbout:1; /?为什么会有两个flg,如何使两者不冲突;对应创建函数CMainWin_New同样的道理适用于:CFileListWin(对应创建函数CFileListWin_New)、CPlayerWin(对应创建函数CPlayerWin_New)CProgCtl这个结构体是表示进程条和标题。子类的创建函数xxx_new(),会调用父类的创建函数CWindow_New,先创建CWindow,然后再实例化其自身的成员。/关于消息传递,大概是这样,消息产生,系统调用CMediaPlayer_HandleEvent来处理消息,对于一些可以被处理的消息:EVT_APP_START、EVT_APP_BROWSE_FILE、EVT_APP_STOP、EVT_APP_SUSPEND、EVT_APP_RESUME,函数会调用相关的函数相应消息,对于一些在本函数内无法被处理的消息:EVT_KEY、EVT_COMMAND、EVT_CREATEMEDIA、EVT_CREATEMEDIA_QCP、EVT_COPYRIGHT_END则会调用IWINDOW_HandleEvent来处理消息。而IWINDOW_HandleEvent只是个宏,实际上它是:GET_PVTBL(p, IWindow)-HandleEvent(p, e, w, dw)实际上就是:(IWindow *)p)-pvt-HandleEvent(p, e, w, dw)对应的p指针所指向的地址的不同,消息会分发的不同的HandleEvent函数里头,作相应的处理,然后返回TRUE/HandleEvent函数指针的初始化,对于父类CWindow,其Vtbl的初始化是从CWindow_New函数的第三个参数传递进来的,对于CWindow他无法选择自己的Vtbl。而对于其子类和子类对应的XXX_New函数,首先它会申请一个 VTBL(IW
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年文旅改造数字化转型协议
- 2026年快消建设系统集成协议
- 2026年安防采购数字化转型协议
- 2026年工地食堂炊事员食品安全与营养培训
- 2026年幼儿园食品安全家长告知书
- 2026年奥特莱斯品牌折扣店货品组织与营销
- 2026-2030中国易拉宝行业竞争分析及发展前景预测报告
- 2026年高中文言文人物传记类文本阅读技巧
- 渝水区江西新余市渝州公证处公开招聘笔试历年参考题库典型考点附带答案详解
- 清远市2025年广东清远市清城区总工会招聘3人笔试历年参考题库典型考点附带答案详解
- 2026江苏扬州市宝应城市发展控股有限公司招聘9人笔试参考题库及答案解析
- 2025年入团考试题及答案
- 传染病防控中的伦理与科技应用
- 2025湖北随州国有资本投资运营集团有限公司人员招聘27人笔试历年参考题库附带答案详解
- 健康管理技术与实施方案手册
- 2026江苏有线常熟分公司招聘人岗相适度测评笔试及笔试历年参考题库附带答案详解
- 《深度学习:走向核心素养》基本框架和阅读摘录
- 2026上海市中考地理考前一周加分卷含答案
- oa系统制度审批流程
- 2026陕西演艺集团有限公司招聘备考题库及答案详解(历年真题)
- (2026版)公路工程建设项目安全生产费用清单及计量规范课件
评论
0/150
提交评论