基于MiniGUI的嵌入式媒体播放器的设计与实现
摘要:随着嵌入式系统的不断发展,处理器性能的不断提升,存储系统容量的不断扩大,各种多媒体应用程序被移植到嵌入式系统中,多媒体组件成为其不可或缺的重要组成部分。本文在比较如今流行的几种嵌入式图形系统的基础上,提出了基于MiniGUI的嵌入式媒体播放器的设计与实现方法。 关键词:嵌入式系统;嵌入式图形系统;MiniGUI;媒体播放器 1 引言 随着嵌入式系统的不断发展,处理器性能的不断提升,存储系统容量的不断扩大,各种多媒体应用程序被移植到嵌入式系统中,多媒体组件成为其不可或缺的重要组成部分。嵌入式多媒体播放器的开发是当前 IT产业的热点之一 ,呈现了巨大的市场需求。与些同时,播放器功能复杂化和普及化对产品的交互界面提出了更高的要求。现在许多高端手机和PDA 产品上已经有了多媒体播放器,可是和PC 机上的播放器相比现有的这些播放器的功能都有待进一步增强。 将现代窗口和图形威廉希尔官方网站
带入到嵌入式设备的 MiniGUI,是一个非常适合于实时嵌入式设备的高效、可靠、可定制、小巧灵活的跨操作系统的图形用户界面支持系统。它采用类Win32的API接口,是一个多窗口GUI支持系统。本文首先比较各种嵌入式图形系统,然后提出基于MiniGUI的嵌入式媒体播放器的设计与实现方法。 2 各种嵌入式图形系统之比较 目前,流行的面向嵌入式系统的图形系统有MicoroWindows/NanoX、Qt/Embedded、MiniGUI、DirectFB、PicoGUI以及GTK+/FB等。它们中的大多数遵循LGPL条款发布,而MicoroWindows/NanoX遵循的是MGPL,Qt/Embedded采用QGPL条款发布。 MicroWindows/NanoX能够在没有任何操作系统或其他图形系统的支持下运行,它能对裸显示设备进行直接操作。这样,MicroWindows就显得十分小巧,便于移植到各种硬件和软件系统上。然而MicroWindows/NanoX的免费版本开发进展慢,而且缺乏全面专业的威廉希尔官方网站
支持。 Qt/Embedded功能强大,但是,由于它是基于C++类库的,所以和其他GUI相比系统消耗资源较大,一般应用于手持式高端信息产品。 GTK+/FB与Qt/Embedded类似,跳过X层直接与FrameBuffer沟通,也具有Qt/Embedded的几项优点,但发展速度缓慢。 DirectFB是专注于Linux FrameBuffer加速的一个图形库,并试图建立一个兼容GTK的嵌入式GUI系统。 PicoGUI是一种新型的小巧的嵌入式图形系统。同X Windows系统一样具有一个弹性的客户服务端架构。PicoGUI将字体,位图,窗口小部件,以及其他应用程序需要的东西都直接建立在服务器上,与X Windows相比,虽然灵活性有所降低,但速度显著提升、体积大大缩小。 MiniGUI为实时嵌入式操作系统提供了非常完善的图形及用户界面支持。MiniGUI本身的可移植性设计,使得不论在哪个硬件平台,哪种操作系统上运行,MiniGUI均能为上层应用程序提供一致的应用程序编程接口(API)。MiniGUI小巧、灵活且对中文的支持性最好。 3 设计与实现 3.1播放器总体结构 本文中的播放器采用MiniGUI作为底层图形库,用于生成用户界面以及读写FrameBuffer。基于MiniGUI的嵌入式系统总体架构如图1所示。
图1 基于MiniGUI的嵌入式系统总体架构 播放器软件总体结构如图2所示,它主要由三部分组成,分别是图形用户界面模块、系统管理主控模块和音/视频解码器。三部分功能设计如下面所述: 图形用户界面模块通过事件/消息机制和系统管理主控模块交互。 音/视频解码器模块可以看作是系统管理主控模块的插件(plug-in),从系统管理主控模块获得编码的音/视频数据并对其解码后发送己解码的音/视频数据给系统管理主控模块。 系统管理主控模块则负责网络数据的接收和解析、图形用户界面模块和音/视频解码器模块的工作协调和音/视频数据的输出。这个模块是播放器软件中非常重要的一个模块。
图2 播放器应用程序结构图 3.2 用户图形界面设计 MiniGUI提供了丰富的GUI元素,如常见的控件类、对话框与消息框以及菜单等,此外,MiniGUI支持界面皮肤。因此,利用MiniGUI可以非常方便地设计出漂亮的用户图形界面。 播放器的人机交互界面主要包括播放控制与文件列表管理两大部分。播放控制用来实现对所选择的媒体文件作播放/暂停、停止及进度控制等;文件列表管理则用来实现向播放列表添加、删除媒体文件以及对列表中文件排序等功能。 3.3 主要函数及具体实现 ⑴ 播放控制事件回调函数 static int main_event_cb (HWND hwnd, skin_item_t* item, int event, void* data) { … if (event==SIE_BUTTON_CLICKED) { switch (item->id) { case SIID_PLAY: … case SIID_PAUSE: … case SIID_STOP: … case SIID_CLOSE: … } } else if (event==SIE_SLIDER_CHANGED && item->id!=SIID_VOLUME) { … } return 1; } ⑵ 列表事件处理函数 void playlist_handle_event(PEvent *event, void *data) { … switch(event->type) { case ButtonPress: … case ButtonRelease: … case KeyPress: if(!playlist) return; mykeyevent = event->xkey; LockDisplay(gGui->display); len=LookupString(&mykeyevent, kbuf, sizeof(kbuf), &mykey, NULL); UnlockDisplay(gGui->display); switch (mykey) { case K_Down: case K_Next: browser_step_up(playlist->playlist, NULL); break; case K_Up: case K_Prior: browser_step_down(playlist->playlist, NULL); break; default: gui_handle_event(event, data); break; } break; case MappingNotify: LockDisplay(gGui->display); RefreshKeyboardMapping((MappingEvent *)event); UnlockDisplay(gGui->display); break; } } ⑶ 主函数 int MiniGUIMain(int argc, const char* argv[]) { … PlayerHandle=PlayerNew(); … free(buffer); PlayerGetInfo(PlayerHandle, &fi); … InitCreateInfo(&CreateInfo); hMainWnd=CreateMainWindow(&CreateInfo); if (hMainWnd==HWND_INVALID) return -1; … while( GetMessage(&Msg, hMainWnd) ) { TranslateMessage(&Msg); DispatchMessage(&Msg); … } PlayerClose(PlayerHandle); … MainWindowThreadCleanup(hMainWnd); return 0; } 4 结束语 随着嵌入式系统硬件性能的不断提升,用户对应用程序界面的友好性和功能的完备性提出了更高的要求。本文介绍的基于MiniGUI的嵌入式媒体播放器具有设计简单,占用系统资源少等特点,可作为开发基于嵌入式图形界面系统的应用软件的参考。 参考文献 [1] 魏永明.M in iGUI用户手册v1.6 [M].北京:北京飞漫软件威廉希尔官方网站
有限公司,2006. [2] 魏永明.M in iGUI编程指南v1.6 [M].北京:北京飞漫软件威廉希尔官方网站
有限公司,2006. [3] 杨小军.基于嵌入式Linux系统界面的研究[[J].现代电子威廉希尔官方网站
,2004, 27 (IS):89-91. [4] BarrM. C/C++嵌入式系统编程[M].十志宏译.北京:中国电力出版社,2001.
本文可能所用到的IC型号: AME8890TEEV HSMS2804 S524A40X20-RC70 SN74CB3Q3306ADCUR NC7SV04L6X IL420-X007 SN761673DAR JC556B TC9319F-001 |
基于MiniGUI的嵌入式媒体播放器的设计与实现
摘要:随着嵌入式系统的不断发展,处理器性能的不断提升,存储系统容量的不断扩大,各种多媒体应用程序被移植到嵌入式系统中,多媒体组件成为其不可或缺的重要组成部分。本文在比较如今流行的几种嵌入式图形系统的基础上,提出了基于MiniGUI的嵌入式媒体播放器的设计与实现方法。 关键词:嵌入式系统;嵌入式图形系统;MiniGUI;媒体播放器 1 引言 随着嵌入式系统的不断发展,处理器性能的不断提升,存储系统容量的不断扩大,各种多媒体应用程序被移植到嵌入式系统中,多媒体组件成为其不可或缺的重要组成部分。嵌入式多媒体播放器的开发是当前 IT产业的热点之一 ,呈现了巨大的市场需求。与些同时,播放器功能复杂化和普及化对产品的交互界面提出了更高的要求。现在许多高端手机和PDA 产品上已经有了多媒体播放器,可是和PC 机上的播放器相比现有的这些播放器的功能都有待进一步增强。 将现代窗口和图形威廉希尔官方网站
带入到嵌入式设备的 MiniGUI,是一个非常适合于实时嵌入式设备的高效、可靠、可定制、小巧灵活的跨操作系统的图形用户界面支持系统。它采用类Win32的API接口,是一个多窗口GUI支持系统。本文首先比较各种嵌入式图形系统,然后提出基于MiniGUI的嵌入式媒体播放器的设计与实现方法。 2 各种嵌入式图形系统之比较 目前,流行的面向嵌入式系统的图形系统有MicoroWindows/NanoX、Qt/Embedded、MiniGUI、DirectFB、PicoGUI以及GTK+/FB等。它们中的大多数遵循LGPL条款发布,而MicoroWindows/NanoX遵循的是MGPL,Qt/Embedded采用QGPL条款发布。 MicroWindows/NanoX能够在没有任何操作系统或其他图形系统的支持下运行,它能对裸显示设备进行直接操作。这样,MicroWindows就显得十分小巧,便于移植到各种硬件和软件系统上。然而MicroWindows/NanoX的免费版本开发进展慢,而且缺乏全面专业的威廉希尔官方网站
支持。 Qt/Embedded功能强大,但是,由于它是基于C++类库的,所以和其他GUI相比系统消耗资源较大,一般应用于手持式高端信息产品。 GTK+/FB与Qt/Embedded类似,跳过X层直接与FrameBuffer沟通,也具有Qt/Embedded的几项优点,但发展速度缓慢。 DirectFB是专注于Linux FrameBuffer加速的一个图形库,并试图建立一个兼容GTK的嵌入式GUI系统。 PicoGUI是一种新型的小巧的嵌入式图形系统。同X Windows系统一样具有一个弹性的客户服务端架构。PicoGUI将字体,位图,窗口小部件,以及其他应用程序需要的东西都直接建立在服务器上,与X Windows相比,虽然灵活性有所降低,但速度显著提升、体积大大缩小。 MiniGUI为实时嵌入式操作系统提供了非常完善的图形及用户界面支持。MiniGUI本身的可移植性设计,使得不论在哪个硬件平台,哪种操作系统上运行,MiniGUI均能为上层应用程序提供一致的应用程序编程接口(API)。MiniGUI小巧、灵活且对中文的支持性最好。 3 设计与实现 3.1播放器总体结构 本文中的播放器采用MiniGUI作为底层图形库,用于生成用户界面以及读写FrameBuffer。基于MiniGUI的嵌入式系统总体架构如图1所示。
图1 基于MiniGUI的嵌入式系统总体架构 播放器软件总体结构如图2所示,它主要由三部分组成,分别是图形用户界面模块、系统管理主控模块和音/视频解码器。三部分功能设计如下面所述: 图形用户界面模块通过事件/消息机制和系统管理主控模块交互。 音/视频解码器模块可以看作是系统管理主控模块的插件(plug-in),从系统管理主控模块获得编码的音/视频数据并对其解码后发送己解码的音/视频数据给系统管理主控模块。 系统管理主控模块则负责网络数据的接收和解析、图形用户界面模块和音/视频解码器模块的工作协调和音/视频数据的输出。这个模块是播放器软件中非常重要的一个模块。
图2 播放器应用程序结构图 3.2 用户图形界面设计 MiniGUI提供了丰富的GUI元素,如常见的控件类、对话框与消息框以及菜单等,此外,MiniGUI支持界面皮肤。因此,利用MiniGUI可以非常方便地设计出漂亮的用户图形界面。 播放器的人机交互界面主要包括播放控制与文件列表管理两大部分。播放控制用来实现对所选择的媒体文件作播放/暂停、停止及进度控制等;文件列表管理则用来实现向播放列表添加、删除媒体文件以及对列表中文件排序等功能。 3.3 主要函数及具体实现 ⑴ 播放控制事件回调函数 static int main_event_cb (HWND hwnd, skin_item_t* item, int event, void* data) { … if (event==SIE_BUTTON_CLICKED) { switch (item->id) { case SIID_PLAY: … case SIID_PAUSE: … case SIID_STOP: … case SIID_CLOSE: … } } else if (event==SIE_SLIDER_CHANGED && item->id!=SIID_VOLUME) { … } return 1; } ⑵ 列表事件处理函数 void playlist_handle_event(PEvent *event, void *data) { … switch(event->type) { case ButtonPress: … case ButtonRelease: … case KeyPress: if(!playlist) return; mykeyevent = event->xkey; LockDisplay(gGui->display); len=LookupString(&mykeyevent, kbuf, sizeof(kbuf), &mykey, NULL); UnlockDisplay(gGui->display); switch (mykey) { case K_Down: case K_Next: browser_step_up(playlist->playlist, NULL); break; case K_Up: case K_Prior: browser_step_down(playlist->playlist, NULL); break; default: gui_handle_event(event, data); break; } break; case MappingNotify: LockDisplay(gGui->display); RefreshKeyboardMapping((MappingEvent *)event); UnlockDisplay(gGui->display); break; } } ⑶ 主函数 int MiniGUIMain(int argc, const char* argv[]) { … PlayerHandle=PlayerNew(); … free(buffer); PlayerGetInfo(PlayerHandle, &fi); … InitCreateInfo(&CreateInfo); hMainWnd=CreateMainWindow(&CreateInfo); if (hMainWnd==HWND_INVALID) return -1; … while( GetMessage(&Msg, hMainWnd) ) { TranslateMessage(&Msg); DispatchMessage(&Msg); … } PlayerClose(PlayerHandle); … MainWindowThreadCleanup(hMainWnd); return 0; } 4 结束语 随着嵌入式系统硬件性能的不断提升,用户对应用程序界面的友好性和功能的完备性提出了更高的要求。本文介绍的基于MiniGUI的嵌入式媒体播放器具有设计简单,占用系统资源少等特点,可作为开发基于嵌入式图形界面系统的应用软件的参考。 参考文献 [1] 魏永明.M in iGUI用户手册v1.6 [M].北京:北京飞漫软件威廉希尔官方网站
有限公司,2006. [2] 魏永明.M in iGUI编程指南v1.6 [M].北京:北京飞漫软件威廉希尔官方网站
有限公司,2006. [3] 杨小军.基于嵌入式Linux系统界面的研究[[J].现代电子威廉希尔官方网站
,2004, 27 (IS):89-91. [4] BarrM. C/C++嵌入式系统编程[M].十志宏译.北京:中国电力出版社,2001.
本文可能所用到的IC型号: AME8890TEEV HSMS2804 S524A40X20-RC70 SN74CB3Q3306ADCUR NC7SV04L6X IL420-X007 SN761673DAR JC556B TC9319F-001 |
1
|
|
|
|