为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于 Linux 的 Mplayer 的控制

2017-09-01 50页 doc 243KB 53阅读

用户头像

is_842972

暂无简介

举报
基于 Linux 的 Mplayer 的控制基于 Linux 的 Mplayer 的控制 本科学生毕业论文(设计) 题目(中 文): 基于 Linux 的 Mplayer 的控制 The Control of Mplayer (英 文): Based On Linux System 姓 名 学 号 院 (系) 电子工程系 电子信息工程 级专业、年级 指导教师 湖南科技学院本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的本科毕业论文,设计,~是本人在指导老师的指导下~独立进行研究工作所取得的成果~成果不存在知识产权争议~除文中已经注明引用的内容外...
基于 Linux 的 Mplayer 的控制
基于 Linux 的 Mplayer 的控制 本科学生毕业论文(设计) 题目(中 文): 基于 Linux 的 Mplayer 的控制 The Control of Mplayer (英 文): Based On Linux System 姓 名 学 号 院 (系) 电子工程系 电子信息工程 级专业、年级 指导教师 湖南科技学院本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的本科毕业论文,设计,~是本人在指导老师的指导下~独立进行研究工作所取得的成果~成果不存在知识产权争议~除文中已经注明引用的内容外~本论文不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。 本科毕业论文,设计,作者签名: 年 月 日 毕业论文(设计)任务书 基于Linux的Mplayer的控制课题名称: 学生姓名: 系 别: 电子工程系 专 业: 电子信息工程 指导教师: 湖南科技学院本科毕业论文(设计)任务书 1、主题词、关键词: Mplayer、 开源、 Linux、 多线程 2、毕业论文(设计)内容要求: 搭建Linux操作系统环境平台,将编写好的代码烧写到Cortex A8开发板上,实现对开源工程Mplayer 进行控制,并在液晶屏上显示,可通过触摸屏和按键实现音乐播放器的功能。 具体要求如下: (1)显示部分: 1(显示歌曲信息; 2(显示同步歌词; 3(显示歌曲列表; 4 .实现歌曲播放进度条; 5 .实现音量条的同步变化。 (2)按键部分:上一曲、下一曲、暂停、静音、快进、快退。 (3)触摸屏部分:点击歌曲名播放、暂停、静音、快进、快退。 A 3、文献查阅指引: [1] Stepphen Prata(Learning the vi Editor,Sixth Edition[M](Oreilly,2004( [2] 宋劲杉(Linux C编程一站式学习[M](北京亚嵌教育研究中心,2009( [3] 陈健,宋健建(Linux程序设计(第四版)[M](北京:人民邮电出版,2010( [4] 於锋(Linux多线程设计思维[J](单片机与嵌入式系统应用,2012,3:11-13( [5] 李善平,施韦,林欣(Linux 教程[M](北京:清华大学出版社,2005( [6] 凌阳教育(凌阳教育Cortex A8使用说明书[M](北京凌阳爱普,2012( [7] 凌阳教育(ARM版本Mplayer实验指导书[M](北京凌阳爱普,2012( [8] Christopher Negus(Linux Bible,2005 Edition [M](Wiley,2005( [9] 尤晋元,张亚英(UNIX环境高级编程[M](北京:人民邮电出版社,2006( [10] 韦东山(嵌入式Linux应用开发完全手册[M](北京:人民邮电出版社,2008( 4、毕业论文(设计)进度安排: 2012年11月:确定论文题目,查找资料,准备开题; 2012年12月: 论文开题; 2013年1月:翻阅资料并与论文研究方向相关的要点和论据; 2013年2月:完成资料的搜集,动笔撰写论文稿; 2013年3月:对论文初稿进行进一步的整理,逐步定稿; 2013年4月:充实和完善论文内容,交由指导老师评阅并最终定稿; 2012年5月:完成毕业论文答辩。 教研室意见: 负责人签名: 注:本任务书一式三份~由指导教师填写~经教研室审批后一份下达给学生~一份交指导教师~一份留系里存档。 B 湖南科技学院本科毕业论文(设计)开题报告书 论文(设计)题目 基于Linux的Mplayer的控制 作 者 姓 名 鲍志海 所属系、专业、年级 电子工程系 电子信息工程专业 2009年级 10000 2012.12.26 指导教师姓名、职称 杨熙 讲师 预计字数 开题日期 选题的根据:1)说明本选题的理论、实际意义 2)综述国内外有关本选题的研究动态和自己的见解 MPlayer的开发始于2000年。最初的作者是 Arpad Gereoffy ,因为本身是一款开源软件,此后便有众多的开发者加入进来。 Mplayer作为一款开源多媒体播放器,以GNU通用公共许可证发布。Mplayer可在各主流作业系统使用,例如Linux和其他类Unix系统、微软的视窗系统及苹果电脑的Mac OS X系统。MPlayer是建基于命令行界面,在各作业系统可选择安装不同的图形界面。mplayer的另一个大的特色是广泛的输出设备支持。它可以在X11、Xv、DGA、OpenGL、SVGAlib、fbdev、AAlib、DirectFB下工作。 目前市场上,多媒体播放器层出不穷。从开始只能欣赏音乐的MP3已经发展成能够播放多种视频、音频格式的MP4、MP5等多功能的多媒体播放器。其中,MP5播放器就是采用了软硬协同多媒体处理技术,第一个将ARM平台应用应用于手持多媒体终端,主频可达1GHz。而Mplayer作为GNU许可的一款开源软件,功能愈加强大,并且适于移植到嵌入式平台上。“以应用为中心、软硬件可剪裁的、适应于应用系统”,这一嵌入式的概念将是极富前景的的。 本论文,以Cortex A8 开发板为搭载平台,实现对开源可执行程序Mplayer的控制。在Window 下用虚拟机,安装Linux(ubantu) 系统,使用Xshell、Samba 实现Window与Linux 系统的通信。在电脑上编写好代码,在Linux下使用交叉编译器(arm—linux—gcc)烧写到已经安装了Linux内核 的Cortex A8的开发板上。 通过管道对Mplayer发送命令,并接受其反馈信息,在开发板液晶屏上显示出来,通过按键和触屏实现对Mplayer的音乐播放功能。该系统的特点是:界面友好,操作简单,满足用户的视听之娱。 主要内容: 编写一款MP3音乐播放器,实现音乐的播放、控制功能。 (1)根据设计要求,进行的论证,确定设计方案和总体框架; (2)硬件设备的选择和软件设计; (3)软件调试、系统测试以及测试结果分析。 C 研究方法: (1)文献法。通过查找资料、文献、论文等,借鉴前人研究成果以指导研究,夯实研究的理论基础。 (2)经验总结法。将以前世人研究出的内容、网上发表的文章加以归纳,进行综述,撰写相关的应用性论文。 (3)实验法。通过软件仿真与调试,验证设计效果。 完成期限和采取的主要措施: 完成期限:2013年1月到2013年5月 主要措施: 严格遵照《湖南科技学院毕业论文(设计)工作管理办法》的指示精神,结合个人的实际情况,完成这项设计所采取的主要措施有两条:一是密切联系。联系本组设计成员及毕业设计指导导师,寻求有关毕业设计信息,确定设计课题方向与设计内容;二是虚心学习。利用课余时间到图书馆和网络上查阅资料,并虚心向老师请教和同学进行学习交流,保障毕业设计的顺利完成。 主要参考资料: [1] Stepphen Prata(Learning the vi Editor, Sixth Edition[M](Oreilly,2004( [2] 宋劲杉(Linux C编程一站式学习[M](北京亚嵌教育研究中心,2009( [3] 陈健,宋健建(Linux程序设计(第四版)[M](北京:人民邮电出版 2010( [4] 於锋(Linux多线程设计思维[J](单片机与嵌入式系统应用,2012,3:11-13( [5] 李善平,施韦,林欣(Linux 教程[M](北京:清华大学出版社,2005( [6] 凌阳教育(凌阳教育Cortex A8使用说明书[M](北京凌阳爱普,2012( [7] 凌阳教育(ARM版本Mplayer实验指导书[M](北京凌阳爱普,2012( [8] Christopher Negus(Linux Bible,2005 Edition [M](Wiley,2005( [9] 尤晋元,张亚英(UNIX环境高级编程[M](北京:人民邮电出版社,2006( [10] 韦东山(嵌入式Linux应用开发完全手册[M](北京:人民邮电出版社,2008( 指导教师意见: 指导教师签名: 教研室意见: 签 名: 年 月 日 D 开 题 报 告 会 纪 要 时间 地点 2012年 12 月25 日 三教608 姓 名 职务(职称) 姓 名 职务(职称) 姓 名 职务(职称) 与 谭永宏 副教授 李春树 教授 李小武 副教授 会 廖朝阳 讲师 杨熙 讲师 李艳芳 副教授 人 员 会议记录摘要: 1.Mplayer这款软件较之于市场上众多的多媒体播放器具有什么特点和优势, 答:首先,Mplayer作为一款开源软件,几乎每个月都有新的版本在开源社区发布,可以说是与时俱进,有各种版本,而且免费或者说价格便宜,这样它就具有很大的市场。其次,Mplayer的软件移植性好,可以在各大主流操作系统运行。最后,Mplayer支持多种音频、视频格式,兼容性强。 2.Cortex A8开发板采用的是电容屏还是电阻屏,触屏的工作原理, 答:采用的是电容屏。在触摸屏四边均镀上狭长的电极,在导电体内形成一个低电压交流电场。在触摸屏幕时,由于人体电场,手指与导体层间会形成一个耦合电容,四边电极发出的电流会流向触点,而电流强弱与手指到电极的距离成正比,位于触摸屏幕后的控制器便会计算电流的比例及强弱,准确算出触摸点的位置。 3.你觉得自己在设计时,哪些地方最难,是怎么解决问题的, 答:我觉得:最难的地方就是软件中整体框架的搭建。思路真的很重要,框架清晰,写代码、调试都不是什么问题。问题的解决:我是在北京凌阳爱普培训时,那里的老师指导的,说实话我自己现在还没有能力去构架一款软件的能力。 会议主持人: 记 录 人: 年 月 日 指 系导部 小 组意 负责人签名: 负责人签名: 意见 见年 月 日 年 月 日 注:此表由学生本人填写,一式三份,一份留系里存档,指导老师和本人各保存一份 E 湖南科技学院毕业论文(设计)中期检查表 毕业论文(设计) 基于Linux 的Mplayer 的控制 题 目 学生姓名 鲍志海 学 号 200906002406 系 别 电子工程系 专 业 电子信息工程 指导教师 杨 熙 检查日期 2013.4.8 指导教师检查情况记载及修改意见: 检查情况记载: 1.进行了资料的整理,学习和掌握相关知识; 2.完成了在虚拟机中 ubuntu 环境平台的搭建与Cortex A8开发板的通信; 3.软件设计大部分已经完成; 4.论文大部分内容已经完成; 5.理论知识稍有欠缺。 修改意见: 1.程序需要的进一步调试和优化; 2.摘要内容应包括研究的目的、方法、结果和结论,要突出所做的工作及做的效果; 3.参考文献按学校的规范书写论文,并在论文中标明; 4.创新功能可以适当增加; 5.注意规范流程图的画法。 签名: 注:此表用于指导教师在学生毕业论文,设计,初稿完成后对学生执行任务书情况进行中期检查时用~由指导教师填写。 F 湖南科技学院毕业设计(论文)指导过程记录表 毕业论文(设计)题目 基于Linux 的 Mplayer的控制 学生姓名 鲍志海 学号 200906002406 专业班级 电子信息工程0904班 指导教师 杨 熙 职称 讲师 系(教研室) 电子工程系 选题指导: 指 给出论文研究方向的建议,提出将个人能力和社会需要相结合,开展富有 指导内容 意义的研究课题。 记录(一) 学 生 签 名: 2012 年 11 月10 日 指导教师签名: 2012 年 11 月10 日 导 查阅资料指导: 1、指导查如何阅文献资料并充分利用网络资源。 指导内容 2、推荐相关文献和科技期刊 记录(二) 过学 生 签 名: 2012 年11 月20 日 指导教师签名: 2012 年11 月20 日 论文开题指导: 指导开题中应该包含的内容和整体框架思路的构建,提出今后要多加注重 相关理论知识的补充。 指导内容 程记录(三) 学 生 签 名: 2012年12月 20 日 指导教师签名: 2012年12月 20 日 论文写作指导: 记 指导规范论文格式,并指出目录的质量直接对论文整体质量的影响。注意 流程的规范和清晰。 指导内容 记录(四) 学 生 签 名: 2013 年2 月26 日 指导教师签名: 2013 年2 月26 日 录 G 指论文设计指导: 指导系统的软件设计,根据系统功能的要求,建议采用模块化程序设计。 指导内容 具体怎样分块及大致控制流程。 记录(五) 学 生 签 名: 2013年3 月 9 日 指导教师签名: 2013年3 月 9 日 导 论文初稿修改指导: 1(注意软件部分中函数封装性的构建, 2(软件部分中相关理论需要适当补充, 指导内容 记录(六) 3(软件测试要尽可能考虑各种情况。 过 学 生 签 名: 2013年4月 5 日 指导教师签名: 2013年4月 5 日 论文定稿修改指导: 1.指导修改参考文献的格式, 程2.论文框架结构个别调整。 指导内容 记录(七) 学 生 签 名: 2013 年4 月25 日 指导教师签名: 2013 年4 月25 日 论文答辩指导: 记 论文终稿审阅,指导摘要、英文翻译及答辩PPT的制作。 指导内容 记录(八) 学 生 签 名: 2013年 5月6 日 指导教师签名: 2013年 5月6 日 录 (对情况是否属实做出意见) 答辩小组组长 意见 组长(签名): 20 年 月 日 注:本表与毕业论文一起装订存档。 H 湖南科技学院本科毕业论文,设计,评审表 论文题目 基于Linux 的 Mplayer 的控制 作者姓名 所属系、专业、年级 电子工程 系 电子信息工程 专业 2009年级 鲍志海 指导教师 字 数 定稿日期 杨 熙 讲师 10000 2013. 5 .8 姓名、职称 在物质财富日益丰富的今天~人们越来越注重精神方面的享受。而今~中 作为人们繁忙之余的精神栖所~我们的生活已经离不开音乐。Mplayer作 为一款精简而强大的音乐播放器~已经植入到Windows~Mac~Linux 以 文 及类Unix等诸多操作系统中~为人们提供便捷、易行的娱乐之道。 本论文设计了一款基于Cortex A8开发板~在Linux环境下开发、运 行的音乐播放器软件。通过“管道”对开源工程Mplayer,可执行代码,摘 进行读、写控制~再由Mplayer控制音频设备输出。同时~并发执行多线 程任务~实时监测开发板的按键和触摸屏设备~轻松实现歌曲切换、音 量调节、快进、快退等功能~并且在液晶屏上同步显示当前播放歌曲信要 息和歌词~给用户以优质的体验和身心的放松。 关键词 Mplayer 开源 Linux 多线程 ,3-5个, Nowadays, with the rapid development of material wealth, people pay more and more attention to spiritual enjoyment. Now, music, as a spiritual habitat of these busy people, has become inseparable from our life. Mplayer, as a precise and powerful music player, has been implanted into a series of 英 operating systems like Mac, Linux and Unix, which provides a convenient and easy way of entertainment for people. This thesis designs music player software which is based on Cortex A8 文 development board and operated under the environment of Linux. Though the pipe, people can make reading and writing control to the open source project Mplayer, then it can control the output of Audio Equipment. At the same time, 摘 it can execute multithreading tasks and supervise the key of development board and the equipment of touch screen. It also can switch songs easily, control the volume, fast or slow down the speed of the song in a easy way. 要 What’s more, it can reveal the information and the words of the song on the liquid screen at the same time. In this way, users can enjoy themselves physically and mentally. 关键词 Mplayer opensoure Linux multithreading (3-5个) I 指导教师评定成绩 评审指导教师 评审要素 评审内涵 满分 基元 实评分 选题符合专业培养目标~体现学科、专业特点和教学目的明确 计划的基本要求~达到毕业论文,设计,综合训练的10 符合要求 目的。 选题 符合本学科的理论发展~有一定的学术意义,对经济建质量理论意义或 设和社会发展的应用性研究中的某个理论或方法问题进10 实际价值 25% 行研究~具有一定的实际价值。 选题恰当 题目规模适当~难易度适中,有一定的科学性。 5 查阅文献 能独立查阅相关文献资料~归纳总结本论文所涉及的10 资料能力 有关研究状况及成果。 综合运用 能运用所学专业知识阐述问题,能对查阅的资料进行整10 知识能力 理和运用,能对其科学论点进行论证。 能力研究方案的 整体思路清晰,研究方案合理可行。 5 设计能力 水平 能运用本学科常规研究方法及相关研究手段,如计算机、40% 研究方法和手实验仪器设备等,进行实验、实践并加工处理、总结信10 段的运用能力 息。 外文应用 能阅读、翻译一定量的本专业外文资料、外文摘要和外5 能力 文参考书目,特殊专业除外,体现一定的外语水平。 文题相符 较好地完成论文选题的目的要求。 5 论文写作水平 论点鲜明,论据充分,条理清晰,语言流畅。 15 质量符合学术论文的基本要求。用语、格式、图表、数据、量写作规范 10 和单位、各种资料引用规范化、符合。 35% 论文篇幅 10000字左右。 5 实评总分 成绩等级 指导教师评审意见: 指导教师签名: 说明:评定成绩分为优秀、良好、中等、及格、不及格五个等级~实评总分90—100分记为优秀~80—89分记为良好~70—79分记为中等~60—69分记为及格~60分以下记为不及格。 J 评阅教师评定成绩 评审评阅教师 评审要素 评审内涵 满分 基元 实评分 选题符合专业培养目标~体现学科、专业特点和教学目的明确 计划的基本要求~达到毕业论文,设计,综合训练的10 符合要求 目的。 选题 符合本学科的理论发展~有一定的学术意义,对经济建质量理论意义或 设和社会发展的应用性研究中的某个理论或方法问题进10 实际价值 25% 行研究~具有一定的实际价值。 选题恰当 题目规模适当~难易度适中,有一定的科学性。 5 查阅文献 能独立查阅相关文献资料~归纳总结本论文所涉及的10 资料能力 有关研究状况及成果。 综合运用 能运用所学专业知识阐述问题,能对查阅的资料进行整10 知识能力 理和运用,能对其科学论点进行论证。 能力研究方案的 整体思路清晰,研究方案合理可行。 5 设计能力 水平 研究方法和能运用本学科常规研究方法及相关研究手段,如计算机、40% 手段的运用实验仪器设备等,进行实验、实践并加工处理、总结信10 能力 息。 外文应用 能阅读、翻译一定量的本专业外文资料、外文摘要和外5 能力 文参考书目,特殊专业除外,体现一定的外语水平。 文题相符 较好地完成论文选题的目的要求。 5 论文写作水平 论点鲜明,论据充分,条理清晰,语言流畅。 15 质量符合学术论文的基本要求。用语、格式、图表、数据、量写作规范 10 和单位、各种资料引用规范化、符合标准。 35% 论文篇幅 10000字左右。 5 实评总分 成绩等级 评阅教师评审意见: 评阅教师签名: 说明:评定成绩分为优秀、良好、中等、及格、不及格五个等级~实评总分90—100分记为优秀~80—89分记为良好~70—79分记为中等~60—69分记为及格~60分以下记为不及格。 K 湖南科技学院本科毕业论文,设计,答辩记录表 论文题目 基于Linux 的Mplayer的控制 作者姓名 鲍志海 所属系、专业、年级 电子工程系 电子信息工程专业 2009年级 指导教师 杨 熙 讲师 姓名、职称 答 辩 会 纪 要 时间 2013年5月 18 日 地点 三教608 答 姓 名 职务(职称) 姓 名 职务(职称) 姓 名 职务(职称) 辩 谭永宏 副教授 李春树 教授 李小武 副教授 小 廖朝阳 讲师 杨熙 讲师 李艳芳 副教授 组 成 员 答辩中提出的主要问题及回答的简要情况记录: 答辩问题记录: 1.在你的软件设计中,多线程间是如何通信的, 答:线程间通信方式和进程间通信方式大致相同(管道、命名管道、信号、共享内存、消息队列和socket)。一方面,为了简化设计,我采用的是全局变量的方式(不是线程间特有的通信方式);另一方面,由于所用到的线程都是包含一个大while语句,为避免频繁读入全局变量,延时1s读取。 2.对Mplayer发送的命令是如何组包的,具体是怎么实现的, 答:在软件设计部分,发送给Mplayer的命令分两类:一类是固定格式的“字符串”;另一类是非固定格式:“字符创”+“数字”。前者写入一个字符串数组即可,后者则用一个字符串数组存储一部分命令,然后用sprintf函数与数字组合打包即可。 3.Mplayer的信息反馈是怎么实现的, 答:Mplayer的信息反馈是通过管道重定向实现的。通过修改文件描述符,将原本反馈到标准输出设备(显示器)的信息重定向到管道中。 会议主持人: 记 录 人: 年 月 日 L 评语: 答 辩 小 组 意 见 评定等级: 负责人(签名): 年 月 日 评语: 系 学 位 委 员 会 意 见 论文(设计)最终评定等级: 负责人(签名): 系部(公章) 年 月 日 评语: 校 学 位 委 员 会 意 评定等级: 见 负责人(签名): 年 月 日 M 目 录 绪论 ................................................................................................................................. 1 1 系统方案的确定 .......................................................................................................... 2 1.1 系统的功能需求分析 ........................................................................................ 2 1.2 系统方案的确定 ................................................................................................ 2 2 相关原理与技术 .......................................................................................................... 4 2.1 Samba原理 ......................................................................................................... 4 2.1.1 Samba概述 ............................................................................................... 4 2.1.2 Samba工作原理 ........................................................................................ 4 2.2 Linux下进程间的通信 ....................................................................................... 5 2.2.1 进程通信的目的....................................................................................... 5 2.2.2 Linux 进程间的通信方式......................................................................... 5 2.3 Mplayer的简介 .................................................................................................. 7 2.3.1 概述 .......................................................................................................... 7 2.3.2 工作模式 .................................................................................................. 7 3 系统硬件 ..................................................................................................................... 9 3.1 Cortex A8开发板元器件 .................................................................................... 9 3.1.1 主控芯片简介 .......................................................................................... 9 3.1.2 其他元器件简介....................................................................................... 9 3.2 音频输出接口与麦克风 ................................................................................... 10 3.2 液晶显示屏 ...................................................................................................... 10 3.3 物理按键 .......................................................................................................... 11 4 系统的软件设计 ........................................................................................................ 12 4.1 系统的主流程图 .............................................................................................. 12 4.2 主函数.............................................................................................................. 13 I 4.3 多线程.............................................................................................................. 15 4.3.1 按键控制线程 ........................................................................................ 15 4.3.2 触屏控制线程 ........................................................................................ 21 5 系统测试 ................................................................................................................... 28 5.1 按键与触屏测试 .............................................................................................. 28 5.2 其他测试 .......................................................................................................... 28 5.3 实际效果图 ...................................................................................................... 28 结论 ............................................................................................................................... 29 参考文献 ....................................................................................................................... 30 附录A:部分源代码 .................................................................................................... 31 致 谢 ............................................................................................................................. 36 II 基于Linux的Mplayer的控制 摘 要 在物质财富日益丰富的今天,人们越来越注重精神方面的享受。而今,作为人们繁忙之余的精神栖所,我们的生活已经离不开音乐。 Mplayer作为一款精简而强大的音乐播放器,已经植入到Windows,Mac,Linux 以及类Unix等诸多操作系统中,为人们提供便捷、易行的娱乐之道。 本论文设计了一款基于Cortex A8开发板,在Linux环境下开发、运行的音乐播放器软件。通过“管道”对开源工程Mplayer(可执行代码)进行读、写控制,再由Mplayer控制音频设备输出。同时,并发执行多线程任务,实时监测开发板的按键和触摸屏设备,轻松实现歌曲切换、音量调节、快进、快退等功能,并且在液晶屏上同步显示当前播放歌曲信息和歌词,给用户以优质的体验和身心的放松。 【关键词】Mplayer 开源 Linux 多线程 III The Control of Mplayer Based on Linux System Abstract Nowadays, with the rapid development of material wealth, people pay more and more attention to spiritual enjoyment. Now, music, as a spiritual habitat of these busy people, has become inseparable from our life. Mplayer, as a precise and powerful music player, has been implanted into a series of operating systems like Mac, Linux and Unix, which provides a convenient and easy way of entertainment for people. This thesis designs music player software which is based on Cortex A8 development board and operated under the environment of Linux. Though the pipe, people can make reading and writing control to the open source project Mplayer, then it can control the output of Audio Equipment. At the same time, it can execute multithreading tasks and supervise the key of development board and the equipment of touch screen. It also can switch songs easily, control the volume, fast or slow down the speed of the song in a easy way. What’s more, it can reveal the information and the words of the song on the liquid screen at the same time. In this way, users can enjoy themselves physically and mentally. 【Key words】Mplayer opensource Linux multithreading IV 绪论 时下,音乐播放器已经成为人们娱乐活动中中不可或缺的必备品。 其历史更是可以追溯到1877年,爱迪生公开表演了留声机,“会说话的机器”诞生,立刻轰动了全世界。让动听的声音有了存储的载体,得以广泛的传播和分享。播放器是怎么从笨重的留声机演变到现在迷你外表却内存超大的便携式播放器呢,这都源于对于历代播放器技术的研究和积累,才有了新的成就。 Mplayer是一款开源多媒体播放器,最开始在Linux系统上使用,以GNU通用 [1]公共许可证发布。Mplayer 具有强大的可移植性,可在各主流作业系统使用,如Mac、Windows、Linux和类Unix系统。Mplayer发展前期建基于命令行界面,后来在各作业系统可选择安装不同的图形界面。Mplayer最大的特色是广泛的输出设备支持。它可以在X11、Xv、DGA、OpenGL、SVGAlib、fbdev、AAlib、DirectFB下工作,而且也能使用GGI和SDL和一些低级的硬件相关的驱动模式。MPlayer还支持 [2]通过硬件MPEG解码卡显示,诸如DVB 和DXR3与Hollywood+。因为其强大的输出设备支持和播放功能和音频支持,且内置多种解码器。而受到极客和一般用户的亲睐。 目前,Mplayer日益完善,功能愈加强大。因为其开源的特性,Mplayer必将有更好的发展前景。Mplayer与嵌入式系统的结合,而嵌入式已经越来越深入我们的生活。智能手机、MP3、MP4、平板电脑、智能家居„„嵌入式系统无处不在。 本论文设计了一款,以Cortex A8 开发板为硬件平台,实现对可执行程序Mplayer的控制,将原本基于命令行的Mplayer转换为一款界面生动、可通过按键和触屏操作的软件。因为播放器的开发是基于成熟的硬件平台,所以本论文的主要任务集中在软件部分的编写上。首先是环境的搭建:在Window 下安装好虚拟机,在虚拟机下安装好Ubantu系统(Linux的一个版本),在Windows下安装好Xshell ,Ubantu下安装好Samba,就实现了两个操作系统间的通信。然后在Windows环境中编辑代码,之后在虚拟机下用交叉编译器(arm—linux—gcc)编译、烧写到已安装好Linux内核的Cortex A8开发板上,经过反复调试,最终完成了设计。 软件实现的主要原理是:通过并发多线程任务,初始化Cortex A8开发板上的设备,对按键和触摸屏进行实时检测,检测到有效信号后即发送相应的功能命令给Mplayer的可执行程序,实现音乐播放器的功能,液晶屏上的信息也随之同步变化。另一方面,CPU甄别、接收Mplayer反馈回来的信息也显示到液晶屏上。 该软件的特点是:采用交互式的图形界面,操作简单。软件体积精简、可以根据用户需求适当剪裁、增删软件功能。具有良好的可扩展性和软件移植性。 1 1 系统方案的确定 1.1 系统的功能需求分析 功能需求分析确定了系统必须完成哪些工作,提出了完整、准确、清晰和具体的要求,功能需求分析科学与否直接影响到后面各个阶段的设计,以及设计结果是否 [3]合理和实用。 功能需求分析的任务是通过详细调查现实世界要处理的对象(音乐播放器等), 通过明确用户的需求,然后在此基础上确定新系统的功能。新系统必须充分考虑今后可能的扩充和改变,不能仅仅按当前应用需求来设计系统。功能需求分析的结果是系统开发的基础,关系到工程的成败和软件产品的质量。所以必须用行之有效的方法对软件需求进行严格的审查验证。 分析的具体任务有以下两方面。 需求 (1)确定系统的综合要求。 支持简单、友好的触屏界面控制,同时支持传统的实体键;支持开发人员根据客户需求对Mplayer的个性化设定。 (2)分析系统的数据要求。 从本质上而言,任何一个软件系统都是信息处理系统,系统必须处理的信息和系统对软件设计有深远影响。所以,必须对系统的数据需求做出正确的评估与分析。 [4]分析系统的数据要求通常采用建立概念模型的方法。 软件系统经常使用各种长期保存的信息,这些信息通常以一定方式组织并存储在数据库和文件中,为了减少数据条,避免出现插入异常或删除异常,简化修改数据的过程,通常需要把数据结构规范化。 本设计所要实现的功能如下: 1.通过实体按键,实现歌曲的切换、音量调节、暂停、静音、快进、快退; 2.通过触摸屏(单点触控),实现歌曲的切换、音量调节、暂停、静音、快进、快退,同时在液晶屏上同步显示当前播放歌曲信息和歌词。 1.2 系统方案的确定 系统设计回答的中心问题是“如何做”,即怎么实现功能需求分析说明书中所规定的系统功能。在这一阶段,要根据实际的技术条件、经济条件和社会条件,确定系统的实施方案,即系统的物理模型。如图1.1所示。 2 显示屏 Cortex-A8 实体键 触摸屏 Mplayer 音频输出 图1.1 系统设计框图 3 2 相关原理与技术 2.1 Samba原理 2.1.1 Samba概述 Samba在Linux和Windows两个平台之间架起了一座桥梁,通过Samba的我们可以在Linux系统和Windows系统之间互相通信,比如拷贝文件、实现不同操作系 [5]统之间的资源共享等等。我们可以将其架设成一个功能非常强大的文件服务器,也可以将其架设成打印服务器提供本地和远程联机打印。 2.1.2 Samba工作原理 Samba服务功能强大,这与其通信基于SMB有关。SMB不仅提供文件和打印机共享,还支持认证、权限设置。在早期,SMB运行于NBT协议(NetBIOS over TCP/IP)上,使用UDP协议的137、138及TCP协议的139端口,后期SMB经过开发,可以直接运行于TCP/IP协议上,没有额外的NBT层,使用TCP协议的4 [5]45端口。 (1)Samba工作流程 当客户端访问服务器时,信息通过SMB协议进行传输,其工作过程可以分成四个步骤: 步骤1:协议协商 客户端在访问Samba服务器时,发送negprot指令数据包,告知目标计算机其支持的SMB类型。Samba服务器根据客户端的情况,选择最优的SMB类型,并做出回应。 步骤2:建立连接 当SMB类型确认后,客户端会发送session setup指令数据包,提交帐号和密码,请求与Samba服务器建立连接,如果客户端通过身份验证,Samba服务器会对session setup报文作出回应,并为用户分配唯一的UID,在客户端与其通信时使用。 步骤3:访问共享资源 客户端访问Samba共享资源时,发送tree connect指令数据包,通知服务器需要访问的共享资源名,如果设置允许,Samba服务器会为每个客户端与共享资源连接分配TID,客户端即可访问需要的共享资源。 步骤4:断开连接 共享使用完毕,客户端向服务器发送tree disconnect报文关闭共享,与服务器断开连接。 (2)Samba相关进程 4 Samba服务是由两个进程组成,分别是nmbd和smbd。nmbd:其功能是进行 [6]NetBIOS名解析,并提供浏览服务显示网络上的共享资源列表。smbd:其主要功能就是用来管理Samba服务器上的共享目录、打印机等,主要是针对网络上的共享资源进行管理的服务。当要访问服务器时,要查找共享文件,这时我们就要依靠smbd这个进程来管理数据传输。 2.2 Linux下进程间的通信 2.2.1 进程通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间。 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 2.2.2 Linux 进程间的通信方式 早期UNIX进程间通信、基于System V进程间通信、基于Socket进程间通信和 [7]POSIX进程间通信。UNIX进程间通信方式包括:管道、FIFO、信号。System V进程间通信方式包括:System V消息队列、System V信号灯、System V共享内存、POSIX进程间通信包括:posix消息队列、posix信号灯、posix共享内存。 现在linux使用的进程间通信方式:管道(pipe)和有名管道(FIFO)信号(signal)、消息队列、共享内存、信号量、套接字(socket)。本文中使用了多种进程通信方式,下文仅对使用到的进程通信方式加以概述。 一、管道(pipe) 普通的Linux shell都允许重定向,而重定向使用的就是管道。例如:ps | grep vsftpd。管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程 [8]的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的道端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写 5 入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。管道主要用于不同进程间通信。 二、命名管道(fifo) 命名管道和一般的管道基本相同,但也有一些显著的不同: 命名管道是在文件系统中作为一个特殊的设备文件而存在的。不同祖先的进程之间可以通过管道共享数据。当共享管道的进程执行完所有的I/O操作以后,命名管道将继续保存在文件系统中以便以后使用。管道只能由相关进程使用,它们共同的祖先进程创建了管道。但是,通过fifo,不相关的进程也能交换数据。 三、线程(pthread) (1)线程的概述 每个进程都拥有自己的数据段、代码段和堆栈段,这就造成进程在进行创建、切换、撤销操作时,需要较大的系统开销。为了减少系统开销,从进程中演化出了线 [9]程。线程存在于进程中,共享进程的资源。 线程是进程中的独立控制流,由环境(包括寄存器组和程序计数器)和一系列的执行指令组成。线程是CPU调度和分派的基本单位。线程拥有的资源:线程自己一般不拥有资源(除了必不可少的程序计 数器,一组寄存器和栈),但它可以去访问其所属进程的资源,如进程代码段,数据段以及系统资源(已打开的文件,I/O设备等)。线程不仅进程间可以并发执行,而且在一个进程中的多个线程之间也可以并发执行。 (2)线程的互斥 一个公共资源同一时刻只能被一个线程使用,多个线程不能同时使用公共资源。POSIX标准中线程同步和互斥的方法,主要有信号量和互斥锁两种方式[10]。 (3)互斥锁(mutex) mutex是一种简单的加锁的方法来控制对共享资源的访问,mutex只有两种状态,即上锁(lock)和解锁 (unlock)。在访问该资源前,首先应申请mutex,如果mutex处于unlock状态,则会申请到mutex并立即lock;如果mutex处于lock状态,则默认阻塞申请者。unlock操作应该由lock者进行。 6 2.3 Mplayer的简介 2.3.1 概述 Mplayer是一个 Linux 下的多媒体播放器 (也能运行在许多其它的平台和CPU架构)。通过许多原生的和可执行的编解码器的支持, 它能播放绝大部分的 MPEG/VOB,AVI,ASF/WMA/WMV,RM, QT/MOV/MP4,Ogg/OGM,MKV,VIVO,FLI,NuppelVideo,yuv4mpeg,FILM 和 RoQ 文件。还能用于观看 VCD、 [8]SVCD、DVD、3ivx、DivX 3/4/5、WMV 甚至 H.264 格式的电影。MPlayer 广泛地支持音视频输出驱动。 它不仅可以使用 X11,Xv,DGA,OpenGL,SVGAlib,fbdev,Aalib,libcaca 也能使用 GGI,SDL (及它们的所有驱动), 所有VESA 兼容显卡上的 VESA (甚至不需要 X11),某些低级的 显卡相关的驱动 (如 Matrox, 3dfx 及 ATI) 和一些硬件 MPEG 解码器卡。 2.3.2 工作模式 Mplayer有两种工作模式。分别为从机模式(Slave)和键盘模式,本论文采用Slave模式控制Mplayer,将着重介绍。 一、键盘模式 Mplayer有一个完全可配置的,命令驱动的控制层,可以让用户通过键盘、鼠标、 [8]操纵杆或者遥控器来控制Mplayer。通过键盘按键即可实现播放音乐、音量调节、回放速度控制、声道平衡、色调、饱和度等等功能。 二、Slave模式 该模式下,Mplayer作为后台程序运行。Mplayer从标准输入读取以新行(\n) [8]分隔开的命令行,而不再截获键盘事件。可以通过给Mplayer发送命令控制Mplayer。 (1)启动方式 a(启动方式一:在终端下敲命令来启动Mplayer 例:./mplayer_arm -ac mad-idle-slave -quiet /home/britney_spears.avi 1:-ac mad 这两个参数的意思是指定用mad解码器; 2:-idle 播放文件至文件末尾后mplayer不退出; 3:-slave 指定mplayer运行在slave模式下; 4:-quiet 指定mplayer不向屏幕上,打印乱码信息; 5:/home/britney_spears.avi 指定mplayer播放的第一首歌曲的路径。 使用这种方法运行Mplayer时,Mplayer默认从标准输入去获取命令。可以在终端下敲命令控制Mplayer。 7 b(启动方式二:在终端下敲命令来启动Mplayer 在进程中调用execl启动Mplayer程序。 例: execl("./mplayer_arm","mplayer","-ac","mad","-slave","-quiet", "-input","file=./fifo_cmd","./media/sad_or_happy.mp3",NULL); 参数: 1:"-ac","mad" 指定使用mad解码器。 2:"-slave" MPlayer从标准输入读取以新行(\n) 分隔开的命令行。 3:"-quiet" 使得控制台输出消息较少。 4:"-intput","file=./tmp/cmd_fifo" Mplayer通过命名管道”./tmp/cmd_fifo”获取命令。 5:song_path_name 歌曲的路径+文件名首地址。 6:NULL Mplayer可以通过它来判断到底有多少个参数,这个必不可少。 (2)Slave模式下常用命令 loadfile string //播放string指定的歌曲。 //string为歌曲路径+文件名(例:“loadfile ../easylove.mp3”)。 volume x 1 //设置音量,x为音量的大小。 mute 1/0 //静音开关。1:静音;0:取消静音。 Pause //暂停/取消暂停。 seekvalue //快进或快递参数value指定的秒数 当value为正时,快进;当value为负时,快退。 get_percent_pos //获得文件的播放进度(百分比:0--100)。 get_time_pos //获得文件的当前位置,以秒为单位,精确到小数位1位。 get_file_name //获得文件的文件名。 get_time_length //获得文件的长度,以秒为单位。 8 3 系统硬件 3.1 Cortex A8开发板元器件 3.1.1 主控芯片简介 本论文的Linux开发平台采用的是三星公司生产的S5PV210,是一款适用于智能手机和平板电脑等多媒体设备的应用处理器,主要用于平板电脑和上网本。S5PV210采用了ARM CortexTM-A8内核,ARM V7指令集,主频可达1GHZ,64/32位内部总线结构,32/32KB的数据/指令一级缓存,512KB的二级缓存,可以实现 [7]2000DMIPS(每秒运算2亿条指令集)的高性能运算能力。 3.1.2 其他元器件简介 (1)核心板主要元件: a. CPU型号为S5PV210; b. DDR2内存,一共4片,型号为K4T1G164Q; c. NANDFLASH,1G版本核心板为K9K8G08,256M版本核心板为K9F2G08; d. 有线网络芯片,10/100Mbps,SMSCLAN9220; e. AC97音频编解码芯片,WM9713,该芯片包含电阻式触摸屏控制器; f. 电源转换芯片,为核心板器件提供所需要的各种电压转换。 (2)底板主要元器件: a. 电源接口,输入电压为5V。电源上串联有一个1.1A的自恢复保险丝。 b. 电源开关,选用进口优质电源开关,可反复开关不低于10万次。 c. USB2.0OTG接口,采用miniUSB插座,支持480Mbps高速模式。 d. HDMI高清显示输出,标准的TypeA型HDMI插座,机械强度高。 e. CVBS视频输出端口,用于连接电视机。 f. 100M有线以太网接口。 g. 2路RS232电平串口插座,DB9针式插座,和PC串口标准一致。 h. TF卡插座,支持从TF卡启动。 i. 板载USBWIFI模块(板载和外接二选一),支持802.11n150Mbps。 j. 3路预留USB2.0HOST端口,可以外接U盘,鼠标,键盘等。 k. 音频输出接口,采用3.5mm耳机插座。 l. 板载麦克风。 m. 启动模式设置开关,可以设置多种启动模式。 n. 4个用户LED,由用户程序控制LED的亮灭。 r. 摄像头输入接口,可以连接定制的摄像头扩展板。 9 s. 液晶输出接口,可以外接各种液晶屏模块。 w. GPIO扩展接口,包含2路串口,1路SPI,一个GPIO。 y. 9个用户按键,支持常用的功能操作。 z. 1个复位按键 主板如图3.1所示: 图3.1 Cortex A8 主板 3.2 音频输出接口与麦克风 音频输出端口(J11)为标准3.5mm立体声耳机插座,接到AC编解码芯片WM9371 的音频输出。麦克风(MIC1)也接到WM9713上。 图3.2 音频输出简化电路 3.2 液晶显示屏 液晶屏输出接口(J9)用于连接各种液晶屏,包含了液晶屏数据信号,背光电源和 触摸屏3部分。 10 图3.3 液晶屏输出接口 液晶屏接口插座采用的是0.5mm 间距的40 芯FPC插座,下接触。插入FPC带线时,FTC带线的金属接触面朝下,左边起为第1脚(白色三角形)。 3.3 物理按键 Cortex A8平台有9个普通按键和一个复位按键。电路图如图3.4所示。 a. 普通按键电路图 b. 复位按键电路图 图3.4 按键电路图 11 4 系统的软件设计 4.1系统的主流程图 开始对液晶屏、触屏设备初始化。获取歌曲列表,打印在液晶屏上。创建命名管道,用于向Mplayer发送命令;再创建无名管道,用于重定向Mplayer的反馈信息。创建进程,子进程启动Mplayer;父进程则创建五个线程,父进程等待子进程结束。如图4.1所示。 开始 绘制背景 窗口及图片 初始化液晶 和触摸屏 获取歌曲 列表 打印播放列表 当前播放歌曲高亮 创建命名管道,发命令给Mplayer 创建无名管道,从Mplayer读取内容 子进程:开启Mplayer 父进程:创建线程 创建进程 触获重定向Mplayer的 键 屏取盘输出至管道的写端口 读取、 歌检歌检 处理词测测曲 Mplayer显与与信的数据 示 处处调用execl,启动息 Mplayer 理 理 等待子进程 图4.1 系统流程图 12 4.2主函数 函数功能:控制程序流,调用各个函数,启动Mplayer,创建多线程实现开源工程Mplayer的控制。 int fd[2]; // 定义管道文件描述符,fd[0]为读端口,fd[1]为写端口 int g_cur_song = 0; // 定义当前播放歌曲 pthread_mutex_t mutex; // 定义线程“锁” int main(void) { int m_fifo_fd_r; // 定义读命名管道文件描述符 int pipe_ret; // 创建无名管道 pid_t pid; touch_screen_init(); //调用触屏初始化函数 print_mp3_list(); //调用歌曲播放列表初始化函数 mkfifo("m_fifo",0666); //创建管道,加权限 pipe_ret = pipe(fd); //创建管道 pid=fork(); //创建进程 if(pid==-1) //错误信息处理 { perror("fork"); exit(-1); } //子进程 if(pid==0) { //重定向,将Mplayer返回输出到屏幕上的信息导入到无名管道中 dup2(fd[1],1); //启动开源工程Mplayer execl("./mplayer_arm","mplayer","-ar","mad", "-slave","-quiet","-input","file=./m_fifo", g_mp3_name[g_cur_song], NULL); perror("execl"); 13 } //父进程 else if(pid>0) { pthread_t pid_key,pid_touch;//定义各线程变量(触屏、按键) pthread_t pid_fun_show_info, pid_song_content;//(歌曲信息、歌曲列表) pthread_t pid_fun_lyrics_win;//(歌词) //创建线程五个线程 pthread_create(&pid_fun_show_info,NULL, pthread_fun_show_info,NULL); pthread_create(&pid_key,NULL,pthread_fun_key,NULL); pthread_create(&pid_song_content,NULL,pthread_fun_song_info,NULL); pthread_create(&pid_touch,NULL,pthread_fun_touch,NULL); pthread_create(&pid_fun_lyrics_win,NULL,pthread_fun_lyrics,NULL); //阻塞,等待线程结束 pthread_join(pid_fun_show_info,NULL); pthread_join(pid_touch,NULL); pthread_join(pid_key,NULL); pthread_join(pid_song_content,NULL); pthread_join(pid_fun_lyrics_win,NULL); wait(); } close(g_touch_fd); // 关闭触屏设备 close(fd_key); // 关闭按键设备 return 0; } 14 4.3 多线程 因为本程度需要不断对触屏、按键进行检测,还必须不断向Mplayer发送命令、接受命令,需要并行执行多个任务,而C语言程序本身是顺序执行的,所以在Linux 下,我们只能采取多进程或者多线程的手段实现。而线程与进程相比,线程具有更多的优势:新线程的建立只需要系统分配少量的栈的空间,其余部分为线程共享资源,只需要消耗很小的系统资源。本程序一共开了5个线程,分别是按键控制线程、触屏控制线程、歌曲信息显示进程、命令进程和歌词显示进程。本论文重点阐述按键控制线程和触屏控制线程。 4.3.1 按键控制线程 先打开命名管道(进程、线程间的通信方式)和按键(设备文件)。然后读取按键键值,根据读取的键值,组包成相应的命令。命令大致分为两类:一类是固定格式的命令,用字符串数组保存;另一类是不固定格式,由“字符串 + 数字”组成,用sprintf函数组包实现。最后将命令写至命名管道。一轮按键的检测和命令的执行就结束了,即进入下一轮按键的检测。按键控制线程流程如图4.2所示。 15 图4.2 按键控制线程流程图 16 char buf_vol[30] = ""; //存放向Mplayer发送的“音量的命令” int vol = 50; //音量值(0--100),初始化50 int pause_flag = 1; //暂停标识位 0:暂停 1:正常播放 int fd_key = -1; //定义按键的文件描述符 void *pthread_fun_key(void *arg) { unsigned char key=0; //按键键值变量 int i=0; int m_fifo_fd_w; //管道文件描述符 int vol = 50; char *p[2] = {"mute 0\n","mute 1\n"}; //静音开关,0 :取消静音;1 静音 char pause[ ] = "pause\n"; //暂停命令 char seek_forward[ ] = "seek 10\n"; //快进10s命令 char seek_backward[ ] = "seek -10\n"; //快退10s命令 char previous_song[100] = "loadfile "; char next_song[100] = "loadfile "; m_fifo_fd_w = open("m_fifo",O_WRONLY); //打开命名管道文件 if(m_fifo_fd_w == -1) //出错处理 { perror("mkfifo"); exit(-1); } //打开按键设备(在Linux下一切设备皆文件) fd_key = open("/dev/key4+5",O_RDONLY); if(fd_key == -1) { perror("open"); exit(-1); } while(1) { read(fd_key,&key,sizeof(key)); //阻塞读取按键键值, printf("key = %d\n",key); //打印按下键值 17 switch(key) { //静音键 case 8: if(i==2) { i=0; } pthread_mutex_lock(&mutex); write(m_fifo_fd_w, p[i],strlen(p[i++])); pthread_mutex_unlock(&mutex); break; //快进键 case 4: TFT_File_Picture(win_background, 330, 198 , "../picture/mute_1.bmp", 0); pthread_mutex_lock(&mutex); write(m_fifo_fd_w, seek_forward,strlen(seek_forward)); //快进 pthread_mutex_unlock(&mutex); break; //快退键 case 5: TFT_File_Picture(win_background, 330, 198, "../picture/mute_1.bmp", 0); pthread_mutex_lock(&mutex); write(m_fifo_fd_w, seek_backward,strlen(seek_backward)); //快退 pthread_mutex_unlock(&mutex); break; //音量加键 case 6: if(vol<100) { vol+=10; } TFT_File_Picture(win_background, 330, 198, "../picture/mute_1.bmp", 0); 18 //绘制音量条 TFT_SetColor(win_background, COLOR_GREEN); TFT_Rectangle(win_background,370,150-vol,375,150, PAINT_SOLID); bzero(buf_vol,sizeof(buf_vol)); sprintf(buf_vol,"volume %d 1\n",vol); pthread_mutex_lock(&mutex); write(m_fifo_fd_w, buf_vol,strlen(buf_vol)); pthread_mutex_unlock(&mutex); break; //音量减键 case 3: if(vol>0) { vol-=10; } TFT_File_Picture(win_background, 330, 198, "../picture/mute_1.bmp", 0); //绘制音量条 TFT_SetColor(win_background, COLOR_BLACK); TFT_Rectangle(win_background,370,50,375,150-vol,PAINT_SOLID); bzero(buf_vol,sizeof(buf_vol)); sprintf(buf_vol,"volume %d 1\n",vol); pthread_mutex_lock(&mutex); write(m_fifo_fd_w, buf_vol,strlen(buf_vol)); pthread_mutex_lock(&mutex); break; //暂停键 case 9: if(pause_flag==1) { pause_flag = 0; 19 } else { pause_flag = 1; } pthread_mutex_lock(&mutex); write(m_fifo_fd_w, pause,strlen(pause)); pthread_mutex_unlock(&mutex); break; //上一曲键 case 11: if(g_cur_song > 0) { strcat(previous_song,g_mp3_name[--g_cur_song]); previous_song[strlen(previous_song)]='\n'; pthread_mutex_lock(&mutex); write(m_fifo_fd_w, previous_song,strlen(previous_song)); pthread_mutex_unlock(&mutex); relist(); //刷新列表 strcpy(previous_song,"loadfile "); previous_song[strlen(previous_song)]='\0'; } break; //下一曲键 case 10: if(g_cur_song < 19) { strcat(next_song,g_mp3_name[++g_cur_song]); next_song[strlen(next_song)]='\n'; pthread_mutex_lock(&mutex); write(m_fifo_fd_w, next_song,strlen(next_song)); pthread_mutex_unlock(&mutex); relist(); strcpy(next_song,"loadfile "); 20 next_song[strlen(next_song)]='\0'; break; } default: printf("blank_key!\n"); } } close(fd_key); return NULL; } 4.3.2 触屏控制线程 对Mplayer播放器上的触屏按钮、音量条和歌曲列表的制定区进行循环检测(单点触控),检测到被按下后,则执行相应的命令且液晶屏显示同步变化。为防止触屏被频繁被键下,导致发送命令混乱,使用加锁和解锁,保证程序运行稳定。 /*触屏控制线程*/ void *pthread_fun_touch(void *arg) { CUR_VAL val_single; //定义触摸屏数据结构体 int i=0,k=0; //触屏按键计数i,触屏曲目切歌计数k int m_fifo_fd_w; //定义管道文件描述符 int area_vol; int mute_flag = 1; //静音标志位,1正常播放 0静音 char *p[2]={"mute 0\n","mute 1\n"}; //静音开关,0取消静音,1 静音 char pause[]="pause\n"; //暂停命令字符串 char seek_forward[]="seek 10\n"; //快进 10秒 命令字符串 char seek_backward[]="seek -10\n"; //快退 10秒 命令字符串 char previous_song[100]="loadfile "; //载入 歌曲命令前缀 char next_song[100]="loadfile "; g_touch_fd = open_touch_dev("/dev/event0"); //打开触摸屏设备 m_fifo_fd_w = open("m_fifo",O_WRONLY); //只写方式打开管道 //管道文件打开出错处理 if(m_fifo_fd_w == -1) 21 { perror("mkfifo"); exit(-1); } else printf("open fifo success!\n"); while(1) { analysis_event_single(g_touch_fd, &val_single); //单点触摸分析程序 if(val_single.state==1) //数据有效状态标志位:0为数据无效1为数据有效 { if(1 == getfocus(val_single,30, 198, 30, 30)) //暂停 { if(pause_flag==1) //暂停标志位置0 { pause_flag = 0; } else //暂停标志位置1,粘贴暂停图标 { TFT_File_Picture(win_background,330,198, "../picture/mute_1.bmp", 0); pause_flag = 1; } pthread_mutex_lock(&mutex); write(m_fifo_fd_w, pause,strlen(pause)); //向管道写暂停命令 pthread_mutex_unlock(&mutex); printf("----暂停被按下---\n"); usleep(200*1000); //延时0.2s } else if(1 ==getfocus(val_single, 90, 198, 30, 30))//上一曲按钮的检测 { if(g_cur_song > 0) { 22 strcat(previous_song,g_mp3_name[--g_cur_song]); previous_song[strlen(previous_song)]='\n'; pthread_mutex_lock(&mutex); write(m_fifo_fd_w, previous_song,strlen(previous_song)); pthread_mutex_unlock(&mutex); relist(); strcpy(previous_song,"loadfile "); previous_song[strlen(previous_song)]='\0'; //粘贴上一曲图标 TFT_File_Picture(win_background,90,198, "../picture/backward_focus.bmp", 0); usleep(200*1000); TFT_File_Picture(win_background,90,198, "../picture/backward.bmp", 0); } bzero(buf_vol,sizeof(buf_vol)); //音量设定 sprintf(buf_vol,"volume %d 1\n",vol); pthread_mutex_lock(&mutex); write(m_fifo_fd_w, buf_vol,strlen(buf_vol)); pthread_mutex_unlock(&mutex); } else if(1 == getfocus(val_single, 150, 198, 30, 30))//下一曲按钮的检测 { if(g_cur_song < 20) { strcat(next_song,g_mp3_name[++g_cur_song]); printf("%d\n",g_cur_song); next_song[strlen(next_song)]='\n'; printf("%s",next_song); pthread_mutex_lock(&mutex); write(m_fifo_fd_w, next_song,strlen(next_song)); pthread_mutex_unlock(&mutex); relist(); 23 strcpy(next_song,"loadfile "); next_song[strlen(next_song)]='\0'; TFT_File_Picture(win_background,150,198, "../picture/forward_focus.bmp", 0); usleep(200*1000); TFT_File_Picture(win_background, 150, 198, "../picture/forward.bmp", 0); } } else if(1 == getfocus(val_single, 210, 198, 30, 30)) //快退按钮的检测 { TFT_File_Picture(win_background, 330, 198, "../picture/mute_1.bmp", 0); pthread_mutex_lock(&mutex); write( m_fifo_fd_w, seek_backward, strlen(seek_backward) ); pthread_mutex_unlock(&mutex); TFT_File_Picture(win_background,210,198, "../picture/back_focus.bmp", 0); usleep(200*1000); TFT_File_Picture(win_background, 210, 198, "../picture/back.bmp", 0); } else if(1 == getfocus(val_single, 270, 198, 30, 30)) //快进按钮的检测 { TFT_File_Picture(win_background, 330, 198, "../picture/mute_1.bmp", 0); pthread_mutex_lock(&mutex); write( m_fifo_fd_w, seek_forward, strlen(seek_forward) ); pthread_mutex_unlock(&mutex); TFT_File_Picture(win_background,270,198, "../picture/front_focus.bmp", 0); usleep(200*1000); TFT_File_Picture(win_background, 270, 198, "../picture/front.bmp", 0); } 24 else if(1 == getfocus(val_single, 330, 198, 30, 30) ) //静音按钮的检测 { i++; if(i==2) { i=0; } pthread_mutex_lock(&mutex); write(m_fifo_fd_w, p[i],strlen(p[i])); pthread_mutex_unlock(&mutex); if(1 == mute_flag) { TFT_File_Picture(win_background,330,198, "../picture/mute_0.bmp", 0); mute_flag = 0; printf("%d\n",mute_flag);//test } else if(0 == mute_flag) { TFT_File_Picture(win_background,330,198, "../picture/mute_1.bmp", 0); mute_flag = 1; printf("%d\n",mute_flag);//test } usleep(200*1000); } else //触屏区域内,歌曲列表内循环检测是否被按下 { for(k=0;k<20;k++) { if(1 == getfocus(val_single, 415, 40+k*15, 365, 20) ) { 25 g_cur_song = k; strcat(next_song,g_mp3_name[g_cur_song]); next_song[strlen(next_song)]='\n'; pthread_mutex_lock(&mutex); write(m_fifo_fd_w, next_song,strlen(next_song)); pthread_mutex_unlock(&mutex); relist(); strcpy(next_song,"loadfile "); break; } } } for(k=0;k<6;k++) //音量条检测 { //第一段(从上至下) if(1 == getfocus(val_single, 365, 50+k*20, 15, 20) ) { TFT_File_Picture(win_background, 330, 198, "../picture/mute_1.bmp", 0); area_vol = 100-20*k; if(area_vol > vol) //音量加情形下的音量条绘制 { vol = area_vol; TFT_SetColor(win_background, COLOR_GREEN); TFT_Rectangle(win_background,370,150-vol,375,150, PAINT_SOLID); } else //音量减情况下音量条的绘制 { vol = area_vol; TFT_SetColor(win_background, COLOR_BLACK); TFT_Rectangle(win_background,370,50,375,150-vol, PAINT_SOLID); 26 } } } } } return NULL; } 27 5 系统测试 5.1 按键与触屏测试 一、按键测试 本设计一共有9个按键,其中留有一个扩展键,不实现任何功能,留作以后做扩展功能。K1实现静音功能、K2键实现音量加功能、K3键实现音量减功能、K4键实现下一曲功能、K5键实现上一曲功能、K6键实现暂停功能、K7实现快进功能、K8实现快退功能,K9键为扩展键。经测试,八个按键的功能全部实现。 二、触屏测试 本设计中,触摸屏有3个有效检测区域,分别是音量条区、图标按键区和歌曲播放列表区。经过测试:触摸音量条区成功实现音量加减功能;图标按键区某功能键被键下时,液晶屏上会出现相应的提示图标,并且成功实现相应按键的功能(与按键的功能相同);歌曲播放列表区,当相应歌曲被按下时,即切换播放该歌曲。 5.2 其他测试 (1)更换歌曲和Lrc文件时,Mplayer仍旧可以正常读取文件、播放音乐; (2)触摸屏和按键同时被键下时,Mplayer仍旧正常运行。因为在线程中对按键和触屏的写操作添加了互斥锁; (3)一首歌曲播完后,Mplayer自动切换到一下首歌曲,当所有歌曲播完后,Mplayer即停止播放音乐。 5.3 实际效果图 图5.1 Mplayer实物图 28 结论 多媒体播放器,一直是近年来手持设备终端必备软件之一。随着,MP4、MP5、智能手机和平板电脑的不断更新与进步以及用户对多媒体播放器理念的进步,对多媒体播放器提出了进一步的要求,尤其是个性化的设定。Mplayer无疑是其中的先行者之一。其开源的特性、与嵌入式系统的完美结合将成为推动Mplayer继续向前发展的强大动力。 本论文对Mplayer的控制机制做较为深入的研究与探讨。在Slave模式下,对Mplayer赋予图形化的交互界面,增进体验度。本人在大学期间并未接受嵌入式方面的课程,这篇论文的成稿完全出于自己的兴趣。其中所内包的嵌入式理念,“以应用为中心、软硬件可裁剪”,让我感受到个性化设计的魅力所在与学习带来的快乐。 29 参考文献 [1] Stepphen Prata(Learning the vi Editor,Sixth Edition [M](Oreilly,2004. [2] 宋劲杉(Linux C编程一站式学习[M](北京亚嵌教育研究中心,2009. [3] 陈健,宋健建(Linux程序设计(第四版)[M](北京:人民邮出版社2010( [4] 於锋(Linux多线程设计思维[J](单片机与嵌入式系统应用,2012,3:11-13( [5] 李善平,施韦,林欣(Linux 教程[M](北京:清华大学出版社,2005. [6] 凌阳教育(凌阳教育Cortex A8使用说明书[M](北京凌阳爱普,2012( [7] 凌阳教育(ARM版本Mplayer实验指导书[M](北京凌阳爱普,2012. [8] Christopher Negus(Linux Bible,2005 Edition [M](Wiley,2005( [9] 尤晋元,张亚英(UNIX环境高级编程[M](北京:人民邮电出版社,2006( [10] 韦东山(嵌入式Linux应用开发完全手册[M](北京:人民邮电出版社,2008( 30 附录A:部分源代码 一、歌词解析函数 解析lrc文件的一组函数,主要是依赖于链表,包括链表的生成、按序插入、遍历输出和链表的释放。 歌词链表生成函数 用于解析歌曲信息。由于lrc文件本身固定的格式:前四行为歌曲信息(艺术家、歌唱家、专辑和流派),后面为歌词正文,且每行开头以“[ ]”标记当前歌词的匹配时间。所以可以根据这一特点,切割出歌词时间,与匹配的歌词存放在一个结构体中,再构成链表。 参数:lrc_text 指向歌词内容(以行的方式存储)的指针数组,lrc_line 歌词的行数 /*歌词链表生成函数*/ LRC *lrc_resolve(int lrc_line,char *lrc_text[]) { LRC *head=NULL,*lrc_link; //定义的结构体指针LRC int i=0,j=0,CurOffset; //循环变量i、j偏移量,时间偏移量 char *LrcFile; //暂时存放行指针变量 int CurTime[10]; //用来暂时记录歌词中的时间,单位为:秒 int num=0; //用来暂时记录本句歌词有多少个时间与其对应 for(i=4;i= '0' && (LrcFile[CurOffset]) <= '9' ) { char *lrc; //用来暂时记录时间后面的歌词 num=0; //解析每句歌词时,要把本句歌词对应的时间数初始化为0 //取出这句歌词所有时间标签 while(LrcFile[CurOffset] >='0' && LrcFile[CurOffset] <='9') 31 { CurTime[num++]=(((LrcFile[CurOffset]-'0')*10+ (LrcFile[CurOffset+1]-'0') )*60+ ( (LrcFile[CurOffset+3]-'0')*10 +(LrcFile[CurOffset+4] -'0') )); //解析一句歌词在不同时间出现的情况时,需要把指针往后偏移10 CurOffset=CurOffset+10; } //得到歌词首地址“我想大声宣布 对你依依不舍” lrc = &LrcFile[CurOffset-1]; //根据本句歌词对应的时间个数,把歌词与时间 保存到链表中 for(j=0;jtime = CurTime[j]; strcpy (lrc_link->lrc_buf,lrc); //将解析出的时间、歌词内容插入到单向链表并进行排序 head = InsertList(head,lrc_link); } } } return head; } 二、歌词显示线程 通过对歌词解析函数的各个子函数的调度与流程跳转的控制,最终将歌词同步显示到液晶屏幕上。 (1)LRC解析器整体控制函数 函数功能:实现对歌词解析函数组的整体控制。参数:LRC文件的路径名,返回值: 0代表返回主调函数,且开始对下一首歌的歌词文件进行匹配和解析。 /*LRC解析器整体控制函数*/ 32 static char g_lrc_name[50][100] = {""}; //存放lrc文件的路径名 int control_lrc(char *buf) { static int in_lrc = 0; int s_time = 0; // 模拟时间变量 int lrc_line = 0; // lrc文件中的 行数 int file_length = 0; // 存储 lrc文件内容的大小 char *file_buf = NULL;// 指向malloc的空间,其中存放着lrc 文件中所有的内容 char *lrc_text[200] = {NULL}; // 指向,按照 \r\n 切割后的 一行歌词 LRC *head = NULL,*p; // head记录歌词链表头 File_buf = read_src_file(&file_length,buf); // 从lrc 文件中读出歌词内容 lrc_line = strtok_lrc_buf(lrc_text,file_buf); // 按行切割歌曲内容 head = lrc_resolve(lrc_line,lrc_text); // 保存时间:歌词到链表中 print(head); // 遍历链表,打印歌词信(用于测试链表) next_one = 0; //切歌标识位置0 while(1) { usleep(1000*1000); //每秒钟读取一次(全局)时间变量 s_time = atoi(buf_time); //到链表里查找当前时间点对应歌词,如果有则返回歌词的首地址 p = search(head,s_time); if(p!=NULL) { lrc_show(p); if(next_one) //判断切歌标志位为1 ,则退出解析函数,释放链表 { link_free(head); return 0; } } } 33 return 0; } (2)歌词解析线程 对当前播放的曲目在指定的目录下(../lyrics/)进行歌词文件的匹配、解析、最终输出显示到液晶屏上。 /*歌词解析线程*/ void *pthread_fun_lyrics(void *arg) { char *p = NULL; char buf[50] = "",buf_path[50] = ""; char time[50] = ""; get_lrc_name("../lyrics/"); //歌词路径 while(1) //匹配歌词、歌词开始解析 { int res_lrc = 2; //记录函数 control_lrc 的返回值 int res_open_lrc = 0; //记录打开歌词文件是否成功的信息 if(next_one == 0) //判断是否被切歌 { continue; } bzero(buf,sizeof(buf)); //usleep(1000*1000); //每隔1秒读取一次当前播放歌曲序号 sscanf(g_mp3_name[g_cur_song], "../song/%[^.]", buf); //获取当前播放歌曲名 sprintf(buf_path,"../lyrics/%s.lrc",buf); //组包成歌词路径 printf("歌曲匹配的歌词文件的查询路径名:%s\n",buf_path); res_open_lrc = open(buf_path,O_RDONLY); if(res_open_lrc==-1) //打开歌词文件失败处理(没有找到匹配的歌词) { perror("open"); bzero(buf_path,sizeof(buf_path)); 34 //贴图,覆盖原有的歌词 TFT_File_Picture(win_background, 15, 275, "../picture/lyrics.bmp", 0); TFT_SetTextPos(win_lyrics, 0, 0); set_tft_print_ansi(); TFT_Print(win_lyrics,"******没有找到匹配的歌词信息******\n"); set_tft_print_utf8(); next_one = 0; continue; } else //成功找到歌词文件开始匹配 { //printf("成功找到匹配的歌词文件:%s\n",buf_path); res_lrc = control_lrc(buf_path); //调用歌词解析器整体控制函数 if(res_lrc == 0) //数值为0代表已经切歌 { bzero(buf_path,sizeof(buf_path)); continue; } } } return NULL; } 35 致 谢 四年的大学时光,辗转中已经步入了尾声。这几个月论文的写作,既磨练了我的意志,也激发了我对专业的浓厚兴趣,为我将来走向社会奠定了良好的基础。在毕业论文付梓之际,我向曾经给予我帮助和支持的人们表示衷心的感谢。 本毕业论文从选题立意直至定稿是在我的指导老师杨熙老师的亲切关怀和悉心指导下完成。在杨熙老师的指导下,我明晰了论文的关键所在以及文章的主旨思路。以及我在北京凌阳接受培训的期间,让我在专业技能方面获益匪浅的同学、老师们。在此,谨向杨熙老师、北京凌阳的教师们致以我诚挚的谢意和崇高的敬意。 感谢我亲爱的同学们,有幸与你们相遇,你们不仅是我们在最美时光里结识的朋友、更是我们一生的财富。你们是我在大学里的最美的收获,是你们伴我度过了人生中重要的大学时光,日常相处的点点滴滴仿佛犹在昨日。感谢这篇论文所涉及到的各位学者。本文引用了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。 36
/
本文档为【基于 Linux 的 Mplayer 的控制】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索