第27章__媒体播放器项目课件_第1页
第27章__媒体播放器项目课件_第2页
第27章__媒体播放器项目课件_第3页
第27章__媒体播放器项目课件_第4页
第27章__媒体播放器项目课件_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第27章 媒体播放器项目完整实践 在本书前面的章节已介绍了C语言的语法和Linux系统 中各种常用的函数库,利用这些知识已可开发一些基本的应 用程序。本章将这些知识综合应用到媒体播放器项目中,通 过一个严格的项目管理制度对项目进行规划,并补充媒体播 放器未实现的功能。如果该项目由多个人协同开发,则可以 尝试分工协作,培养协同开发的经验。 27.1 软件工程实战 软件开发的过程中离不开软件工程思想的指导,即使在 学习过程中也应该时刻将软件工程方法放在重要位置。如果 在学习程序开发过程中就遭遇了项目失败,对于学习者来说 ,所造成的挫败感一直会影响到将来的实际工作中。而实践 软件工程思想又能为将来实际工作打下扎实的基础,因此本 节结合媒体播放器项目来进行软件工程的实战。 27.1.1 项目需求分析 项目需求分析经常被作为一个独立的课题来研究,但对 于开发人员来说,了解项目需求分析方法也是必不可少的。 在朴素软件工程思想中,项目需求分析的方法使用的是实例 分析法。 27.1.2 软件需求说明 软件需求说明(Software Requirement Specification, 简称SRS)是项目需求分析所得到的文档。它的作用是提出 需要解决的问题,作为下一步软件设计和编码的基础。 1引言 2任务概述 3需求规定 4运行环境规定 5附录 27.1.3 项目视图的解决方案 项目视图指的是项目的实际需求,开发者在软件需求说 明文档完成后即可针对项目视图提出解决方案。在给出解决 方案的同时也要陈述自己的理由,但应该避免在这个阶段进 行软件设计。下面列举媒体播放器项目中主要问题的解决方 啊。 1媒体播放器界面设计 2数据库的选择 3读取MP3文件信息 4媒体播放功能 27.2 软件设计 软件设计的内容很广泛,但结果只是总结出项目需求所 列出功能的实现方法。这个实现方法必须清晰易懂,能够被 所有参与项目的开发人员理解。因此,最终获得的应该是数 据字典和流程图。本书前面部分已经对媒体库中大部分功能 的实现进行了分步讲解,所以,这里讨论另外两个重要话题 。第一是需求分析方法,即根据软件需求说明进行详细分析 。第二是制订开发计划和分工,目的是帮助读者按步骤实现 软件。 27.2.1 需求分析 需求分析是指理解项目的需求,就软件的功能进行深入 理解,并且给出明确的解决方案。 27.2.2 制订开发计划 媒体播放器中,首先应定义程序的主体结构,即实现核心控制模块 。该模块是其他所有模块操作的基础,缺少该模块则难以进行后面的工作 。然后在第二步可以同时进行媒体库模块和播放控制模块的实现,第三步 进行用户界面模块和媒体文件解码模块的设计。最后的步骤是系统集成, 把所有的模块关联起来,如图27.4所示。 27.2.3 分工协作 一个较大的项目往往需要分工协作,如何进行项目分配和如 何执行分配到自身的计划也是开发者必须具备的能力。在这里需 要引入一种称之为甘特图的图表,它是以图示的方式通过活动列 表和时间刻度形象地表示出软件项目的活动顺序与持续时间。 27.3 版本控制 无论是独立开发的软件项目还是协作开发,都需要进行 版本控制。版本控制的作用是保护源代码,将每次对源代码 的修改都记录起来。这样一方面能保证可以回溯到指定的时 间点,另一方面在多人同时编辑一个源代码文件时不会相互 覆盖对方的工作成果。目前版本控制工具有很多,Linux系 统上使用最广泛的版本控制工具是CVS。该工具不仅能很好 的支持C语言项目,而且能被Eclipse集成开发工具集成使用 。 27.3.1 CVS服务器配置 CVS服务器是托管源代码的仓库,开发者通过访问CVS 服务器获得源代码资源。在修改了相应的源代码后,源代码 及其改动信息又被存回到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用于 支持团队开发,是很多大型软件开发团队所选用的工具。在 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中可以将本地项目导入到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 Disconnect from CVS对话框,如图 27.22所示。 27.5 音量控制对话框 音量控制对话框的作用是调节系统音量。单击媒体播放 器主界面上的音量调节开关按钮后,如果开关按钮的状态为 按下,音量调节对话框将显示出来。如果开关按钮处于原始 状态,音量调节对话框被隐藏。相关代码放在“interface.c” 文件中。 27.5.1 创建对话框 音量调节对话框的类型属于弹出式窗口,因此它没有普 通窗体的标题栏和边框。 音量调节对话框出现的位置非常重要,按照GNOME桌 面环境约定俗成的规则,通常显示在鼠标指针当前的位置。 宏GTK_WIN_POS_MOUSE可返回鼠标当前的位置,它可 作为gtk_window_set_position()函数的实际参数。这样,每 次音量调节对话框都会显示在鼠标光标指向的位置。 。 27.5.2 添加垂直比例尺 音量调节对话框内的主要部件是一个垂直比例尺,该比 例尺用于调节音量和显示音量的比例。 对话框中默认有一个活动区域,实际上它是横向按钮盒 。音量调节对话框中没有任何按钮,因此要将活动区域屏蔽 起来。本例屏蔽活动区域的方法为,先获得活动区域的地址 ,其后使用gtk_widget_set_sensitive()函数使活动区域不显示 。但是,必须用gtk_button_box_set_layout()函数结束活动 区域设置,否则会造成GTK+错误。 最后,使用gtk_widget_grab_default()函数让GTK+获 得焦点。在创建音量控制对话框函数结尾处还要将 diaVolume指针返回。 27.5.3 测试 下面用一个例子测试音量控制对话框的显示效果。在编 写代码前,先要在媒体播放器源代码目录中添加C语言源代 码文件“callback.c”和头文件“callback.h”。这两个文件用于 放置所有回调函数的代码,在后面的开发过程中还将用到。 27.6 播放列表对话框 播放列表对话框由一组工具条按钮、一个树视图和一组 按钮构成,下面分别介绍播放列表对话框中这几个部件的实 现方法。 27.6.1 创建对话框 播放列表对话框是一个非模式对话框,可以在该对话框 显示的同时操作媒体播放器主界面。它与普通窗体的构件区 别在于,非模式对话框没有最小化和最大化按钮。非模式对 话框与模式对话框的区别在于,前者使用gtk_widget_show() 函数显示,后者使用gtk_dialog_run显示。 27.6.2 创建工具条和工具条按钮 播放列表对话框的各种操作都放在工具栏中,对应有7 个工具栏按钮。 为了便于显示控制,工具条中使用的是工具条按钮。其 中“添加”、“打开”、“保存”和“删除”按钮可直接通过图像库 创建。但“添加目录”、“删除全部”和“排序”按钮并没有图像 库中对于的项目,需要进行自定义。 27.6.3 创建树视图 播放列表的内容显示在树视图中,因此树视图被放置在 播放列表对话框的主要位置。 播放列表的内容可能不能完全显示在播放列表对胡框中 ,所以在创建树视图前先要创建一个滚动条窗体容器。将滚 动条窗体的水平滚动条屏蔽,设置其垂直滚动条为自动显示 。代码中,滚动条窗体的阴影风格被设置为向内,与其他对 话框保存统一。然后新建一个树视图,将树视图装入滚动条 窗体容器中。 27.6.4 创建对话框按钮 播放列表对话框只需要放置一个按钮,用于关闭对话框。这时需要 用到对话框的活动区域部分,代码如下所示: GtkWidget *dialog_action_area2;/ 用于保存活动区域地址 dialog_action_area2 = GTK_DIALOG (diaPlaylist)-action_area; / 获得活动区域地址 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个树视图,一个用于 显示分类,另一个用于显示媒体信息。媒体库以标题、艺术 家、专辑和流派作为分类的条件,因此需要在原型中显示出 来。本例中将介绍树视图的初步实现方法。 27.7.1 创建对话框 媒体库对话框使用的是非模式对话框,很多时候还需要 与播放列表对话框同时显示。 但是代码量的多少并非是衡量开发者编码水平重要因素 ,程序清晰易读才是必须遵循的原则。有些时候增加代码复 用会加大编码难度,这样将造成更多的编码错误,反而降低 了效率。 27.7.2 创建工具条和工具条按钮 媒体库对话框的工具条中共有6个工具条按钮,下列源 代码用于创建工具条和工具条按钮: GtkWidget *toolbar;/ 用于保存工具条容器地址 toolbar = gtk_toolbar_new ();/ 创建工具条容器 gtk_widget_show (toolbar);/ 显示工具条容器 gtk_box_pack_start (GTK_BOX (vbMedialib), toolbar, FALSE, FALSE, 0);/ 将工具条容器装入纵向组装盒 27.7.3 创建分类部件和媒体信息显示部件 分类部件和媒体信息显示部件均选用树视图构件实现, 但是使用的是树视图的两种不同模式。分类的方法有三种, 分别是:按艺术家名称分类、按专辑分类和按流派分类。 27.7.4 创建搜索部件 搜索部件是文本输入框、组合框和按钮这3个构件的组 合。文本输入框用于输入搜索字符串,组合框中放置着搜索 条件。 本例中搜索部件是横向排列的三个构件,因此在代码中 先要创建一个横向组装盒,将横向组装盒装入上一层的纵向 组装盒中。然后分别创建文本输入框、组合框和查找按钮, 将这些构件装入到横向组装盒中。搜索的5个条件已添加到 组合框上,严格的程序开发过程中,这种用法并不规范。因 此,必须用文档记录这几个条件的顺序,以确保在实现查找 功能时不会出错。 27.7.5 创建对话框按钮 媒体库对话框只需要放置一个按钮用于关闭对话框。代码如下所示 : GtkWidget *dialog_action_area4;/ 用于保存活动区域地址 dialog_action_area4 = GTK_DIALOG (diaPlaylist)-action_area; / 获得活动区域地址 gtk_widget_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 播放控制模块实现 播放控制模块是媒体播放器中最重要的核心。该模块的 作用是架起媒体播放器与GStreamer多媒体框架之间的桥梁 ,使媒体播放器能通过GStreamer多媒体框架实现MP3播放 的功能。因为GStreamer函数库提供了非常简单的接口对播 放进行控制,实现播放控制模块所需要的代码并不多。下面 开始介绍播放控制模块实现的方法。 27.8.1 播放控制模块程序结构 播放控制模块的源代码放置在“play.h”头文件和 “play.c”源代码文件中,先在媒体播放器项目的源代码目录 中新建这两个文件。 27.8.2 MP3播放功能实现 上一节已经讨论了播放控制模块的程序结构,MP3播 放功能实际上是在play()函数中通过调用GStreamer库实现 。在创建函数前,先要为“play.c”文件加上一些相关的头文 件。 1函数接口和相关数据类型的定义 2播放指令处理 3MP3文件播放 27.8.3 播放中的回调处理 在GStreamer管道进行播放时,会产生大量的信号。例 如管道中的文件信息,播放时出现的错误信息和播放和播放 结束的信息。play()函数将总线消息的回调设为bus_call()函 数,下面介绍该函数的实现过程。 1函数参数列表和数据转换 2处理播放结束 3获取MP3文件真实信息 4错误处理 5测试 27.9 系统集成 媒体播放器中的所有模块均已实现,在编码过程中的最 后一步即系统集成。系统集成是让所有模块相互关联起来, 共同工作,形成一个可用的程序。工序中,首先要设计一个 主程序文件,为所有模块初始化。然后以自上而下的方法实 现界面上所有部件的功能。从主界面的实现开始,直到每个 菜单项和按钮的功能都实现。 27.10 主程序文件实现 主程序文件由一个名为“main.c”的源代码文件和名为 “main.h”的头文件组成。其中,最重要的函数就是主函数 main()。主函数是一个程序的接口,实际的项目中,主函数 的作用通常是对其他所有函数模块进行初始化,并且创建其 他模块所需的数据结构。在主函数退出前,程序所占用的所 有系统资源将被释放。 27.10.1 头文件和主函数入口 主程序中除了要放置基本的C语言标准库头文件外,还 要放入GLib库、GTK+库、GStreamer库和SQLite库的入口 函数头文件。源代码目录中其他模块的头文件也应被主程序 包含,这样所有的模块间就能相互调用。 27.10.2 媒体库模块初始化 媒体库模块初始化的工作包括连接数据库,创建媒体库 链表和播放列表链表入口,以及从数据库中读取媒体库信息 。 媒体库链表和播放列表链表都是使用自定义的link_t类 型,该类型只是链表的接口,其他媒体库模块的函数将通过 该接口创建动态数据结构。最后一行调用的load_medialib() 函数参数是媒体库链表入口,此函数将读取数据库中媒体库 信息表内的数据,并用这些数据为媒体库初始化。 27.10.3 图形界面初始化 图形界面初始化包含4个步骤。首先初始化GTK+库, 读取主函数传递来的运行参数。然后创建界面的数据结构和 相关界面,这个过程是对界面数据结构的初始化。再对主界 面进行操作,显示主界面并,并且为主界面连接回调函数。 最后启动GTK+主循环。 27.10.4 退出前清理 媒体播放器的程序代码中有许多地方用到了动态内存分 配技术,因此需要在退出前对这些内存进行清理。清理工作 可分为两类,一类是直接由申请内存的函数库来清理,例如 大部分GTK+库的对象都能自动清理内存。另一类是用户手 动清理,主要是针对自定义的动态数据结构。 27.10.5 编译和运行 媒体播放器调用了很多函数库,这些函数库的路径必须 在编译时指明。如果是在终端上使用GCC编译器进行编译, 同时借助pkgconfig程序提供函数库路径,完整的编译指令如 下所示: 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 媒体库功能集成 媒体库功能集成涉及到与用户界面模块和核心控制 模块的数据传递。每一个操作指令均由界面的回调函数 向核心控制模块发出,核心控制模块再选择函数对媒体 库进行操作,最后又影响到界面的显示。下面介绍媒体 库功能集成的方法。 27.11.1 初始化 在媒体播放器主函数中,虽然已经创建了媒体库相关的 数据结构,并且从数据库中读取了相应数据传递到媒体库链 表。但是,核心控制模块中并未获得媒体库链表的入口,所 以还需要进行数据传递才能实现媒体库的初始化。 27.11.2 显示媒体库对话框 主函数初始化界面数据结构时已创建了媒体库对话框, 但对话框中并没有显示任何内容。显示媒体库对话框操作的 主要难点在于,显示媒体库的同时将媒体库信息读入相应的 树视图中。 27.11.3 添加文件 向媒体库添加文件操作需要用到文件选择对话框。该对 话框的地址不用传递给界面的数据结构,相关的创建代码可 在添加按钮的回调函数中实现。其他操作均可用以前实现的 代码来完成。 27.11.4 添加目录 添加目录操作比添加文件操作实现起来略微复杂一些,因为 要处理将多个文件传递到数据库中的操作。下面介绍实现步骤。 (1)修改create_diaMedialib()函数,为添加目录按钮连接回 调函数。 (2)实现回调函数on_tlbAdddir_clicked(),代码中将创建 文件选择对话框,运行结束时销毁该对话框。 (3)修改核心控制模块,处理MEDIALIB_ADD_FILE指令 。 (4)创建函数medialib_add_dir(),该函数的作用是将目录 中的文件添加到媒体库链表,并且再将新增加节点上的数据保存 到数据库。 27.11.5 删除文件信息 删除媒体文件信息比较简单的流程为先在数据库中删除指定 项目,然后重新读取数据库,最后刷新树视图。下面是该流程的 实现方法。 (1)修改create_diaMedialib()函数,为删除按钮连接回调函 数。 (2)创建回调函数on_tlbDel_clicked(),该函数将从树视图 中读取被选择的数据,然后传递到核心控制模块进行处理。 (3)修改核心控制模块,处理MEDIALIB_DEL指令。 (4)创建medialib_del()函数。该函数的作用是从数据库中 删除指定文件信息,然后从数据库中重新读取数据到媒体库链表 中。 27.11.6 删除所有文件信息 删除所有文件信息实现的思路是先删除数据库中的所有 节点,然后重新读入数据库。这时读入的链表长度为0,达 到了删除掉的目的。下面是实现步骤。 (1)修改create_diaMedialib()函数,为删除全部按钮 连接回调函数。 (2)创建回调函数on_tlbDelall_clicked(),该函数将传 递删除媒体库中所有信息和刷新树视图指令到核心控制模块 进行处理。 (3)修改核心控制模块,处理MEDIALIB_DEL_ALL 指令。 (4)创建medialib_del_all()函数。 27.11.7 搜索本地文件 搜索本地文件主要会用到在设计媒体库链表数据结构时 创建的link_search()函数,该函数将遍历计算机中整个文件 系统。并且将找到的MP3文件加入媒体库链表。 (1)修改create_diaMedialib()函数,为“搜索本地媒体 文件”按钮连接回调函数。 (2)创建回调函数on_ tlbSearch _clicked(),该函数将 创建一个对话框询问用户是否进行搜索本地文件操作。 (3)修改核心控制模块,处理MEDIALIB_SEARCH 指令。 (4)创建medialib_search()函数。 27.11.8 传递到播放列表 媒体库对话框中的“传递到播放列表”按钮作用是将媒体库链 表中的节点传递到播放列表链表中。用户可通过该按钮向播放列 表添加数据,播放媒体库中指定的媒体文件。下面介绍实现该操 作的步骤。 (1)修改create_diaMedialib()函数,为“传递到播放列表”按 钮连接回调函数。 (2)创建回调函数on_tlbSendto_clicked(),该函数将获得树 视图中被选中的文件路径,并传递到核心控制模块。 (3)修改核心控制模块,处理 MEDIALIB_SEND_TO_PLAYLIST指令。 (4)创建medialib_sendto(),该函数的作用是为播放列表链 表添加新节点。 27.11.9 查找 查找操作的实现方法是,先使用link_find()函数找到媒体库 链表中与条件匹配的项目,然后将这些项目添加到链表上。最后 重新显示树视图。查找操作要用到3个界面构件,因此还需要继续 扩展界面的数据结构InterFace。下面介绍实现查找操作的步骤。 (1)修改InterFace定义,增加指向查找区域的文本输入框 和组合框的指针。 (2)修改create_diaMedialib()函数,将查找操作相关界面构 件的地址传递到界面的数据结构。 (3)修改create_diaMedialib()函数,为“查找”按钮连接回调 函数。 (4)创建回调函数on_btFind_clicked()。 (5)修改核心控制模块,处理MEDIALIB_FIND指令。 (6)实现medialib_find()函数。 27.12 播放列表功能集成 播放列表功能集成需要考虑到M3U文件支持和与播放 控制模块之间的互动。播放列表虽然不进行数据库操作,但 是要求能将播放列表中的数据保存到M3U文件中,或者从 M3U文件读取数据到播放列表。播放列表的设计目的是能够 使播放控制模块以播放列表中的顺序进行播放,因此实现时 要考虑两者的数据传递。虽然播放列表大部分操作以对播放 列表列表数据的访问为主,不过播放列表对话框上要能显示 出当前播放的媒体在播放列表中的位置。 27.12.1 初始化 播放列表的初始化操作是在主函数中创建播放列表链表 ,然后将链表的地址传递到核心控制模块中。下面介绍实现 步骤。 (1)修改主函数,在创建播放列表链表后,增加一条 对核心控制模块的调用。 (2)在核心控制模块中创建指向播放列表链表的指针 ,用于核心控制模块保存播放列表链表的入口。 (3)在核心控制模块函数的switch选择结构中,增加 对GENERAL_PLAYLIST_INIT指令处理的代码。 27.12.2 显示播放列表对话框 媒体播放器主界面上的“播放列表”按钮用于操纵播放列 表对话框的显示。操作流程为,当“播放列表”按钮按下时, 回调函数判断播放列表对话框是否已显示。如果播放列表对 话框没有显示,则传送显示播放列表指令到核心控制模块。 核心控制模块调用指定函数,判断播放列表对话框是否已初 始化,如果没有则先进行初始化,最后显示出播放列表对胡 框。 27.12.3 添加文件 当按下播放列表对话框中的添加按钮时,播放列表对话 框应能弹出一个对话框供用户选择文件。然后将该文件的信 息添加到播放列表链表的末端。需要注意到是,播放列表对 话框上按钮的名称与媒体库对话框不同,因此回调函数也有 区别,不能简单地复用。 27.12.4 添加目录 添加目录操作的目的是将目录中所有MP3文件添加到播放列 表中,主要的业务逻辑代码依然是复用媒体库所提供的。下面介 绍实现步骤。 (1)修改create_diaPlaylist()函数,为添加目录按钮连接回 调函数。 (2)实现回调函数on_tbtAdddir_clicked(),代码中将创建 文件选择对话框,运行结束时销毁该对话框。 (3)修改核心控制模块,处理PLAYLIST_ADD_DIR指令 。 (4)创建函数playlist_add_dir(),该函数的作用是将目录中 的所有MP3文件添加到播放列表链表中。 27.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(),该函数已经被建立 。下面介绍利用该函数保存M3U文件的操作步骤。 (1)修改create_diaPlaylist()函数,为保存按钮连接回调函 数。 (2)实现回调函数on_tbtSave_clicked()。代码中将创建文件 选择对话框,该对话框的类型为保存文件,否则无法设置新文件 名。 (3)修改核心控制模块,处理PLAYLIST_SAVE指令。 (4)创建函数playlist_save(),该函数的作用是将播放列表 链表中所有MP3文件信息添加到M3U文件中。 27.12.7 删除文件 在播放列表对话框中删除文件不涉及数据库的操作,相反, 要实现链表的操作。下面是该操作的实现方法。 (1)修改create_diaMedialib()函数,为删除按钮连接回调函 数。 (2)创建回调函数on_tbtDel_clicked()。该函数将判断树视 图是否选择了数据,如果是,则发送指令到核心控制模块处理。 (3)修改核心控制模块,处理PLAYLIST_DEL指令。 (4)创建playlist_del()函数。该函数的作用是从播放列表链 表中删除指定文件信息。删除链表节点要用到节点在链表中的位 置编号,这里实现的方法是读取被选择文件在树视图中的行号来 实现。 27.12.8 删除全部 删除全部操作指的是清空播放列表,实现方法为删除播 放列表链表上的所有节点。下面结构该操作实现步骤。 (1)修改create_diaMedialib()函数,为删除全部按钮 连接回调函数。 (2)创建回调函数on_tbtDelall_clicked(),该函数将传 递删除媒体库中所有信息和刷新树视图指令到核心控制模块 进行处理。 (3)修改核心控制模块,处理PLAYLIST_DEL_ALL 指令。 (4)创建playlist_del_all()函数。 27.12.9 排序 排序的方法有很多种,其中最容易实现的是比较法排序 。对播放列表排序的函数在前面已实现,下面介绍与播放列 表对话框集成的方法。 (1)修改create_diaMedialib()函数,为排序按钮连接 回调函数。 (2)创建回调函数on_tbtComp_clicked (),该函数将 传递排序指令到核心控制模块进行处理。 (3)修改核心控制模块,处理PLAYLIST_COMP指 令。 (4)创建playlist_del_all()函数。 27.13 播放控制模块集成 播放控制模块的集成与其他模块密切相关,各种操作由 媒体播放器主界面发出,然后播放的信息又被反映到媒体播 放器的主界面中来。播放模式有3种,分别是顺序模式、循 环模式和随机模式,播放模式通过主界面上的模式选择组合 框设置。播放控制指令有5种,分别是开始播放、暂停播放 、停止播放、上一首和下一首,各种指令都对应着媒体播放 器主界面上的按钮。 27.13.1 播放模式设置 播放模式设置的数值被保存在核心控制模块中,是一个 静态类型的整型变量,名称为state。下面介绍模板模式设置 操作实现的步骤。 (1)修改create_winMain()函数。为播放模式组合框 的active信号链接回调函数,选择组

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论