媒体播放器-项目.ppt

上传人:牧羊曲112 文档编号:6267927 上传时间:2023-10-11 格式:PPT 页数:75 大小:701KB
返回 下载 相关 举报
媒体播放器-项目.ppt_第1页
第1页 / 共75页
媒体播放器-项目.ppt_第2页
第2页 / 共75页
媒体播放器-项目.ppt_第3页
第3页 / 共75页
媒体播放器-项目.ppt_第4页
第4页 / 共75页
媒体播放器-项目.ppt_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《媒体播放器-项目.ppt》由会员分享,可在线阅读,更多相关《媒体播放器-项目.ppt(75页珍藏版)》请在三一办公上搜索。

1、第27章 媒体播放器项目完整实践,在本书前面的章节已介绍了C语言的语法和Linux系统中各种常用的函数库,利用这些知识已可开发一些基本的应用程序。本章将这些知识综合应用到媒体播放器项目中,通过一个严格的项目管理制度对项目进行规划,并补充媒体播放器未实现的功能。如果该项目由多个人协同开发,则可以尝试分工协作,培养协同开发的经验。,27.1 软件工程实战,软件开发的过程中离不开软件工程思想的指导,即使在学习过程中也应该时刻将软件工程方法放在重要位置。如果在学习程序开发过程中就遭遇了项目失败,对于学习者来说,所造成的挫败感一直会影响到将来的实际工作中。而实践软件工程思想又能为将来实际工作打下扎实的基

2、础,因此本节结合媒体播放器项目来进行软件工程的实战。,27.1.1 项目需求分析,项目需求分析经常被作为一个独立的课题来研究,但对于开发人员来说,了解项目需求分析方法也是必不可少的。在朴素软件工程思想中,项目需求分析的方法使用的是实例分析法。,27.1.2 软件需求说明,软件需求说明(Software Requirement Specification,简称SRS)是项目需求分析所得到的文档。它的作用是提出需要解决的问题,作为下一步软件设计和编码的基础。1引言2任务概述3需求规定4运行环境规定5附录,27.1.3 项目视图的解决方案,项目视图指的是项目的实际需求,开发者在软件需求说明文档完成后

3、即可针对项目视图提出解决方案。在给出解决方案的同时也要陈述自己的理由,但应该避免在这个阶段进行软件设计。下面列举媒体播放器项目中主要问题的解决方啊。1媒体播放器界面设计2数据库的选择3读取MP3文件信息4媒体播放功能,27.2 软件设计,软件设计的内容很广泛,但结果只是总结出项目需求所列出功能的实现方法。这个实现方法必须清晰易懂,能够被所有参与项目的开发人员理解。因此,最终获得的应该是数据字典和流程图。本书前面部分已经对媒体库中大部分功能的实现进行了分步讲解,所以,这里讨论另外两个重要话题。第一是需求分析方法,即根据软件需求说明进行详细分析。第二是制订开发计划和分工,目的是帮助读者按步骤实现软

4、件。,27.2.1 需求分析,需求分析是指理解项目的需求,就软件的功能进行深入理解,并且给出明确的解决方案。,27.2.2 制订开发计划,媒体播放器中,首先应定义程序的主体结构,即实现核心控制模块。该模块是其他所有模块操作的基础,缺少该模块则难以进行后面的工作。然后在第二步可以同时进行媒体库模块和播放控制模块的实现,第三步进行用户界面模块和媒体文件解码模块的设计。最后的步骤是系统集成,把所有的模块关联起来,如图27.4所示。,27.2.3 分工协作,一个较大的项目往往需要分工协作,如何进行项目分配和如何执行分配到自身的计划也是开发者必须具备的能力。在这里需要引入一种称之为甘特图的图表,它是以图

5、示的方式通过活动列表和时间刻度形象地表示出软件项目的活动顺序与持续时间。,27.3 版本控制,无论是独立开发的软件项目还是协作开发,都需要进行版本控制。版本控制的作用是保护源代码,将每次对源代码的修改都记录起来。这样一方面能保证可以回溯到指定的时间点,另一方面在多人同时编辑一个源代码文件时不会相互覆盖对方的工作成果。目前版本控制工具有很多,Linux系统上使用最广泛的版本控制工具是CVS。该工具不仅能很好的支持C语言项目,而且能被Eclipse集成开发工具集成使用。,27.3.1 CVS服务器配置,CVS服务器是托管源代码的仓库,开发者通过访问CVS服务器获得源代码资源。在修改了相应的源代码后

6、,源代码及其改动信息又被存回到CVS服务器中。多人参与的项目只用建立一个CVS服务器,开发者通过网络访问该服务器。,27.3.2 CVS服务器管理,CVS是功能齐备的版本控制工具,在使用CVS服务器之前有几个重要概念必须了解。下面分别介绍这几个概念和操作方法。1仓库 2模块3导入 4签出5签入 6添加和删除7历史 8冲突解决9标记 10分支11远程访问 12局限性,27.4 在Eclipse中使用CVS客户端,Eclipse集成开发环境内置了CVS客户端插件,因此可直接使用Eclipse管理CVS服务器中的资源。对于Eclipse来说,CVS用于支持团队开发,是很多大型软件开发团队所选用的工具

7、。在Eclipse中使用CVS客户端的优势在于:Eclipse与CVS无缝连接,可直接通过Eclipse的界面和菜单进行CVS操作。Eclipse为CVS提供了图形用户接口,无需记忆复杂的操作命令。Eclipse支持将CVS模块作为项目操作。,27.4.1 从CVS服务器签出模块并创建项目,无论CVS服务器是在本地,还是在远端,都可以直接从CVS服务器中签出模块并创建项目。,27.4.2 签入文件,每一个文件名后显示该文件的版本号,如果文件在本地被改动过,文件名前面会显示一个小箭头,如图27.13所示。,27.4.3 使用Eclipse项目创建CVS模块,在Eclipse中可以将本地项目导入到

8、CVS服务器中,创建新的模块或签入到已有的模块中。该功能类似于CVS的导入操作和签入操作的集合。,27.4.4 比较文件,Eclipse可以比较本地文件与CVS仓库中文件的差异。在Eclipse主界面选择Window|Team Synchronize命令,将进入到团队同步界面,如图27.20所示。,27.4.5 管理CVS服务器,Eclipse提供了专门的界面管理CVS服务器。如图27.21所示。,27.4.6 断开项目与CVS服务器之间的关联,如果某一项目不在需要与CVS服务器关联起来,可以在项目浏览器中右击该项目,选择Team|Disconnect命令。这时,将弹出Confirm Disc

9、onnect from CVS对话框,如图27.22所示。,27.5 音量控制对话框,音量控制对话框的作用是调节系统音量。单击媒体播放器主界面上的音量调节开关按钮后,如果开关按钮的状态为按下,音量调节对话框将显示出来。如果开关按钮处于原始状态,音量调节对话框被隐藏。相关代码放在“interface.c”文件中。,27.5.1 创建对话框,音量调节对话框的类型属于弹出式窗口,因此它没有普通窗体的标题栏和边框。音量调节对话框出现的位置非常重要,按照GNOME桌面环境约定俗成的规则,通常显示在鼠标指针当前的位置。宏GTK_WIN_POS_MOUSE可返回鼠标当前的位置,它可作为gtk_window_

10、set_position()函数的实际参数。这样,每次音量调节对话框都会显示在鼠标光标指向的位置。,27.5.2 添加垂直比例尺,音量调节对话框内的主要部件是一个垂直比例尺,该比例尺用于调节音量和显示音量的比例。对话框中默认有一个活动区域,实际上它是横向按钮盒。音量调节对话框中没有任何按钮,因此要将活动区域屏蔽起来。本例屏蔽活动区域的方法为,先获得活动区域的地址,其后使用gtk_widget_set_sensitive()函数使活动区域不显示。但是,必须用gtk_button_box_set_layout()函数结束活动区域设置,否则会造成GTK+错误。最后,使用gtk_widget_grab

11、_default()函数让GTK+获得焦点。在创建音量控制对话框函数结尾处还要将diaVolume指针返回。,27.5.3 测试,下面用一个例子测试音量控制对话框的显示效果。在编写代码前,先要在媒体播放器源代码目录中添加C语言源代码文件“callback.c”和头文件“callback.h”。这两个文件用于放置所有回调函数的代码,在后面的开发过程中还将用到。,27.6 播放列表对话框,播放列表对话框由一组工具条按钮、一个树视图和一组按钮构成,下面分别介绍播放列表对话框中这几个部件的实现方法。,27.6.1 创建对话框,播放列表对话框是一个非模式对话框,可以在该对话框显示的同时操作媒体播放器主界

12、面。它与普通窗体的构件区别在于,非模式对话框没有最小化和最大化按钮。非模式对话框与模式对话框的区别在于,前者使用gtk_widget_show()函数显示,后者使用gtk_dialog_run显示。,27.6.2 创建工具条和工具条按钮,播放列表对话框的各种操作都放在工具栏中,对应有7个工具栏按钮。为了便于显示控制,工具条中使用的是工具条按钮。其中“添加”、“打开”、“保存”和“删除”按钮可直接通过图像库创建。但“添加目录”、“删除全部”和“排序”按钮并没有图像库中对于的项目,需要进行自定义。,27.6.3 创建树视图,播放列表的内容显示在树视图中,因此树视图被放置在播放列表对话框的主要位置。

13、播放列表的内容可能不能完全显示在播放列表对胡框中,所以在创建树视图前先要创建一个滚动条窗体容器。将滚动条窗体的水平滚动条屏蔽,设置其垂直滚动条为自动显示。代码中,滚动条窗体的阴影风格被设置为向内,与其他对话框保存统一。然后新建一个树视图,将树视图装入滚动条窗体容器中。,27.6.4 创建对话框按钮,播放列表对话框只需要放置一个按钮,用于关闭对话框。这时需要用到对话框的活动区域部分,代码如下所示:GtkWidget*dialog_action_area2;/用于保存活动区域地址 dialog_action_area2=GTK_DIALOG(diaPlaylist)-action_area;/获得

14、活动区域地址 gtk_widget_show(dialog_action_area2);/显示活动区域 gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog_action_area2),GTK_BUTTONBOX_END);/结束活动区域设置,27.6.5 测试,播放列表的实现与隐藏由媒体播放器主界面上的“播放列表”按钮控制。因此首先要为该按钮的clicked事件连接回调函数。,27.7 媒体库对话框,媒体库对话框的实现方法相对于播放列表对话框略为复杂,主要区别是媒体库对话框使用了2个树视图,一个用于显示分类,另一个用于显示媒体信息。媒体库以标题、艺术

15、家、专辑和流派作为分类的条件,因此需要在原型中显示出来。本例中将介绍树视图的初步实现方法。,27.7.1 创建对话框,媒体库对话框使用的是非模式对话框,很多时候还需要与播放列表对话框同时显示。但是代码量的多少并非是衡量开发者编码水平重要因素,程序清晰易读才是必须遵循的原则。有些时候增加代码复用会加大编码难度,这样将造成更多的编码错误,反而降低了效率。,27.7.2 创建工具条和工具条按钮,媒体库对话框的工具条中共有6个工具条按钮,下列源代码用于创建工具条和工具条按钮:GtkWidget*toolbar;/用于保存工具条容器地址 toolbar=gtk_toolbar_new();/创建工具条容

16、器 gtk_widget_show(toolbar);/显示工具条容器 gtk_box_pack_start(GTK_BOX(vbMedialib),toolbar,FALSE,FALSE,0);/将工具条容器装入纵向组装盒,27.7.3 创建分类部件和媒体信息显示部件,分类部件和媒体信息显示部件均选用树视图构件实现,但是使用的是树视图的两种不同模式。分类的方法有三种,分别是:按艺术家名称分类、按专辑分类和按流派分类。,27.7.4 创建搜索部件,搜索部件是文本输入框、组合框和按钮这3个构件的组合。文本输入框用于输入搜索字符串,组合框中放置着搜索条件。本例中搜索部件是横向排列的三个构件,因此在

17、代码中先要创建一个横向组装盒,将横向组装盒装入上一层的纵向组装盒中。然后分别创建文本输入框、组合框和查找按钮,将这些构件装入到横向组装盒中。搜索的5个条件已添加到组合框上,严格的程序开发过程中,这种用法并不规范。因此,必须用文档记录这几个条件的顺序,以确保在实现查找功能时不会出错。,27.7.5 创建对话框按钮,媒体库对话框只需要放置一个按钮用于关闭对话框。代码如下所示:GtkWidget*dialog_action_area4;/用于保存活动区域地址 dialog_action_area4=GTK_DIALOG(diaPlaylist)-action_area;/获得活动区域地址 gtk_w

18、idget_show(dialog_action_area4);/显示活动区域 gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog_action_area4),GTK_BUTTONBOX_END);/结束活动区域设置 GtkWidget*closebutton2;/用于保存关闭按钮地址,27.7.6 测试,本部分的测试内容主要是介绍树视图的简单操作,实现分类部件的初始化。首先要修改“interface.h”头文件中的结构体_interface,增加分类树视图的指针。,27.8 播放控制模块实现,播放控制模块是媒体播放器中最重要的核心。该模块的作用是架

19、起媒体播放器与GStreamer多媒体框架之间的桥梁,使媒体播放器能通过GStreamer多媒体框架实现MP3播放的功能。因为GStreamer函数库提供了非常简单的接口对播放进行控制,实现播放控制模块所需要的代码并不多。下面开始介绍播放控制模块实现的方法。,27.8.1 播放控制模块程序结构,播放控制模块的源代码放置在“play.h”头文件和“play.c”源代码文件中,先在媒体播放器项目的源代码目录中新建这两个文件。,27.8.2 MP3播放功能实现,上一节已经讨论了播放控制模块的程序结构,MP3播放功能实际上是在play()函数中通过调用GStreamer库实现。在创建函数前,先要为“p

20、lay.c”文件加上一些相关的头文件。1函数接口和相关数据类型的定义2播放指令处理3MP3文件播放,27.8.3 播放中的回调处理,在GStreamer管道进行播放时,会产生大量的信号。例如管道中的文件信息,播放时出现的错误信息和播放和播放结束的信息。play()函数将总线消息的回调设为bus_call()函数,下面介绍该函数的实现过程。1函数参数列表和数据转换2处理播放结束3获取MP3文件真实信息4错误处理5测试,27.9 系统集成,媒体播放器中的所有模块均已实现,在编码过程中的最后一步即系统集成。系统集成是让所有模块相互关联起来,共同工作,形成一个可用的程序。工序中,首先要设计一个主程序文

21、件,为所有模块初始化。然后以自上而下的方法实现界面上所有部件的功能。从主界面的实现开始,直到每个菜单项和按钮的功能都实现。,27.10 主程序文件实现,主程序文件由一个名为“main.c”的源代码文件和名为“main.h”的头文件组成。其中,最重要的函数就是主函数main()。主函数是一个程序的接口,实际的项目中,主函数的作用通常是对其他所有函数模块进行初始化,并且创建其他模块所需的数据结构。在主函数退出前,程序所占用的所有系统资源将被释放。,27.10.1 头文件和主函数入口,主程序中除了要放置基本的C语言标准库头文件外,还要放入GLib库、GTK+库、GStreamer库和SQLite库的

22、入口函数头文件。源代码目录中其他模块的头文件也应被主程序包含,这样所有的模块间就能相互调用。,27.10.2 媒体库模块初始化,媒体库模块初始化的工作包括连接数据库,创建媒体库链表和播放列表链表入口,以及从数据库中读取媒体库信息。媒体库链表和播放列表链表都是使用自定义的link_t类型,该类型只是链表的接口,其他媒体库模块的函数将通过该接口创建动态数据结构。最后一行调用的load_medialib()函数参数是媒体库链表入口,此函数将读取数据库中媒体库信息表内的数据,并用这些数据为媒体库初始化。,27.10.3 图形界面初始化,图形界面初始化包含4个步骤。首先初始化GTK+库,读取主函数传递来

23、的运行参数。然后创建界面的数据结构和相关界面,这个过程是对界面数据结构的初始化。再对主界面进行操作,显示主界面并,并且为主界面连接回调函数。最后启动GTK+主循环。,27.10.4 退出前清理,媒体播放器的程序代码中有许多地方用到了动态内存分配技术,因此需要在退出前对这些内存进行清理。清理工作可分为两类,一类是直接由申请内存的函数库来清理,例如大部分GTK+库的对象都能自动清理内存。另一类是用户手动清理,主要是针对自定义的动态数据结构。,27.10.5 编译和运行,媒体播放器调用了很多函数库,这些函数库的路径必须在编译时指明。如果是在终端上使用GCC编译器进行编译,同时借助pkgconfig程

24、序提供函数库路径,完整的编译指令如下所示:gcc-g pkg-config-cflags-libs glib-2.0 gtk+-2.0 gstreamer-base-0.10 id3tag sqlite3 main.c-o mp3player编译成功后,源代码目录中将新增一个名为mp3player的可执行文件。程序执行时,可在屏幕上显示出媒体播放器的主界面。,27.11 媒体库功能集成,媒体库功能集成涉及到与用户界面模块和核心控制模块的数据传递。每一个操作指令均由界面的回调函数向核心控制模块发出,核心控制模块再选择函数对媒体库进行操作,最后又影响到界面的显示。下面介绍媒体库功能集成的方法。,2

25、7.11.1 初始化,在媒体播放器主函数中,虽然已经创建了媒体库相关的数据结构,并且从数据库中读取了相应数据传递到媒体库链表。但是,核心控制模块中并未获得媒体库链表的入口,所以还需要进行数据传递才能实现媒体库的初始化。,27.11.2 显示媒体库对话框,主函数初始化界面数据结构时已创建了媒体库对话框,但对话框中并没有显示任何内容。显示媒体库对话框操作的主要难点在于,显示媒体库的同时将媒体库信息读入相应的树视图中。,27.11.3 添加文件,向媒体库添加文件操作需要用到文件选择对话框。该对话框的地址不用传递给界面的数据结构,相关的创建代码可在添加按钮的回调函数中实现。其他操作均可用以前实现的代码

26、来完成。,27.11.4 添加目录,添加目录操作比添加文件操作实现起来略微复杂一些,因为要处理将多个文件传递到数据库中的操作。下面介绍实现步骤。(1)修改create_diaMedialib()函数,为添加目录按钮连接回调函数。(2)实现回调函数on_tlbAdddir_clicked(),代码中将创建文件选择对话框,运行结束时销毁该对话框。(3)修改核心控制模块,处理MEDIALIB_ADD_FILE指令。(4)创建函数medialib_add_dir(),该函数的作用是将目录中的文件添加到媒体库链表,并且再将新增加节点上的数据保存到数据库。,27.11.5 删除文件信息,删除媒体文件信息比

27、较简单的流程为先在数据库中删除指定项目,然后重新读取数据库,最后刷新树视图。下面是该流程的实现方法。(1)修改create_diaMedialib()函数,为删除按钮连接回调函数。(2)创建回调函数on_tlbDel_clicked(),该函数将从树视图中读取被选择的数据,然后传递到核心控制模块进行处理。(3)修改核心控制模块,处理MEDIALIB_DEL指令。(4)创建medialib_del()函数。该函数的作用是从数据库中删除指定文件信息,然后从数据库中重新读取数据到媒体库链表中。,27.11.6 删除所有文件信息,删除所有文件信息实现的思路是先删除数据库中的所有节点,然后重新读入数据库

28、。这时读入的链表长度为0,达到了删除掉的目的。下面是实现步骤。(1)修改create_diaMedialib()函数,为删除全部按钮连接回调函数。(2)创建回调函数on_tlbDelall_clicked(),该函数将传递删除媒体库中所有信息和刷新树视图指令到核心控制模块进行处理。(3)修改核心控制模块,处理MEDIALIB_DEL_ALL指令。(4)创建medialib_del_all()函数。,27.11.7 搜索本地文件,搜索本地文件主要会用到在设计媒体库链表数据结构时创建的link_search()函数,该函数将遍历计算机中整个文件系统。并且将找到的MP3文件加入媒体库链表。(1)修改

29、create_diaMedialib()函数,为“搜索本地媒体文件”按钮连接回调函数。(2)创建回调函数on_ tlbSearch _clicked(),该函数将创建一个对话框询问用户是否进行搜索本地文件操作。(3)修改核心控制模块,处理MEDIALIB_SEARCH指令。(4)创建medialib_search()函数。,27.11.8 传递到播放列表,媒体库对话框中的“传递到播放列表”按钮作用是将媒体库链表中的节点传递到播放列表链表中。用户可通过该按钮向播放列表添加数据,播放媒体库中指定的媒体文件。下面介绍实现该操作的步骤。(1)修改create_diaMedialib()函数,为“传递到

30、播放列表”按钮连接回调函数。(2)创建回调函数on_tlbSendto_clicked(),该函数将获得树视图中被选中的文件路径,并传递到核心控制模块。(3)修改核心控制模块,处理MEDIALIB_SEND_TO_PLAYLIST指令。(4)创建medialib_sendto(),该函数的作用是为播放列表链表添加新节点。,27.11.9 查找,查找操作的实现方法是,先使用link_find()函数找到媒体库链表中与条件匹配的项目,然后将这些项目添加到链表上。最后重新显示树视图。查找操作要用到3个界面构件,因此还需要继续扩展界面的数据结构InterFace。下面介绍实现查找操作的步骤。(1)修改

31、InterFace定义,增加指向查找区域的文本输入框和组合框的指针。(2)修改create_diaMedialib()函数,将查找操作相关界面构件的地址传递到界面的数据结构。(3)修改create_diaMedialib()函数,为“查找”按钮连接回调函数。(4)创建回调函数on_btFind_clicked()。(5)修改核心控制模块,处理MEDIALIB_FIND指令。(6)实现medialib_find()函数。,27.12 播放列表功能集成,播放列表功能集成需要考虑到M3U文件支持和与播放控制模块之间的互动。播放列表虽然不进行数据库操作,但是要求能将播放列表中的数据保存到M3U文件中,

32、或者从M3U文件读取数据到播放列表。播放列表的设计目的是能够使播放控制模块以播放列表中的顺序进行播放,因此实现时要考虑两者的数据传递。虽然播放列表大部分操作以对播放列表列表数据的访问为主,不过播放列表对话框上要能显示出当前播放的媒体在播放列表中的位置。,27.12.1 初始化,播放列表的初始化操作是在主函数中创建播放列表链表,然后将链表的地址传递到核心控制模块中。下面介绍实现步骤。(1)修改主函数,在创建播放列表链表后,增加一条对核心控制模块的调用。(2)在核心控制模块中创建指向播放列表链表的指针,用于核心控制模块保存播放列表链表的入口。(3)在核心控制模块函数的switch选择结构中,增加对

33、GENERAL_PLAYLIST_INIT指令处理的代码。,27.12.2 显示播放列表对话框,媒体播放器主界面上的“播放列表”按钮用于操纵播放列表对话框的显示。操作流程为,当“播放列表”按钮按下时,回调函数判断播放列表对话框是否已显示。如果播放列表对话框没有显示,则传送显示播放列表指令到核心控制模块。核心控制模块调用指定函数,判断播放列表对话框是否已初始化,如果没有则先进行初始化,最后显示出播放列表对胡框。,27.12.3 添加文件,当按下播放列表对话框中的添加按钮时,播放列表对话框应能弹出一个对话框供用户选择文件。然后将该文件的信息添加到播放列表链表的末端。需要注意到是,播放列表对话框上按

34、钮的名称与媒体库对话框不同,因此回调函数也有区别,不能简单地复用。,27.12.4 添加目录,添加目录操作的目的是将目录中所有MP3文件添加到播放列表中,主要的业务逻辑代码依然是复用媒体库所提供的。下面介绍实现步骤。(1)修改create_diaPlaylist()函数,为添加目录按钮连接回调函数。(2)实现回调函数on_tbtAdddir_clicked(),代码中将创建文件选择对话框,运行结束时销毁该对话框。(3)修改核心控制模块,处理PLAYLIST_ADD_DIR指令。(4)创建函数playlist_add_dir(),该函数的作用是将目录中的所有MP3文件添加到播放列表链表中。,27

35、.12.5 打开文件,前面章节介绍过播放列表文件M3U,并且实现了读取M3U文件到播放列表的函数load_m3u()。下面介绍利用该函数打开M3U文件的操作步骤。(1)修改create_diaPlaylist()函数,为打开文件按钮连接回调函数。(2)实现回调函数on_tbtOpen_clicked(),代码中将创建文件选择对话框,运行结束时销毁该对话框。(3)修改核心控制模块,处理PLAYLIST_OPEN指令。(4)创建函数playlist_open(),该函数的作用是将目录中的所有MP3文件添加到播放列表链表中。,27.12.6 保存文件,保存M3U文件使用的是函数save_m3u(),

36、该函数已经被建立。下面介绍利用该函数保存M3U文件的操作步骤。(1)修改create_diaPlaylist()函数,为保存按钮连接回调函数。(2)实现回调函数on_tbtSave_clicked()。代码中将创建文件选择对话框,该对话框的类型为保存文件,否则无法设置新文件名。(3)修改核心控制模块,处理PLAYLIST_SAVE指令。(4)创建函数playlist_save(),该函数的作用是将播放列表链表中所有MP3文件信息添加到M3U文件中。,27.12.7 删除文件,在播放列表对话框中删除文件不涉及数据库的操作,相反,要实现链表的操作。下面是该操作的实现方法。(1)修改create_d

37、iaMedialib()函数,为删除按钮连接回调函数。(2)创建回调函数on_tbtDel_clicked()。该函数将判断树视图是否选择了数据,如果是,则发送指令到核心控制模块处理。(3)修改核心控制模块,处理PLAYLIST_DEL指令。(4)创建playlist_del()函数。该函数的作用是从播放列表链表中删除指定文件信息。删除链表节点要用到节点在链表中的位置编号,这里实现的方法是读取被选择文件在树视图中的行号来实现。,27.12.8 删除全部,删除全部操作指的是清空播放列表,实现方法为删除播放列表链表上的所有节点。下面结构该操作实现步骤。(1)修改create_diaMedialib

38、()函数,为删除全部按钮连接回调函数。(2)创建回调函数on_tbtDelall_clicked(),该函数将传递删除媒体库中所有信息和刷新树视图指令到核心控制模块进行处理。(3)修改核心控制模块,处理PLAYLIST_DEL_ALL指令。(4)创建playlist_del_all()函数。,27.12.9 排序,排序的方法有很多种,其中最容易实现的是比较法排序。对播放列表排序的函数在前面已实现,下面介绍与播放列表对话框集成的方法。(1)修改create_diaMedialib()函数,为排序按钮连接回调函数。(2)创建回调函数on_tbtComp_clicked(),该函数将传递排序指令到核

39、心控制模块进行处理。(3)修改核心控制模块,处理PLAYLIST_COMP指令。(4)创建playlist_del_all()函数。,27.13 播放控制模块集成,播放控制模块的集成与其他模块密切相关,各种操作由媒体播放器主界面发出,然后播放的信息又被反映到媒体播放器的主界面中来。播放模式有3种,分别是顺序模式、循环模式和随机模式,播放模式通过主界面上的模式选择组合框设置。播放控制指令有5种,分别是开始播放、暂停播放、停止播放、上一首和下一首,各种指令都对应着媒体播放器主界面上的按钮。,27.13.1 播放模式设置,播放模式设置的数值被保存在核心控制模块中,是一个静态类型的整型变量,名称为st

40、ate。下面介绍模板模式设置操作实现的步骤。(1)修改create_winMain()函数。为播放模式组合框的active信号链接回调函数,选择组合框中的选项时回调函数将被执行。(2)创建回调函数on_cbbMode_active(),该函数将传递排序指令到核心控制模块进行处理。(3)修改核心控制模块,处理GENERAL_PLAY_MODE指令。,27.13.2 开始播放,当用户按下播放按钮后,核心控制模块将根据播放模式的设定来选择要播放的文件。下面介绍实现播放操作的步骤。(1)修改create_winMain()函数。为播放按钮的clicked信号链接回调函数。(2)创建回调函数on_btP

41、lay_clicked()。该函数负责向核心控制模块发送播放信号。(3)修改核心控制模块,处理PLAY_START指令。(4)创建play_start()函数,该函数将保存上一个播放的文件。如果不存在上一个播放文件的记录,说明播放的是首个文件,播放操作将从媒体库链表的首端开始。,27.13.3 暂停播放,当用户按下暂停按钮后,核心控制模块将向播放控制模块传送暂停播放指令。下面介绍实现暂停播放操作的步骤。(1)修改create_winMain()函数。为暂停按钮的clicked信号链接回调函数。(2)创建回调函数on_btPause_clicked()。该函数负责向核心控制模块发送播放信号。(3

42、)修改核心控制模块,处理PLAY_PAUSE指令。,27.13.4 停止播放,当用户按下停止按钮后,核心控制模块将向播放控制模块传送停止播放指令。下面介绍停止播放操作的步骤。(1)修改create_winMain()函数。为停止按钮的clicked信号链接回调函数。(2)创建回调函数on_btStop_clicked()。该函数负责向核心控制模块发送停止播放信号。(3)修改核心控制模块,处理PLAY_STOP指令。,27.13.5 播放上一首,当用户按下“播放上一首”按钮后,核心控制模块将向播放控制模块传送播放上一首指令。下面介绍播放上一首操作的步骤。(1)修改create_winMain()

43、函数。为“播放上一首”按钮的clicked信号链接回调函数。(2)创建回调函数on_btPre_clicked()。该函数负责向核心控制模块发送停止播放信号。(3)修改核心控制模块,处理PLAY_PRE指令。,27.13.6 播放下一首,当用户按下“播放下一首”按钮后,核心控制模块将遍历播放列表链表,找到要播放的下一个文件。下面介绍实现播放操作的步骤。(1)修改create_winMain()函数。为“播放下一首”按钮的clicked信号链接回调函数。(2)创建回调函数on_btNext_clicked()。该函数负责向核心控制模块发送播放信号。(3)修改核心控制模块,处理PLAY_NEXT指令。,27.14 小结,本章综合讲解了软件工程在项目开发中的实际应用,并且结合软件工程对媒体播放器项目的开发进行了科学规划。另外,本章引进了版本控制概念,使读者了解大型软件分工协作的实现方式,以及版本控制软件CVS的使用方法。最后,为读者介绍了媒体播放器项目的播放功能的实现,以及系统集成的概率。相信读者在理解这些内容后,能够具备实际的Linux软件项目编程技能。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号