最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

阅读mediaplayer源代码

来源:动视网 责编:小OO 时间:2025-09-28 12:42:23
文档

阅读mediaplayer源代码

阅读mediaplayer源代码(first)第一次阅读mediaplayer源代码 2006-1-3 mediaplayer源代码是BREWSDK3.1.4中自带的,一个简单的多媒体应用,2000多行代码,实现了一个支持音频、视频和图片播放,还支持录音的程序。该程序出自高通公司内部开发人员之手,其与高通BREW平台的其他底层应用的实现有异曲同工之妙。该程序的实现充分利用了贯穿于BREW平台的QInterface宏,用C语言巧妙地模仿了面向对象中的多态,继承等特点。感兴趣的朋友,可以在高通的网
推荐度:
导读阅读mediaplayer源代码(first)第一次阅读mediaplayer源代码 2006-1-3 mediaplayer源代码是BREWSDK3.1.4中自带的,一个简单的多媒体应用,2000多行代码,实现了一个支持音频、视频和图片播放,还支持录音的程序。该程序出自高通公司内部开发人员之手,其与高通BREW平台的其他底层应用的实现有异曲同工之妙。该程序的实现充分利用了贯穿于BREW平台的QInterface宏,用C语言巧妙地模仿了面向对象中的多态,继承等特点。感兴趣的朋友,可以在高通的网
阅读mediaplayer源代码(first)

第一次阅读mediaplayer源代码

 

2006-1-3

 

mediaplayer源代码是BREW SDK 3.1.4中自带的,一个简单的多媒体应用,2000多行代码,实现了一个支持音频、视频和图片播放,还支持录音的程序。该程序出自高通公司内部开发人员之手,其与高通BREW平台的其他底层应用的实现有异曲同工之妙。该程序的实现充分利用了贯穿于BREW平台的QInterface宏,用C语言巧妙地模仿了面向对象中的多态,继承等特点。感兴趣的朋友,可以在高通的网站上下载最新的SDK安装后,在BREW 3.1.4\\sdk\\examples\\mediaplayer中可以找到对应的源代码。

由于是第一次阅读,很多东西理解还不深刻,叙述难免有偏差,希望大虾们人过留言,帮忙指出错误。

给出下载SDK的地址:https://brewx.qualcomm.com/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(IWindow)的vtbl,然后用MP_IWINDOW_SETVTBL宏给这个vtbl初始化,然后调用CWindow_New,把整个vtbl当成第三个参数传递进去,那么对应于不同的子类,虽然都调用的是IWindow->HandleEvent函数,不过却有了不同的行为,这就是对面向对象多态的精致模仿。

文档

阅读mediaplayer源代码

阅读mediaplayer源代码(first)第一次阅读mediaplayer源代码 2006-1-3 mediaplayer源代码是BREWSDK3.1.4中自带的,一个简单的多媒体应用,2000多行代码,实现了一个支持音频、视频和图片播放,还支持录音的程序。该程序出自高通公司内部开发人员之手,其与高通BREW平台的其他底层应用的实现有异曲同工之妙。该程序的实现充分利用了贯穿于BREW平台的QInterface宏,用C语言巧妙地模仿了面向对象中的多态,继承等特点。感兴趣的朋友,可以在高通的网
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top