媒體播放器--項(xiàng)目.ppt
《媒體播放器--項(xiàng)目.ppt》由會員分享,可在線閱讀,更多相關(guān)《媒體播放器--項(xiàng)目.ppt(75頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、第27章 媒體播放器項(xiàng)目完整實(shí)踐,在本書前面的章節(jié)已介紹了C語言的語法和Linux系統(tǒng)中各種常用的函數(shù)庫,利用這些知識已可開發(fā)一些基本的應(yīng)用程序。本章將這些知識綜合應(yīng)用到媒體播放器項(xiàng)目中,通過一個(gè)嚴(yán)格的項(xiàng)目管理制度對項(xiàng)目進(jìn)行規(guī)劃,并補(bǔ)充媒體播放器未實(shí)現(xiàn)的功能。如果該項(xiàng)目由多個(gè)人協(xié)同開發(fā),則可以嘗試分工協(xié)作,培養(yǎng)協(xié)同開發(fā)的經(jīng)驗(yàn)。,27.1 軟件工程實(shí)戰(zhàn),軟件開發(fā)的過程中離不開軟件工程思想的指導(dǎo),即使在學(xué)習(xí)過程中也應(yīng)該時(shí)刻將軟件工程方法放在重要位置。如果在學(xué)習(xí)程序開發(fā)過程中就遭遇了項(xiàng)目失敗,對于學(xué)習(xí)者來說,所造成的挫敗感一直會影響到將來的實(shí)際工作中。而實(shí)踐軟件工程思想又能為將來實(shí)際工作打下扎實(shí)的基
2、礎(chǔ),因此本節(jié)結(jié)合媒體播放器項(xiàng)目來進(jìn)行軟件工程的實(shí)戰(zhàn)。,27.1.1 項(xiàng)目需求分析,項(xiàng)目需求分析經(jīng)常被作為一個(gè)獨(dú)立的課題來研究,但對于開發(fā)人員來說,了解項(xiàng)目需求分析方法也是必不可少的。在樸素軟件工程思想中,項(xiàng)目需求分析的方法使用的是實(shí)例分析法。,27.1.2 軟件需求說明,軟件需求說明(Software Requirement Specification,簡稱SRS)是項(xiàng)目需求分析所得到的文檔。它的作用是提出需要解決的問題,作為下一步軟件設(shè)計(jì)和編碼的基礎(chǔ)。 1引言 2任務(wù)概述 3需求規(guī)定 4運(yùn)行環(huán)境規(guī)定 5附錄,27.1.3 項(xiàng)目視圖的解決方案,項(xiàng)目視圖指的是項(xiàng)目的實(shí)際需求,開發(fā)者在軟件需求說明
3、文檔完成后即可針對項(xiàng)目視圖提出解決方案。在給出解決方案的同時(shí)也要陳述自己的理由,但應(yīng)該避免在這個(gè)階段進(jìn)行軟件設(shè)計(jì)。下面列舉媒體播放器項(xiàng)目中主要問題的解決方啊。 1媒體播放器界面設(shè)計(jì) 2數(shù)據(jù)庫的選擇 3讀取MP3文件信息 4媒體播放功能,27.2 軟件設(shè)計(jì),軟件設(shè)計(jì)的內(nèi)容很廣泛,但結(jié)果只是總結(jié)出項(xiàng)目需求所列出功能的實(shí)現(xiàn)方法。這個(gè)實(shí)現(xiàn)方法必須清晰易懂,能夠被所有參與項(xiàng)目的開發(fā)人員理解。因此,最終獲得的應(yīng)該是數(shù)據(jù)字典和流程圖。本書前面部分已經(jīng)對媒體庫中大部分功能的實(shí)現(xiàn)進(jìn)行了分步講解,所以,這里討論另外兩個(gè)重要話題。第一是需求分析方法,即根據(jù)軟件需求說明進(jìn)行詳細(xì)分析。第二是制訂開發(fā)計(jì)劃和分工,目的是幫
4、助讀者按步驟實(shí)現(xiàn)軟件。,27.2.1 需求分析,需求分析是指理解項(xiàng)目的需求,就軟件的功能進(jìn)行深入理解,并且給出明確的解決方案。,27.2.2 制訂開發(fā)計(jì)劃,媒體播放器中,首先應(yīng)定義程序的主體結(jié)構(gòu),即實(shí)現(xiàn)核心控制模塊。該模塊是其他所有模塊操作的基礎(chǔ),缺少該模塊則難以進(jìn)行后面的工作。然后在第二步可以同時(shí)進(jìn)行媒體庫模塊和播放控制模塊的實(shí)現(xiàn),第三步進(jìn)行用戶界面模塊和媒體文件解碼模塊的設(shè)計(jì)。最后的步驟是系統(tǒng)集成,把所有的模塊關(guān)聯(lián)起來,如圖27.4所示。,27.2.3 分工協(xié)作,一個(gè)較大的項(xiàng)目往往需要分工協(xié)作,如何進(jìn)行項(xiàng)目分配和如何執(zhí)行分配到自身的計(jì)劃也是開發(fā)者必須具備的能力。在這里需要引入一種稱之為甘特
5、圖的圖表,它是以圖示的方式通過活動列表和時(shí)間刻度形象地表示出軟件項(xiàng)目的活動順序與持續(xù)時(shí)間。,27.3 版本控制,無論是獨(dú)立開發(fā)的軟件項(xiàng)目還是協(xié)作開發(fā),都需要進(jìn)行版本控制。版本控制的作用是保護(hù)源代碼,將每次對源代碼的修改都記錄起來。這樣一方面能保證可以回溯到指定的時(shí)間點(diǎn),另一方面在多人同時(shí)編輯一個(gè)源代碼文件時(shí)不會相互覆蓋對方的工作成果。目前版本控制工具有很多,Linux系統(tǒng)上使用最廣泛的版本控制工具是CVS。該工具不僅能很好的支持C語言項(xiàng)目,而且能被Eclipse集成開發(fā)工具集成使用。,27.3.1 CVS服務(wù)器配置,CVS服務(wù)器是托管源代碼的倉庫,開發(fā)者通過訪問CVS服務(wù)器獲得源代碼資源。在修
6、改了相應(yīng)的源代碼后,源代碼及其改動信息又被存回到CVS服務(wù)器中。多人參與的項(xiàng)目只用建立一個(gè)CVS服務(wù)器,開發(fā)者通過網(wǎng)絡(luò)訪問該服務(wù)器。,27.3.2 CVS服務(wù)器管理,CVS是功能齊備的版本控制工具,在使用CVS服務(wù)器之前有幾個(gè)重要概念必須了解。下面分別介紹這幾個(gè)概念和操作方法。 1倉庫 2模塊 3導(dǎo)入 4簽出 5簽入 6添加和刪除 7歷史 8沖突解決 9標(biāo)記 10分支 11遠(yuǎn)程訪問 12局限性,27.4 在Eclipse中使用CVS客戶端,Eclipse集成開發(fā)環(huán)境內(nèi)置了CVS客戶端插件,因此可
7、直接使用Eclipse管理CVS服務(wù)器中的資源。對于Eclipse來說,CVS用于支持團(tuán)隊(duì)開發(fā),是很多大型軟件開發(fā)團(tuán)隊(duì)所選用的工具。在Eclipse中使用CVS客戶端的優(yōu)勢在于: Eclipse與CVS無縫連接,可直接通過Eclipse的界面和菜單進(jìn)行CVS操作。 Eclipse為CVS提供了圖形用戶接口,無需記憶復(fù)雜的操作命令。 Eclipse支持將CVS模塊作為項(xiàng)目操作。,27.4.1 從CVS服務(wù)器簽出模塊并創(chuàng)建項(xiàng)目,無論CVS服務(wù)器是在本地,還是在遠(yuǎn)端,都可以直接從CVS服務(wù)器中簽出模塊并創(chuàng)建項(xiàng)目。,27.4.2 簽入文件,每一個(gè)文件名后顯示該文件的版本號,如果文件在本地被改動過,文件
8、名前面會顯示一個(gè)小箭頭,如圖27.13所示。,27.4.3 使用Eclipse項(xiàng)目創(chuàng)建CVS模塊,在Eclipse中可以將本地項(xiàng)目導(dǎo)入到CVS服務(wù)器中,創(chuàng)建新的模塊或簽入到已有的模塊中。該功能類似于CVS的導(dǎo)入操作和簽入操作的集合。,27.4.4 比較文件,Eclipse可以比較本地文件與CVS倉庫中文件的差異。在Eclipse主界面選擇Window|Team Synchronize命令,將進(jìn)入到團(tuán)隊(duì)同步界面,如圖27.20所示。,27.4.5 管理CVS服務(wù)器,Eclipse提供了專門的界面管理CVS服務(wù)器。如圖27.21所示。,27.4.6 斷開項(xiàng)目與CVS服務(wù)器之間的關(guān)聯(lián),如果某一項(xiàng)目不
9、在需要與CVS服務(wù)器關(guān)聯(lián)起來,可以在項(xiàng)目瀏覽器中右擊該項(xiàng)目,選擇Team|Disconnect命令。這時(shí),將彈出Confirm Disconnect from CVS對話框,如圖27.22所示。,27.5 音量控制對話框,音量控制對話框的作用是調(diào)節(jié)系統(tǒng)音量。單擊媒體播放器主界面上的音量調(diào)節(jié)開關(guān)按鈕后,如果開關(guān)按鈕的狀態(tài)為按下,音量調(diào)節(jié)對話框?qū)@示出來。如果開關(guān)按鈕處于原始狀態(tài),音量調(diào)節(jié)對話框被隱藏。相關(guān)代碼放在“interface.c”文件中。,27.5.1 創(chuàng)建對話框,音量調(diào)節(jié)對話框的類型屬于彈出式窗口,因此它沒有普通窗體的標(biāo)題欄和邊框。 音量調(diào)節(jié)對話框出現(xiàn)的位置非常重要,按照GNOME桌面
10、環(huán)境約定俗成的規(guī)則,通常顯示在鼠標(biāo)指針當(dāng)前的位置。宏GTK_WIN_POS_MOUSE可返回鼠標(biāo)當(dāng)前的位置,它可作為gtk_window_set_position()函數(shù)的實(shí)際參數(shù)。這樣,每次音量調(diào)節(jié)對話框都會顯示在鼠標(biāo)光標(biāo)指向的位置。 。,27.5.2 添加垂直比例尺,音量調(diào)節(jié)對話框內(nèi)的主要部件是一個(gè)垂直比例尺,該比例尺用于調(diào)節(jié)音量和顯示音量的比例。 對話框中默認(rèn)有一個(gè)活動區(qū)域,實(shí)際上它是橫向按鈕盒。音量調(diào)節(jié)對話框中沒有任何按鈕,因此要將活動區(qū)域屏蔽起來。本例屏蔽活動區(qū)域的方法為,先獲得活動區(qū)域的地址,其后使用gtk_widget_set_sensitive()函數(shù)使活動區(qū)域不顯示。但是,必
11、須用gtk_button_box_set_layout()函數(shù)結(jié)束活動區(qū)域設(shè)置,否則會造成GTK+錯誤。 最后,使用gtk_widget_grab_default()函數(shù)讓GTK+獲得焦點(diǎn)。在創(chuàng)建音量控制對話框函數(shù)結(jié)尾處還要將diaVolume指針返回。,27.5.3 測試,下面用一個(gè)例子測試音量控制對話框的顯示效果。在編寫代碼前,先要在媒體播放器源代碼目錄中添加C語言源代碼文件“callback.c”和頭文件“callback.h”。這兩個(gè)文件用于放置所有回調(diào)函數(shù)的代碼,在后面的開發(fā)過程中還將用到。,27.6 播放列表對話框,播放列表對話框由一組工具條按鈕、一個(gè)樹視圖和一組按鈕構(gòu)成,下面分別
12、介紹播放列表對話框中這幾個(gè)部件的實(shí)現(xiàn)方法。,27.6.1 創(chuàng)建對話框,播放列表對話框是一個(gè)非模式對話框,可以在該對話框顯示的同時(shí)操作媒體播放器主界面。它與普通窗體的構(gòu)件區(qū)別在于,非模式對話框沒有最小化和最大化按鈕。非模式對話框與模式對話框的區(qū)別在于,前者使用gtk_widget_show()函數(shù)顯示,后者使用gtk_dialog_run顯示。,27.6.2 創(chuàng)建工具條和工具條按鈕,播放列表對話框的各種操作都放在工具欄中,對應(yīng)有7個(gè)工具欄按鈕。 為了便于顯示控制,工具條中使用的是工具條按鈕。其中“添加”、“打開”、“保存”和“刪除”按鈕可直接通過圖像庫創(chuàng)建。但“添加目錄”、“刪除全部”和“排序”
13、按鈕并沒有圖像庫中對于的項(xiàng)目,需要進(jìn)行自定義。,27.6.3 創(chuàng)建樹視圖,播放列表的內(nèi)容顯示在樹視圖中,因此樹視圖被放置在播放列表對話框的主要位置。 播放列表的內(nèi)容可能不能完全顯示在播放列表對胡框中,所以在創(chuàng)建樹視圖前先要創(chuàng)建一個(gè)滾動條窗體容器。將滾動條窗體的水平滾動條屏蔽,設(shè)置其垂直滾動條為自動顯示。代碼中,滾動條窗體的陰影風(fēng)格被設(shè)置為向內(nèi),與其他對話框保存統(tǒng)一。然后新建一個(gè)樹視圖,將樹視圖裝入滾動條窗體容器中。,27.6.4 創(chuàng)建對話框按鈕,播放列表對話框只需要放置一個(gè)按鈕,用于關(guān)閉對話框。這時(shí)需要用到對話框的活動區(qū)域部分,代碼如下所示: GtkWidget *dialog_action_
14、area2;// 用于保存活動區(qū)域地址 dialog_action_area2 = GTK_DIALOG (diaPlaylist)-action_area;// 獲得活動區(qū)域地址 gtk_widget_show (dialog_action_area2);// 顯示活動區(qū)域 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END);// 結(jié)束活動區(qū)域設(shè)置,27.6.5 測試,播放列表的實(shí)現(xiàn)與隱藏由媒體播放器主界面上的“播放列表”按鈕控制。因此首先要為該按鈕的clicke
15、d事件連接回調(diào)函數(shù)。,27.7 媒體庫對話框,媒體庫對話框的實(shí)現(xiàn)方法相對于播放列表對話框略為復(fù)雜,主要區(qū)別是媒體庫對話框使用了2個(gè)樹視圖,一個(gè)用于顯示分類,另一個(gè)用于顯示媒體信息。媒體庫以標(biāo)題、藝術(shù)家、專輯和流派作為分類的條件,因此需要在原型中顯示出來。本例中將介紹樹視圖的初步實(shí)現(xiàn)方法。,27.7.1 創(chuàng)建對話框,媒體庫對話框使用的是非模式對話框,很多時(shí)候還需要與播放列表對話框同時(shí)顯示。 但是代碼量的多少并非是衡量開發(fā)者編碼水平重要因素,程序清晰易讀才是必須遵循的原則。有些時(shí)候增加代碼復(fù)用會加大編碼難度,這樣將造成更多的編碼錯誤,反而降低了效率。,27.7.2 創(chuàng)建工具條和工具條按鈕,媒體庫對
16、話框的工具條中共有6個(gè)工具條按鈕,下列源代碼用于創(chuàng)建工具條和工具條按鈕: GtkWidget *toolbar;// 用于保存工具條容器地址 toolbar = gtk_toolbar_new ();// 創(chuàng)建工具條容器 gtk_widget_show (toolbar);// 顯示工具條容器 gtk_box_pack_start (GTK_BOX (vbMedialib), toolbar, FALSE, FALSE, 0);// 將工具條容器裝入縱向組裝盒,27.7.3 創(chuàng)建分類部件和媒體信息顯示部件,分類部件和媒體信息顯示部件均選用樹視圖構(gòu)件實(shí)現(xiàn),但是使用的是樹視圖的兩種不同模式。分類的
17、方法有三種,分別是:按藝術(shù)家名稱分類、按專輯分類和按流派分類。,27.7.4 創(chuàng)建搜索部件,搜索部件是文本輸入框、組合框和按鈕這3個(gè)構(gòu)件的組合。文本輸入框用于輸入搜索字符串,組合框中放置著搜索條件。 本例中搜索部件是橫向排列的三個(gè)構(gòu)件,因此在代碼中先要創(chuàng)建一個(gè)橫向組裝盒,將橫向組裝盒裝入上一層的縱向組裝盒中。然后分別創(chuàng)建文本輸入框、組合框和查找按鈕,將這些構(gòu)件裝入到橫向組裝盒中。搜索的5個(gè)條件已添加到組合框上,嚴(yán)格的程序開發(fā)過程中,這種用法并不規(guī)范。因此,必須用文檔記錄這幾個(gè)條件的順序,以確保在實(shí)現(xiàn)查找功能時(shí)不會出錯。,27.7.5 創(chuàng)建對話框按鈕,媒體庫對話框只需要放置一個(gè)按鈕用于關(guān)閉對話框
18、。代碼如下所示: GtkWidget *dialog_action_area4;// 用于保存活動區(qū)域地址 dialog_action_area4 = GTK_DIALOG (diaPlaylist)-action_area;// 獲得活動區(qū)域地址 gtk_widget_show (dialog_action_area4);// 顯示活動區(qū)域 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area4), GTK_BUTTONBOX_END);// 結(jié)束活動區(qū)域設(shè)置 GtkWidget *closebutton2;
19、// 用于保存關(guān)閉按鈕地址,27.7.6 測試,本部分的測試內(nèi)容主要是介紹樹視圖的簡單操作,實(shí)現(xiàn)分類部件的初始化。首先要修改“interface.h”頭文件中的結(jié)構(gòu)體_interface,增加分類樹視圖的指針。,27.8 播放控制模塊實(shí)現(xiàn),播放控制模塊是媒體播放器中最重要的核心。該模塊的作用是架起媒體播放器與GStreamer多媒體框架之間的橋梁,使媒體播放器能通過GStreamer多媒體框架實(shí)現(xiàn)MP3播放的功能。因?yàn)镚Streamer函數(shù)庫提供了非常簡單的接口對播放進(jìn)行控制,實(shí)現(xiàn)播放控制模塊所需要的代碼并不多。下面開始介紹播放控制模塊實(shí)現(xiàn)的方法。,27.8.1 播放控制模塊程序結(jié)構(gòu),播放控制
20、模塊的源代碼放置在“play.h”頭文件和“play.c”源代碼文件中,先在媒體播放器項(xiàng)目的源代碼目錄中新建這兩個(gè)文件。,27.8.2 MP3播放功能實(shí)現(xiàn),上一節(jié)已經(jīng)討論了播放控制模塊的程序結(jié)構(gòu),MP3播放功能實(shí)際上是在play()函數(shù)中通過調(diào)用GStreamer庫實(shí)現(xiàn)。在創(chuàng)建函數(shù)前,先要為“play.c”文件加上一些相關(guān)的頭文件。 1函數(shù)接口和相關(guān)數(shù)據(jù)類型的定義 2播放指令處理 3MP3文件播放,27.8.3 播放中的回調(diào)處理,在GStreamer管道進(jìn)行播放時(shí),會產(chǎn)生大量的信號。例如管道中的文件信息,播放時(shí)出現(xiàn)的錯誤信息和播放和播放結(jié)束的信息。play()函數(shù)將總線消息的回調(diào)設(shè)為bus_c
21、all()函數(shù),下面介紹該函數(shù)的實(shí)現(xiàn)過程。 1函數(shù)參數(shù)列表和數(shù)據(jù)轉(zhuǎn)換 2處理播放結(jié)束 3獲取MP3文件真實(shí)信息 4錯誤處理 5測試,27.9 系統(tǒng)集成,媒體播放器中的所有模塊均已實(shí)現(xiàn),在編碼過程中的最后一步即系統(tǒng)集成。系統(tǒng)集成是讓所有模塊相互關(guān)聯(lián)起來,共同工作,形成一個(gè)可用的程序。工序中,首先要設(shè)計(jì)一個(gè)主程序文件,為所有模塊初始化。然后以自上而下的方法實(shí)現(xiàn)界面上所有部件的功能。從主界面的實(shí)現(xiàn)開始,直到每個(gè)菜單項(xiàng)和按鈕的功能都實(shí)現(xiàn)。,27.10 主程序文件實(shí)現(xiàn),主程序文件由一個(gè)名為“main.c”的源代碼文件和名為“main.h”的頭文件組成。其中,最重要的函數(shù)就是主函數(shù)main()。主函數(shù)是一
22、個(gè)程序的接口,實(shí)際的項(xiàng)目中,主函數(shù)的作用通常是對其他所有函數(shù)模塊進(jìn)行初始化,并且創(chuàng)建其他模塊所需的數(shù)據(jù)結(jié)構(gòu)。在主函數(shù)退出前,程序所占用的所有系統(tǒng)資源將被釋放。,27.10.1 頭文件和主函數(shù)入口,主程序中除了要放置基本的C語言標(biāo)準(zhǔn)庫頭文件外,還要放入GLib庫、GTK+庫、GStreamer庫和SQLite庫的入口函數(shù)頭文件。源代碼目錄中其他模塊的頭文件也應(yīng)被主程序包含,這樣所有的模塊間就能相互調(diào)用。,27.10.2 媒體庫模塊初始化,媒體庫模塊初始化的工作包括連接數(shù)據(jù)庫,創(chuàng)建媒體庫鏈表和播放列表鏈表入口,以及從數(shù)據(jù)庫中讀取媒體庫信息。 媒體庫鏈表和播放列表鏈表都是使用自定義的link_t類型
23、,該類型只是鏈表的接口,其他媒體庫模塊的函數(shù)將通過該接口創(chuàng)建動態(tài)數(shù)據(jù)結(jié)構(gòu)。最后一行調(diào)用的load_medialib()函數(shù)參數(shù)是媒體庫鏈表入口,此函數(shù)將讀取數(shù)據(jù)庫中媒體庫信息表內(nèi)的數(shù)據(jù),并用這些數(shù)據(jù)為媒體庫初始化。,27.10.3 圖形界面初始化,圖形界面初始化包含4個(gè)步驟。首先初始化GTK+庫,讀取主函數(shù)傳遞來的運(yùn)行參數(shù)。然后創(chuàng)建界面的數(shù)據(jù)結(jié)構(gòu)和相關(guān)界面,這個(gè)過程是對界面數(shù)據(jù)結(jié)構(gòu)的初始化。再對主界面進(jìn)行操作,顯示主界面并,并且為主界面連接回調(diào)函數(shù)。最后啟動GTK+主循環(huán)。,27.10.4 退出前清理,媒體播放器的程序代碼中有許多地方用到了動態(tài)內(nèi)存分配技術(shù),因此需要在退出前對這些內(nèi)存進(jìn)行清理。
24、清理工作可分為兩類,一類是直接由申請內(nèi)存的函數(shù)庫來清理,例如大部分GTK+庫的對象都能自動清理內(nèi)存。另一類是用戶手動清理,主要是針對自定義的動態(tài)數(shù)據(jù)結(jié)構(gòu)。,27.10.5 編譯和運(yùn)行,媒體播放器調(diào)用了很多函數(shù)庫,這些函數(shù)庫的路徑必須在編譯時(shí)指明。如果是在終端上使用GCC編譯器進(jìn)行編譯,同時(shí)借助pkgconfig程序提供函數(shù)庫路徑,完整的編譯指令如下所示: gcc -g pkg-config --cflags --libs glib-2.0 gtk+-2.0 gstreamer-base-0.10 id3tag sqlite3 main.c -o mp3player 編譯成功后,源代碼目錄中將新
25、增一個(gè)名為mp3player的可執(zhí)行文件。程序執(zhí)行時(shí),可在屏幕上顯示出媒體播放器的主界面。,27.11 媒體庫功能集成,媒體庫功能集成涉及到與用戶界面模塊和核心控制模塊的數(shù)據(jù)傳遞。每一個(gè)操作指令均由界面的回調(diào)函數(shù)向核心控制模塊發(fā)出,核心控制模塊再選擇函數(shù)對媒體庫進(jìn)行操作,最后又影響到界面的顯示。下面介紹媒體庫功能集成的方法。,27.11.1 初始化,在媒體播放器主函數(shù)中,雖然已經(jīng)創(chuàng)建了媒體庫相關(guān)的數(shù)據(jù)結(jié)構(gòu),并且從數(shù)據(jù)庫中讀取了相應(yīng)數(shù)據(jù)傳遞到媒體庫鏈表。但是,核心控制模塊中并未獲得媒體庫鏈表的入口,所以還需要進(jìn)行數(shù)據(jù)傳遞才能實(shí)現(xiàn)媒體庫的初始化。,27.11.2 顯示媒體庫對話框,主函數(shù)初始化界面
26、數(shù)據(jù)結(jié)構(gòu)時(shí)已創(chuàng)建了媒體庫對話框,但對話框中并沒有顯示任何內(nèi)容。顯示媒體庫對話框操作的主要難點(diǎn)在于,顯示媒體庫的同時(shí)將媒體庫信息讀入相應(yīng)的樹視圖中。,27.11.3 添加文件,向媒體庫添加文件操作需要用到文件選擇對話框。該對話框的地址不用傳遞給界面的數(shù)據(jù)結(jié)構(gòu),相關(guān)的創(chuàng)建代碼可在添加按鈕的回調(diào)函數(shù)中實(shí)現(xiàn)。其他操作均可用以前實(shí)現(xiàn)的代碼來完成。,27.11.4 添加目錄,添加目錄操作比添加文件操作實(shí)現(xiàn)起來略微復(fù)雜一些,因?yàn)橐幚韺⒍鄠€(gè)文件傳遞到數(shù)據(jù)庫中的操作。下面介紹實(shí)現(xiàn)步驟。 (1)修改create_diaMedialib()函數(shù),為添加目錄按鈕連接回調(diào)函數(shù)。 (2)實(shí)現(xiàn)回調(diào)函數(shù)on_tlbAddd
27、ir_clicked(),代碼中將創(chuàng)建文件選擇對話框,運(yùn)行結(jié)束時(shí)銷毀該對話框。 (3)修改核心控制模塊,處理MEDIALIB_ADD_FILE指令。 (4)創(chuàng)建函數(shù)medialib_add_dir(),該函數(shù)的作用是將目錄中的文件添加到媒體庫鏈表,并且再將新增加節(jié)點(diǎn)上的數(shù)據(jù)保存到數(shù)據(jù)庫。,27.11.5 刪除文件信息,刪除媒體文件信息比較簡單的流程為先在數(shù)據(jù)庫中刪除指定項(xiàng)目,然后重新讀取數(shù)據(jù)庫,最后刷新樹視圖。下面是該流程的實(shí)現(xiàn)方法。 (1)修改create_diaMedialib()函數(shù),為刪除按鈕連接回調(diào)函數(shù)。 (2)創(chuàng)建回調(diào)函數(shù)on_tlbDel_clicked(),該函數(shù)將從樹視圖中讀
28、取被選擇的數(shù)據(jù),然后傳遞到核心控制模塊進(jìn)行處理。 (3)修改核心控制模塊,處理MEDIALIB_DEL指令。 (4)創(chuàng)建medialib_del()函數(shù)。該函數(shù)的作用是從數(shù)據(jù)庫中刪除指定文件信息,然后從數(shù)據(jù)庫中重新讀取數(shù)據(jù)到媒體庫鏈表中。,27.11.6 刪除所有文件信息,刪除所有文件信息實(shí)現(xiàn)的思路是先刪除數(shù)據(jù)庫中的所有節(jié)點(diǎn),然后重新讀入數(shù)據(jù)庫。這時(shí)讀入的鏈表長度為0,達(dá)到了刪除掉的目的。下面是實(shí)現(xiàn)步驟。 (1)修改create_diaMedialib()函數(shù),為刪除全部按鈕連接回調(diào)函數(shù)。 (2)創(chuàng)建回調(diào)函數(shù)on_tlbDelall_clicked(),該函數(shù)將傳遞刪除媒體庫中所有信息和刷新樹
29、視圖指令到核心控制模塊進(jìn)行處理。 (3)修改核心控制模塊,處理MEDIALIB_DEL_ALL指令。 (4)創(chuàng)建medialib_del_all()函數(shù)。,27.11.7 搜索本地文件,搜索本地文件主要會用到在設(shè)計(jì)媒體庫鏈表數(shù)據(jù)結(jié)構(gòu)時(shí)創(chuàng)建的link_search()函數(shù),該函數(shù)將遍歷計(jì)算機(jī)中整個(gè)文件系統(tǒng)。并且將找到的MP3文件加入媒體庫鏈表。 (1)修改create_diaMedialib()函數(shù),為“搜索本地媒體文件”按鈕連接回調(diào)函數(shù)。 (2)創(chuàng)建回調(diào)函數(shù)on_ tlbSearch _clicked(),該函數(shù)將創(chuàng)建一個(gè)對話框詢問用戶是否進(jìn)行搜索本地文件操作。 (3)修改核心控制模塊,處理M
30、EDIALIB_SEARCH指令。 (4)創(chuàng)建medialib_search()函數(shù)。,27.11.8 傳遞到播放列表,媒體庫對話框中的“傳遞到播放列表”按鈕作用是將媒體庫鏈表中的節(jié)點(diǎn)傳遞到播放列表鏈表中。用戶可通過該按鈕向播放列表添加數(shù)據(jù),播放媒體庫中指定的媒體文件。下面介紹實(shí)現(xiàn)該操作的步驟。 (1)修改create_diaMedialib()函數(shù),為“傳遞到播放列表”按鈕連接回調(diào)函數(shù)。 (2)創(chuàng)建回調(diào)函數(shù)on_tlbSendto_clicked(),該函數(shù)將獲得樹視圖中被選中的文件路徑,并傳遞到核心控制模塊。 (3)修改核心控制模塊,處理MEDIALIB_SEND_TO_PLAYLIST指
31、令。 (4)創(chuàng)建medialib_sendto(),該函數(shù)的作用是為播放列表鏈表添加新節(jié)點(diǎn)。,27.11.9 查找,查找操作的實(shí)現(xiàn)方法是,先使用link_find()函數(shù)找到媒體庫鏈表中與條件匹配的項(xiàng)目,然后將這些項(xiàng)目添加到鏈表上。最后重新顯示樹視圖。查找操作要用到3個(gè)界面構(gòu)件,因此還需要繼續(xù)擴(kuò)展界面的數(shù)據(jù)結(jié)構(gòu)InterFace。下面介紹實(shí)現(xiàn)查找操作的步驟。 (1)修改InterFace定義,增加指向查找區(qū)域的文本輸入框和組合框的指針。 (2)修改create_diaMedialib()函數(shù),將查找操作相關(guān)界面構(gòu)件的地址傳遞到界面的數(shù)據(jù)結(jié)構(gòu)。 (3)修改create_diaMedialib()
32、函數(shù),為“查找”按鈕連接回調(diào)函數(shù)。 (4)創(chuàng)建回調(diào)函數(shù)on_btFind_clicked()。 (5)修改核心控制模塊,處理MEDIALIB_FIND指令。 (6)實(shí)現(xiàn)medialib_find()函數(shù)。,27.12 播放列表功能集成,播放列表功能集成需要考慮到M3U文件支持和與播放控制模塊之間的互動。播放列表雖然不進(jìn)行數(shù)據(jù)庫操作,但是要求能將播放列表中的數(shù)據(jù)保存到M3U文件中,或者從M3U文件讀取數(shù)據(jù)到播放列表。播放列表的設(shè)計(jì)目的是能夠使播放控制模塊以播放列表中的順序進(jìn)行播放,因此實(shí)現(xiàn)時(shí)要考慮兩者的數(shù)據(jù)傳遞。雖然播放列表大部分操作以對播放列表列表數(shù)據(jù)的訪問為主,不過播放列表對話框上要能顯示出
33、當(dāng)前播放的媒體在播放列表中的位置。,27.12.1 初始化,播放列表的初始化操作是在主函數(shù)中創(chuàng)建播放列表鏈表,然后將鏈表的地址傳遞到核心控制模塊中。下面介紹實(shí)現(xiàn)步驟。 (1)修改主函數(shù),在創(chuàng)建播放列表鏈表后,增加一條對核心控制模塊的調(diào)用。 (2)在核心控制模塊中創(chuàng)建指向播放列表鏈表的指針,用于核心控制模塊保存播放列表鏈表的入口。 (3)在核心控制模塊函數(shù)的switch選擇結(jié)構(gòu)中,增加對GENERAL_PLAYLIST_INIT指令處理的代碼。,27.12.2 顯示播放列表對話框,媒體播放器主界面上的“播放列表”按鈕用于操縱播放列表對話框的顯示。操作流程為,當(dāng)“播放列表”按鈕按下時(shí),回調(diào)函數(shù)判斷
34、播放列表對話框是否已顯示。如果播放列表對話框沒有顯示,則傳送顯示播放列表指令到核心控制模塊。核心控制模塊調(diào)用指定函數(shù),判斷播放列表對話框是否已初始化,如果沒有則先進(jìn)行初始化,最后顯示出播放列表對胡框。,27.12.3 添加文件,當(dāng)按下播放列表對話框中的添加按鈕時(shí),播放列表對話框應(yīng)能彈出一個(gè)對話框供用戶選擇文件。然后將該文件的信息添加到播放列表鏈表的末端。需要注意到是,播放列表對話框上按鈕的名稱與媒體庫對話框不同,因此回調(diào)函數(shù)也有區(qū)別,不能簡單地復(fù)用。,27.12.4 添加目錄,添加目錄操作的目的是將目錄中所有MP3文件添加到播放列表中,主要的業(yè)務(wù)邏輯代碼依然是復(fù)用媒體庫所提供的。下面介紹實(shí)現(xiàn)步
35、驟。 (1)修改create_diaPlaylist()函數(shù),為添加目錄按鈕連接回調(diào)函數(shù)。 (2)實(shí)現(xiàn)回調(diào)函數(shù)on_tbtAdddir_clicked(),代碼中將創(chuàng)建文件選擇對話框,運(yùn)行結(jié)束時(shí)銷毀該對話框。 (3)修改核心控制模塊,處理PLAYLIST_ADD_DIR指令。 (4)創(chuàng)建函數(shù)playlist_add_dir(),該函數(shù)的作用是將目錄中的所有MP3文件添加到播放列表鏈表中。,27.12.5 打開文件,前面章節(jié)介紹過播放列表文件M3U,并且實(shí)現(xiàn)了讀取M3U文件到播放列表的函數(shù)load_m3u()。下面介紹利用該函數(shù)打開M3U文件的操作步驟。 (1)修改create_diaPlayl
36、ist()函數(shù),為打開文件按鈕連接回調(diào)函數(shù)。 (2)實(shí)現(xiàn)回調(diào)函數(shù)on_tbtOpen_clicked(),代碼中將創(chuàng)建文件選擇對話框,運(yùn)行結(jié)束時(shí)銷毀該對話框。 (3)修改核心控制模塊,處理PLAYLIST_OPEN指令。 (4)創(chuàng)建函數(shù)playlist_open(),該函數(shù)的作用是將目錄中的所有MP3文件添加到播放列表鏈表中。,27.12.6 保存文件,保存M3U文件使用的是函數(shù)save_m3u(),該函數(shù)已經(jīng)被建立。下面介紹利用該函數(shù)保存M3U文件的操作步驟。 (1)修改create_diaPlaylist()函數(shù),為保存按鈕連接回調(diào)函數(shù)。 (2)實(shí)現(xiàn)回調(diào)函數(shù)on_tbtSave_click
37、ed()。代碼中將創(chuàng)建文件選擇對話框,該對話框的類型為保存文件,否則無法設(shè)置新文件名。 (3)修改核心控制模塊,處理PLAYLIST_SAVE指令。 (4)創(chuàng)建函數(shù)playlist_save(),該函數(shù)的作用是將播放列表鏈表中所有MP3文件信息添加到M3U文件中。,27.12.7 刪除文件,在播放列表對話框中刪除文件不涉及數(shù)據(jù)庫的操作,相反,要實(shí)現(xiàn)鏈表的操作。下面是該操作的實(shí)現(xiàn)方法。 (1)修改create_diaMedialib()函數(shù),為刪除按鈕連接回調(diào)函數(shù)。 (2)創(chuàng)建回調(diào)函數(shù)on_tbtDel_clicked()。該函數(shù)將判斷樹視圖是否選擇了數(shù)據(jù),如果是,則發(fā)送指令到核心控制模塊處理。
38、 (3)修改核心控制模塊,處理PLAYLIST_DEL指令。 (4)創(chuàng)建playlist_del()函數(shù)。該函數(shù)的作用是從播放列表鏈表中刪除指定文件信息。刪除鏈表節(jié)點(diǎn)要用到節(jié)點(diǎn)在鏈表中的位置編號,這里實(shí)現(xiàn)的方法是讀取被選擇文件在樹視圖中的行號來實(shí)現(xiàn)。,27.12.8 刪除全部,刪除全部操作指的是清空播放列表,實(shí)現(xiàn)方法為刪除播放列表鏈表上的所有節(jié)點(diǎn)。下面結(jié)構(gòu)該操作實(shí)現(xiàn)步驟。 (1)修改create_diaMedialib()函數(shù),為刪除全部按鈕連接回調(diào)函數(shù)。 (2)創(chuàng)建回調(diào)函數(shù)on_tbtDelall_clicked(),該函數(shù)將傳遞刪除媒體庫中所有信息和刷新樹視圖指令到核心控制模塊進(jìn)行處理。
39、(3)修改核心控制模塊,處理PLAYLIST_DEL_ALL指令。 (4)創(chuàng)建playlist_del_all()函數(shù)。,27.12.9 排序,排序的方法有很多種,其中最容易實(shí)現(xiàn)的是比較法排序。對播放列表排序的函數(shù)在前面已實(shí)現(xiàn),下面介紹與播放列表對話框集成的方法。 (1)修改create_diaMedialib()函數(shù),為排序按鈕連接回調(diào)函數(shù)。 (2)創(chuàng)建回調(diào)函數(shù)on_tbtComp_clicked (),該函數(shù)將傳遞排序指令到核心控制模塊進(jìn)行處理。 (3)修改核心控制模塊,處理PLAYLIST_COMP指令。 (4)創(chuàng)建playlist_del_all()函數(shù)。,27.13 播放控制模塊集成
40、,播放控制模塊的集成與其他模塊密切相關(guān),各種操作由媒體播放器主界面發(fā)出,然后播放的信息又被反映到媒體播放器的主界面中來。播放模式有3種,分別是順序模式、循環(huán)模式和隨機(jī)模式,播放模式通過主界面上的模式選擇組合框設(shè)置。播放控制指令有5種,分別是開始播放、暫停播放、停止播放、上一首和下一首,各種指令都對應(yīng)著媒體播放器主界面上的按鈕。,27.13.1 播放模式設(shè)置,播放模式設(shè)置的數(shù)值被保存在核心控制模塊中,是一個(gè)靜態(tài)類型的整型變量,名稱為state。下面介紹模板模式設(shè)置操作實(shí)現(xiàn)的步驟。 (1)修改create_winMain()函數(shù)。為播放模式組合框的active信號鏈接回調(diào)函數(shù),選擇組合框中的選項(xiàng)時(shí)
41、回調(diào)函數(shù)將被執(zhí)行。 (2)創(chuàng)建回調(diào)函數(shù)on_cbbMode_active(),該函數(shù)將傳遞排序指令到核心控制模塊進(jìn)行處理。 (3)修改核心控制模塊,處理GENERAL_PLAY_MODE指令。,27.13.2 開始播放,當(dāng)用戶按下播放按鈕后,核心控制模塊將根據(jù)播放模式的設(shè)定來選擇要播放的文件。下面介紹實(shí)現(xiàn)播放操作的步驟。 (1)修改create_winMain()函數(shù)。為播放按鈕的clicked信號鏈接回調(diào)函數(shù)。 (2)創(chuàng)建回調(diào)函數(shù)on_btPlay_clicked()。該函數(shù)負(fù)責(zé)向核心控制模塊發(fā)送播放信號。 (3)修改核心控制模塊,處理PLAY_START指令。 (4)創(chuàng)建play_star
42、t()函數(shù),該函數(shù)將保存上一個(gè)播放的文件。如果不存在上一個(gè)播放文件的記錄,說明播放的是首個(gè)文件,播放操作將從媒體庫鏈表的首端開始。,27.13.3 暫停播放,當(dāng)用戶按下暫停按鈕后,核心控制模塊將向播放控制模塊傳送暫停播放指令。下面介紹實(shí)現(xiàn)暫停播放操作的步驟。 (1)修改create_winMain()函數(shù)。為暫停按鈕的clicked信號鏈接回調(diào)函數(shù)。 (2)創(chuàng)建回調(diào)函數(shù)on_btPause_clicked()。該函數(shù)負(fù)責(zé)向核心控制模塊發(fā)送播放信號。 (3)修改核心控制模塊,處理PLAY_PAUSE指令。,27.13.4 停止播放,當(dāng)用戶按下停止按鈕后,核心控制模塊將向播放控制模塊傳送停止播放指
43、令。下面介紹停止播放操作的步驟。 (1)修改create_winMain()函數(shù)。為停止按鈕的clicked信號鏈接回調(diào)函數(shù)。 (2)創(chuàng)建回調(diào)函數(shù)on_btStop_clicked()。該函數(shù)負(fù)責(zé)向核心控制模塊發(fā)送停止播放信號。 (3)修改核心控制模塊,處理PLAY_STOP指令。,27.13.5 播放上一首,當(dāng)用戶按下“播放上一首”按鈕后,核心控制模塊將向播放控制模塊傳送播放上一首指令。下面介紹播放上一首操作的步驟。 (1)修改create_winMain()函數(shù)。為“播放上一首”按鈕的clicked信號鏈接回調(diào)函數(shù)。 (2)創(chuàng)建回調(diào)函數(shù)on_btPre_clicked()。該函數(shù)負(fù)責(zé)向核心
44、控制模塊發(fā)送停止播放信號。 (3)修改核心控制模塊,處理PLAY_PRE指令。,27.13.6 播放下一首,當(dāng)用戶按下“播放下一首”按鈕后,核心控制模塊將遍歷播放列表鏈表,找到要播放的下一個(gè)文件。下面介紹實(shí)現(xiàn)播放操作的步驟。 (1)修改create_winMain()函數(shù)。為“播放下一首”按鈕的clicked信號鏈接回調(diào)函數(shù)。 (2)創(chuàng)建回調(diào)函數(shù)on_btNext_clicked()。該函數(shù)負(fù)責(zé)向核心控制模塊發(fā)送播放信號。 (3)修改核心控制模塊,處理PLAY_NEXT指令。,27.14 小結(jié),本章綜合講解了軟件工程在項(xiàng)目開發(fā)中的實(shí)際應(yīng)用,并且結(jié)合軟件工程對媒體播放器項(xiàng)目的開發(fā)進(jìn)行了科學(xué)規(guī)劃。另外,本章引進(jìn)了版本控制概念,使讀者了解大型軟件分工協(xié)作的實(shí)現(xiàn)方式,以及版本控制軟件CVS的使用方法。最后,為讀者介紹了媒體播放器項(xiàng)目的播放功能的實(shí)現(xiàn),以及系統(tǒng)集成的概率。相信讀者在理解這些內(nèi)容后,能夠具備實(shí)際的Linux軟件項(xiàng)目編程技能。,
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點(diǎn)美食推薦
- XX國有企業(yè)黨委書記個(gè)人述責(zé)述廉報(bào)告及2025年重點(diǎn)工作計(jì)劃
- 世界濕地日濕地的含義及價(jià)值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點(diǎn)節(jié)后常見的八大危險(xiǎn)
- 廈門城市旅游介紹廈門景點(diǎn)介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點(diǎn)推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個(gè)個(gè)會應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點(diǎn)
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案