"); //-->
摘要:随着嵌入式系统的不断发展,处理器性能的不断提升,存储系统容量的不断扩大,各种多媒体应用程序被移植到嵌入式系统中,多媒体组件成为其不可或缺的重要组成部分。本文在比较如今流行的几种嵌入式图形系统的基础上,提出了基于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.
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
SCALE驱动器的半桥接线图
罗德与施瓦茨和高通合作验证了机器学习增强的信道状态信息反馈技术
请教uclinux用什么库函数读写网卡的ip和mac地址?
SCALE驱动器接线图
罗德与施瓦茨和京瓷合作,在MWC 2025大会上展示毫米波PAAM的OTA特性测试技术
罗德与施瓦茨推出CMX500 AI脚本助手,AI驱动自动化助力移动设备测试
LDl001的结构图
Vishay推出新型Cyllene 2 IC以升级红外遥控应用的VSOP383xx系列前置放大电路
请教uclinux用什么库函数读写网卡的ip和mac地址?
CAT3200 CAT3200-5低噪声可调电荷泵DC-DC转换器
CAT32驱动白光LED
CAT3200 CAT3200-5低噪声可调电荷泵DC-DC转换器 (...
IGBT的驱动保护电路
郁闷中!!!请大家来帮忙!!!!
罗德与施瓦茨和u-blox合作验证符合中国GNSS新国标的车载导航模块
罗德与施瓦茨和高通合作激发拟议的FR3频段潜力
Primech AI与香港华懋物业服务有限公司签署谅解备忘录
CAT3604 4路调节电荷泵白色LED驱动器 (英)
LabVIEW讲坛第三季——第十二期:多核时代下的并行编程(下)
了解数字示波器,了解泰克
LabVIEW讲坛第三季——第十一期:多核时代下的并行编程(上)
实现物流和零售自动化——第1部分
ADS 编译程序问题?
FERNRIDE携手QNX,打造符合功能安全认证的自动驾驶码头牵引车解决方案
CAT32 CMOS白色LED驱动器
IGD驱动器的内部结构框图
TDK在面向高功率密度应用的直流-直流转换器模块中引入全遥测技术
全国大学生“飞思卡尔杯”智能汽车竞赛宣传片
LabVIEW网络讲坛第三季——第十期:事件结构的妙用
小妹找到一个网站,N多ARM产品!可是哪个适合我用呢?