BREW SDK的Media程序分析

 
SDK的Media程序分析
一,窗口的处理
1,窗口的接口定义
// This is a generic IWindow interface.
typedef struct _IWindow IWindow;
QINTERFACE(IWindow)
{
   // Enables/Disables the window. Window controls will not process
   // events if the window is disabled.
   void     (*Enable)(IWindow * po, boolean bEnable);
   // Redraws the window if enabled
   void     (*Redraw)(IWindow * po);
   // Handles the events routed to the window
   boolean (*HandleEvent)(IWindow * po, AEEEvent eCode, uint16 wParam, uint32 dwParam);
   // Releases the window resources
   void     (*Delete)(IWindow * po);
};
他将被扩展为:
typedef struct _IWindow IWindow ;
struct _IWindow {
       IWindowVtbl * pvt ;
} ;
虚函数表如下:
函数指针
作用
Enable
Enable窗口以便能够接收event
Redraw
Redraw窗口
HandleEvent
窗口的事件处理
Delete
释放窗口资源,包括窗口所用的内存资源,以及该窗口管理的其他资源
注意:该接口不支持AddRef,Release,QueryInterface等函数。
2,窗口的种类
窗口名
作用
CMainWin
主窗口,显示窗口的logo及菜单项
CFileListWin
显示文件列表的窗口
CPlayerWin
播放窗口
这些窗口的结构体的第一个数据成员都是 INHERIT_CWindow(IWindow) ,从而从 IWindow 继承,这样他就代表了窗口。这就是 c 风格的继承,和 vtbl 。和 c++ 的继承, vtbl 比较来看,基本思想都是一样的,完成的功能也是相同的。
3,窗口的event处理
所有的event都传递到IApplet的实现的HandleEvent函数中,在该函数中,再进行event的Dispatch处理或直接处理。
比如主窗口中有三个菜单项,[Play File…] [Record QCP File…] [About],当用户点击其中一项Menu时,EVT_COMMAND将被送往IApplet的HandleEvent中,该函数在接到EVT_COMMAND事件时,将 dispatch给IWindow的HandleEvent进行最终的event处理。摘抄的代码如下:
case EVT_KEY:                  // Process key event
case EVT_COMMAND:           // Process menu command event
case EVT_CREATEMEDIA:       // Create media
case EVT_CREATEMEDIA_QCP: // Create IMediaQCP for recoring
case EVT_COPYRIGHT_END:     // Copyright dialog ended
   if (pme->m_pWin)
       return IWINDOW_HandleEvent(pme->m_pWin, eCode, wParam, dwParam);
m_pWin代表了当前的窗口
4,窗口的切换处理
切换时,首先是放源窗口的资源,然后申请新窗口的资源。
二,Applet的实现
1,结构体
// MediaPlayer app global structure.
// Note: m_bPlugin == TRUE indicates that MediaPlayer tries to
// play the file directly in CPlayerWin. Pressing CLR will close
// the app.
//
struct CMediaPlayer
{
   AEEApplet         a;
int                m_cxWidth;
int                m_cyHeight;
   uint16            m_nColorDepth;
   int               m_nNChSize;    // Large char size
   int               m_nLChSize;    // Normal char size
   IImage *          m_pHdrImage;
   AEERect           m_rectHdr;
   MPWindow          m_eActiveWin; // Active window
   MPWindow          m_eSuspendWin; // Suspended window
   IWindow *         m_pWin;
   uint16            m_wMainWin;    // CurSel of CMainWin
   uint16            m_wFileListWin;// CurSel of CFileListWin
   char *            m_pszAudioExt; // Registered audio extension string: "mid, mp3, ..."
   char *            m_pszVideoExt; // Registered video extension string: "pmd, ..."
   char *            m_pszImageExt; // Registered image extension string: "bmp, png, ..."
 
   AEECallback       m_cbRedraw;
   flg               m_bRedraw:1;   // Processing redraw
   flg               m_bPlugin:1;   // = TRUE, if MediaPlayer is in Plugin mode.
};
三,主界面
1,程序的启动
Ø         IApplet的初始化
Ø         取得Device信息,包括屏幕的宽度,高度,color depth等基本信息
Ø         取得普通字体,大字体的字体大小
Ø         利用ISHELL_LoadResImage从资源文件中取得header图片(IImage*),在IApplet的Free函数中,将释放该图片资源
Ø         初始化Callback函数结构体,该函数为CMediaPlayer_RedrawNotify,用来完成窗口的重绘。
Ø         主窗口的创建
²        分配窗口所需的内存资源(包括虚函数表),并设置虚函数表指针
²        从资源文件中取得logo图片,并设置Frames为2,Rate为500。以下为SDK中的文档 [ The IImage Interface supports the display of animated bitmaps. An animated bitmap consists of multiple frames that are side by side along the width of the bitmap (for example, an animated bitmap with four 20x20 frames is 80 pixels wide and 20 pixels high).]。播放animated图像时使用函数IIMAGE_Start
²        创建MENUCTL控件,并设置控件的风格,颜色,选中时,为选中时的颜色等信息
²        向该MENUCTL中追加3个菜单项,通过 IMENUCTL_AddItemEx函数,来控制菜单项中的文字和image,等信息。文字和image都可以来自于资源文件
Ø         Splash的显示
Ø         第一次显示的话,取得logo图片,并显示该静态的logo图片。并设置timer,该timer将再次调用splash显示函数。
Ø         否则,调用CMediaPlayer_SetWindow函数,而Redraw主窗口,以下是主窗口的redraw逻辑, 该调用是通过 callback 机制来完成的,因为 BREW 规定处理必须尽可能快的完成
²        以静态的方式显示header图片
²        以animated的方式显示logo图片
²        显示菜单项
Ø         总结:显示顺序如下为首先显示静态的logo图片,然后由timer驱动CMediaPlayer_Redraw的调用,它又通过callback的机制调用主窗口的redraw,完成整个的显示过程。该动画过程是由于IImage_start来完成的。
Ø         注意:关于timer,摘抄的文档如下[ Timers do not repeat. The user must reset the timer if they desire a repeating timer.],在这一点儿上,和Windows的timer是不同的。
2,   About菜单项的处理
Ø         显示header图片
Ø         通过ISHELL_ShowCopyright函数,显示从mif文件中获取的程序名,程序图标,版权信息,module版本等信息
Ø         当对话框结束时,IApplet的HandleEvent收到EVT_COPYRIGHT_END事件,并dispatch给主窗口的HandleEvent,最终重新绘制主窗口
3,进度条的处理
Ø         IDISPLAY_DrawFrame来绘制边框
Ø         IDISPLAY_FillRect来绘制进度条,该rect不断变化
四,文件的播放
Ø         参考SDK的API文档的IMedia – Setup章节,来初始化IMedia接口
Ø         参考SDK的API文档的IMedia – Play章节,来处理播放事件。需要注意的是, 所有的处理都是异步方式的。调用API来取得总时间,该API马上返回,等到BREW处理完该请求后,通过调用用户已经注册的callback函数,来通知client,该事件已经完成。包括play的start事件,play过程中的TICK_UPDATE事件等等
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值