《媒體播放器-項(xiàng)目》PPT課件.ppt
《《媒體播放器-項(xiàng)目》PPT課件.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《《媒體播放器-項(xiàng)目》PPT課件.ppt(75頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第27章媒體播放器——項(xiàng)目完整實(shí)踐,在本書前面的章節(jié)已介紹了C語(yǔ)言的語(yǔ)法和Linux系統(tǒng)中各種常用的函數(shù)庫(kù),利用這些知識(shí)已可開(kāi)發(fā)一些基本的應(yīng)用程序。本章將這些知識(shí)綜合應(yīng)用到媒體播放器項(xiàng)目中,通過(guò)一個(gè)嚴(yán)格的項(xiàng)目管理制度對(duì)項(xiàng)目進(jìn)行規(guī)劃,并補(bǔ)充媒體播放器未實(shí)現(xiàn)的功能。如果該項(xiàng)目由多個(gè)人協(xié)同開(kāi)發(fā),則可以嘗試分工協(xié)作,培養(yǎng)協(xié)同開(kāi)發(fā)的經(jīng)驗(yàn)。,27.1軟件工程實(shí)戰(zhàn),軟件開(kāi)發(fā)的過(guò)程中離不開(kāi)軟件工程思想的指導(dǎo),即使在學(xué)習(xí)過(guò)程中也應(yīng)該時(shí)刻將軟件工程方法放在重要位置。如果在學(xué)習(xí)程序開(kāi)發(fā)過(guò)程中就遭遇了項(xiàng)目失敗,對(duì)于學(xué)習(xí)者來(lái)說(shuō),所造成的挫敗感一直會(huì)影響到將來(lái)的實(shí)際工作中。而實(shí)踐軟件工程思想又能為將來(lái)實(shí)際工作打下扎實(shí)的基礎(chǔ),因此本節(jié)結(jié)合媒體播放器項(xiàng)目來(lái)進(jìn)行軟件工程的實(shí)戰(zhàn)。,27.1.1項(xiàng)目需求分析,項(xiàng)目需求分析經(jīng)常被作為一個(gè)獨(dú)立的課題來(lái)研究,但對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),了解項(xiàng)目需求分析方法也是必不可少的。在樸素軟件工程思想中,項(xiàng)目需求分析的方法使用的是實(shí)例分析法。,27.1.2軟件需求說(shuō)明,軟件需求說(shuō)明(SoftwareRequirementSpecification,簡(jiǎn)稱SRS)是項(xiàng)目需求分析所得到的文檔。它的作用是提出需要解決的問(wèn)題,作為下一步軟件設(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í)際需求,開(kāi)發(fā)者在軟件需求說(shuō)明文檔完成后即可針對(duì)項(xiàng)目視圖提出解決方案。在給出解決方案的同時(shí)也要陳述自己的理由,但應(yīng)該避免在這個(gè)階段進(jìn)行軟件設(shè)計(jì)。下面列舉媒體播放器項(xiàng)目中主要問(wèn)題的解決方啊。1.媒體播放器界面設(shè)計(jì)2.?dāng)?shù)據(jù)庫(kù)的選擇3.讀取MP3文件信息4.媒體播放功能,27.2軟件設(shè)計(jì),軟件設(shè)計(jì)的內(nèi)容很廣泛,但結(jié)果只是總結(jié)出項(xiàng)目需求所列出功能的實(shí)現(xiàn)方法。這個(gè)實(shí)現(xiàn)方法必須清晰易懂,能夠被所有參與項(xiàng)目的開(kāi)發(fā)人員理解。因此,最終獲得的應(yīng)該是數(shù)據(jù)字典和流程圖。本書前面部分已經(jīng)對(duì)媒體庫(kù)中大部分功能的實(shí)現(xiàn)進(jìn)行了分步講解,所以,這里討論另外兩個(gè)重要話題。第一是需求分析方法,即根據(jù)軟件需求說(shuō)明進(jìn)行詳細(xì)分析。第二是制訂開(kāi)發(fā)計(jì)劃和分工,目的是幫助讀者按步驟實(shí)現(xiàn)軟件。,27.2.1需求分析,需求分析是指理解項(xiàng)目的需求,就軟件的功能進(jìn)行深入理解,并且給出明確的解決方案。,27.2.2制訂開(kāi)發(fā)計(jì)劃,媒體播放器中,首先應(yīng)定義程序的主體結(jié)構(gòu),即實(shí)現(xiàn)核心控制模塊。該模塊是其他所有模塊操作的基礎(chǔ),缺少該模塊則難以進(jìn)行后面的工作。然后在第二步可以同時(shí)進(jìn)行媒體庫(kù)模塊和播放控制模塊的實(shí)現(xiàn),第三步進(jìn)行用戶界面模塊和媒體文件解碼模塊的設(shè)計(jì)。最后的步驟是系統(tǒng)集成,把所有的模塊關(guān)聯(lián)起來(lái),如圖27.4所示。,27.2.3分工協(xié)作,一個(gè)較大的項(xiàng)目往往需要分工協(xié)作,如何進(jìn)行項(xiàng)目分配和如何執(zhí)行分配到自身的計(jì)劃也是開(kāi)發(fā)者必須具備的能力。在這里需要引入一種稱之為甘特圖的圖表,它是以圖示的方式通過(guò)活動(dòng)列表和時(shí)間刻度形象地表示出軟件項(xiàng)目的活動(dòng)順序與持續(xù)時(shí)間。,27.3版本控制,無(wú)論是獨(dú)立開(kāi)發(fā)的軟件項(xiàng)目還是協(xié)作開(kāi)發(fā),都需要進(jìn)行版本控制。版本控制的作用是保護(hù)源代碼,將每次對(duì)源代碼的修改都記錄起來(lái)。這樣一方面能保證可以回溯到指定的時(shí)間點(diǎn),另一方面在多人同時(shí)編輯一個(gè)源代碼文件時(shí)不會(huì)相互覆蓋對(duì)方的工作成果。目前版本控制工具有很多,Linux系統(tǒng)上使用最廣泛的版本控制工具是CVS。該工具不僅能很好的支持C語(yǔ)言項(xiàng)目,而且能被Eclipse集成開(kāi)發(fā)工具集成使用。,27.3.1CVS服務(wù)器配置,CVS服務(wù)器是托管源代碼的倉(cāng)庫(kù),開(kāi)發(fā)者通過(guò)訪問(wèn)CVS服務(wù)器獲得源代碼資源。在修改了相應(yīng)的源代碼后,源代碼及其改動(dòng)信息又被存回到CVS服務(wù)器中。多人參與的項(xiàng)目只用建立一個(gè)CVS服務(wù)器,開(kāi)發(fā)者通過(guò)網(wǎng)絡(luò)訪問(wèn)該服務(wù)器。,27.3.2CVS服務(wù)器管理,CVS是功能齊備的版本控制工具,在使用CVS服務(wù)器之前有幾個(gè)重要概念必須了解。下面分別介紹這幾個(gè)概念和操作方法。1.倉(cāng)庫(kù)2.模塊3.導(dǎo)入4.簽出5.簽入6.添加和刪除7.歷史8.沖突解決9.標(biāo)記10.分支11.遠(yuǎn)程訪問(wèn)12.局限性,27.4在Eclipse中使用CVS客戶端,Eclipse集成開(kāi)發(fā)環(huán)境內(nèi)置了CVS客戶端插件,因此可直接使用Eclipse管理CVS服務(wù)器中的資源。對(duì)于Eclipse來(lái)說(shuō),CVS用于支持團(tuán)隊(duì)開(kāi)發(fā),是很多大型軟件開(kāi)發(fā)團(tuán)隊(duì)所選用的工具。在Eclipse中使用CVS客戶端的優(yōu)勢(shì)在于:Eclipse與CVS無(wú)縫連接,可直接通過(guò)Eclipse的界面和菜單進(jìn)行CVS操作。Eclipse為CVS提供了圖形用戶接口,無(wú)需記憶復(fù)雜的操作命令。Eclipse支持將CVS模塊作為項(xiàng)目操作。,27.4.1從CVS服務(wù)器簽出模塊并創(chuàng)建項(xiàng)目,無(wú)論CVS服務(wù)器是在本地,還是在遠(yuǎn)端,都可以直接從CVS服務(wù)器中簽出模塊并創(chuàng)建項(xiàng)目。,27.4.2簽入文件,每一個(gè)文件名后顯示該文件的版本號(hào),如果文件在本地被改動(dòng)過(guò),文件名前面會(huì)顯示一個(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倉(cāng)庫(kù)中文件的差異。在Eclipse主界面選擇Window|TeamSynchronize命令,將進(jìn)入到團(tuán)隊(duì)同步界面,如圖27.20所示。,27.4.5管理CVS服務(wù)器,Eclipse提供了專門的界面管理CVS服務(wù)器。如圖27.21所示。,27.4.6斷開(kāi)項(xiàng)目與CVS服務(wù)器之間的關(guān)聯(lián),如果某一項(xiàng)目不在需要與CVS服務(wù)器關(guān)聯(lián)起來(lái),可以在項(xiàng)目瀏覽器中右擊該項(xiàng)目,選擇Team|Disconnect命令。這時(shí),將彈出ConfirmDisconnectfromCVS對(duì)話框,如圖27.22所示。,27.5音量控制對(duì)話框,音量控制對(duì)話框的作用是調(diào)節(jié)系統(tǒng)音量。單擊媒體播放器主界面上的音量調(diào)節(jié)開(kāi)關(guān)按鈕后,如果開(kāi)關(guān)按鈕的狀態(tài)為按下,音量調(diào)節(jié)對(duì)話框?qū)@示出來(lái)。如果開(kāi)關(guān)按鈕處于原始狀態(tài),音量調(diào)節(jié)對(duì)話框被隱藏。相關(guān)代碼放在“interface.c”文件中。,27.5.1創(chuàng)建對(duì)話框,音量調(diào)節(jié)對(duì)話框的類型屬于彈出式窗口,因此它沒(méi)有普通窗體的標(biāo)題欄和邊框。音量調(diào)節(jié)對(duì)話框出現(xiàn)的位置非常重要,按照GNOME桌面環(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é)對(duì)話框都會(huì)顯示在鼠標(biāo)光標(biāo)指向的位置。。,27.5.2添加垂直比例尺,音量調(diào)節(jié)對(duì)話框內(nèi)的主要部件是一個(gè)垂直比例尺,該比例尺用于調(diào)節(jié)音量和顯示音量的比例。對(duì)話框中默認(rèn)有一個(gè)活動(dòng)區(qū)域,實(shí)際上它是橫向按鈕盒。音量調(diào)節(jié)對(duì)話框中沒(méi)有任何按鈕,因此要將活動(dòng)區(qū)域屏蔽起來(lái)。本例屏蔽活動(dòng)區(qū)域的方法為,先獲得活動(dòng)區(qū)域的地址,其后使用gtk_widget_set_sensitive()函數(shù)使活動(dòng)區(qū)域不顯示。但是,必須用gtk_button_box_set_layout()函數(shù)結(jié)束活動(dòng)區(qū)域設(shè)置,否則會(huì)造成GTK+錯(cuò)誤。最后,使用gtk_widget_grab_default()函數(shù)讓GTK+獲得焦點(diǎn)。在創(chuàng)建音量控制對(duì)話框函數(shù)結(jié)尾處還要將diaVolume指針?lè)祷亍?27.5.3測(cè)試,下面用一個(gè)例子測(cè)試音量控制對(duì)話框的顯示效果。在編寫代碼前,先要在媒體播放器源代碼目錄中添加C語(yǔ)言源代碼文件“callback.c”和頭文件“callback.h”。這兩個(gè)文件用于放置所有回調(diào)函數(shù)的代碼,在后面的開(kāi)發(fā)過(guò)程中還將用到。,27.6播放列表對(duì)話框,播放列表對(duì)話框由一組工具條按鈕、一個(gè)樹(shù)視圖和一組按鈕構(gòu)成,下面分別介紹播放列表對(duì)話框中這幾個(gè)部件的實(shí)現(xiàn)方法。,27.6.1創(chuàng)建對(duì)話框,播放列表對(duì)話框是一個(gè)非模式對(duì)話框,可以在該對(duì)話框顯示的同時(shí)操作媒體播放器主界面。它與普通窗體的構(gòu)件區(qū)別在于,非模式對(duì)話框沒(méi)有最小化和最大化按鈕。非模式對(duì)話框與模式對(duì)話框的區(qū)別在于,前者使用gtk_widget_show()函數(shù)顯示,后者使用gtk_dialog_run顯示。,27.6.2創(chuàng)建工具條和工具條按鈕,播放列表對(duì)話框的各種操作都放在工具欄中,對(duì)應(yīng)有7個(gè)工具欄按鈕。為了便于顯示控制,工具條中使用的是工具條按鈕。其中“添加”、“打開(kāi)”、“保存”和“刪除”按鈕可直接通過(guò)圖像庫(kù)創(chuàng)建。但“添加目錄”、“刪除全部”和“排序”按鈕并沒(méi)有圖像庫(kù)中對(duì)于的項(xiàng)目,需要進(jìn)行自定義。,27.6.3創(chuàng)建樹(shù)視圖,播放列表的內(nèi)容顯示在樹(shù)視圖中,因此樹(shù)視圖被放置在播放列表對(duì)話框的主要位置。播放列表的內(nèi)容可能不能完全顯示在播放列表對(duì)胡框中,所以在創(chuàng)建樹(shù)視圖前先要?jiǎng)?chuàng)建一個(gè)滾動(dòng)條窗體容器。將滾動(dòng)條窗體的水平滾動(dòng)條屏蔽,設(shè)置其垂直滾動(dòng)條為自動(dòng)顯示。代碼中,滾動(dòng)條窗體的陰影風(fēng)格被設(shè)置為向內(nèi),與其他對(duì)話框保存統(tǒng)一。然后新建一個(gè)樹(shù)視圖,將樹(shù)視圖裝入滾動(dòng)條窗體容器中。,27.6.4創(chuàng)建對(duì)話框按鈕,播放列表對(duì)話框只需要放置一個(gè)按鈕,用于關(guān)閉對(duì)話框。這時(shí)需要用到對(duì)話框的活動(dòng)區(qū)域部分,代碼如下所示:GtkWidget*dialog_action_area2;//用于保存活動(dòng)區(qū)域地址dialog_action_area2=GTK_DIALOG(diaPlaylist)->action_area;//獲得活動(dòng)區(qū)域地址gtk_widget_show(dialog_action_area2);//顯示活動(dòng)區(qū)域gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog_action_area2),GTK_BUTTONBOX_END);//結(jié)束活動(dòng)區(qū)域設(shè)置,27.6.5測(cè)試,播放列表的實(shí)現(xiàn)與隱藏由媒體播放器主界面上的“播放列表”按鈕控制。因此首先要為該按鈕的clicked事件連接回調(diào)函數(shù)。,27.7媒體庫(kù)對(duì)話框,媒體庫(kù)對(duì)話框的實(shí)現(xiàn)方法相對(duì)于播放列表對(duì)話框略為復(fù)雜,主要區(qū)別是媒體庫(kù)對(duì)話框使用了2個(gè)樹(shù)視圖,一個(gè)用于顯示分類,另一個(gè)用于顯示媒體信息。媒體庫(kù)以標(biāo)題、藝術(shù)家、專輯和流派作為分類的條件,因此需要在原型中顯示出來(lái)。本例中將介紹樹(shù)視圖的初步實(shí)現(xiàn)方法。,27.7.1創(chuàng)建對(duì)話框,媒體庫(kù)對(duì)話框使用的是非模式對(duì)話框,很多時(shí)候還需要與播放列表對(duì)話框同時(shí)顯示。但是代碼量的多少并非是衡量開(kāi)發(fā)者編碼水平重要因素,程序清晰易讀才是必須遵循的原則。有些時(shí)候增加代碼復(fù)用會(huì)加大編碼難度,這樣將造成更多的編碼錯(cuò)誤,反而降低了效率。,27.7.2創(chuàng)建工具條和工具條按鈕,媒體庫(kù)對(duì)話框的工具條中共有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)建分類部件和媒體信息顯示部件,分類部件和媒體信息顯示部件均選用樹(shù)視圖構(gòu)件實(shí)現(xiàn),但是使用的是樹(shù)視圖的兩種不同模式。分類的方法有三種,分別是:按藝術(shù)家名稱分類、按專輯分類和按流派分類。,27.7.4創(chuàng)建搜索部件,搜索部件是文本輸入框、組合框和按鈕這3個(gè)構(gòu)件的組合。文本輸入框用于輸入搜索字符串,組合框中放置著搜索條件。本例中搜索部件是橫向排列的三個(gè)構(gòu)件,因此在代碼中先要?jiǎng)?chuàng)建一個(gè)橫向組裝盒,將橫向組裝盒裝入上一層的縱向組裝盒中。然后分別創(chuàng)建文本輸入框、組合框和查找按鈕,將這些構(gòu)件裝入到橫向組裝盒中。搜索的5個(gè)條件已添加到組合框上,嚴(yán)格的程序開(kāi)發(fā)過(guò)程中,這種用法并不規(guī)范。因此,必須用文檔記錄這幾個(gè)條件的順序,以確保在實(shí)現(xiàn)查找功能時(shí)不會(huì)出錯(cuò)。,27.7.5創(chuàng)建對(duì)話框按鈕,媒體庫(kù)對(duì)話框只需要放置一個(gè)按鈕用于關(guān)閉對(duì)話框。代碼如下所示:GtkWidget*dialog_action_area4;//用于保存活動(dòng)區(qū)域地址dialog_action_area4=GTK_DIALOG(diaPlaylist)->action_area;//獲得活動(dòng)區(qū)域地址gtk_widget_show(dialog_action_area4);//顯示活動(dòng)區(qū)域gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog_action_area4),GTK_BUTTONBOX_END);//結(jié)束活動(dòng)區(qū)域設(shè)置GtkWidget*closebutton2;//用于保存關(guān)閉按鈕地址,27.7.6測(cè)試,本部分的測(cè)試內(nèi)容主要是介紹樹(shù)視圖的簡(jiǎn)單操作,實(shí)現(xiàn)分類部件的初始化。首先要修改“interface.h”頭文件中的結(jié)構(gòu)體_interface,增加分類樹(shù)視圖的指針。,27.8播放控制模塊實(shí)現(xiàn),播放控制模塊是媒體播放器中最重要的核心。該模塊的作用是架起媒體播放器與GStreamer多媒體框架之間的橋梁,使媒體播放器能通過(guò)GStreamer多媒體框架實(shí)現(xiàn)MP3播放的功能。因?yàn)镚Streamer函數(shù)庫(kù)提供了非常簡(jiǎn)單的接口對(duì)播放進(jìn)行控制,實(shí)現(xiàn)播放控制模塊所需要的代碼并不多。下面開(kāi)始介紹播放控制模塊實(shí)現(xiàn)的方法。,27.8.1播放控制模塊程序結(jié)構(gòu),播放控制模塊的源代碼放置在“play.h”頭文件和“play.c”源代碼文件中,先在媒體播放器項(xiàng)目的源代碼目錄中新建這兩個(gè)文件。,27.8.2MP3播放功能實(shí)現(xiàn),上一節(jié)已經(jīng)討論了播放控制模塊的程序結(jié)構(gòu),MP3播放功能實(shí)際上是在play()函數(shù)中通過(guò)調(diào)用GStreamer庫(kù)實(shí)現(xiàn)。在創(chuàng)建函數(shù)前,先要為“play.c”文件加上一些相關(guān)的頭文件。1.函數(shù)接口和相關(guān)數(shù)據(jù)類型的定義2.播放指令處理3.MP3文件播放,27.8.3播放中的回調(diào)處理,在GStreamer管道進(jìn)行播放時(shí),會(huì)產(chǎn)生大量的信號(hào)。例如管道中的文件信息,播放時(shí)出現(xiàn)的錯(cuò)誤信息和播放和播放結(jié)束的信息。play()函數(shù)將總線消息的回調(diào)設(shè)為bus_call()函數(shù),下面介紹該函數(shù)的實(shí)現(xiàn)過(guò)程。1.函數(shù)參數(shù)列表和數(shù)據(jù)轉(zhuǎn)換2.處理播放結(jié)束3.獲取MP3文件真實(shí)信息4.錯(cuò)誤處理5.測(cè)試,27.9系統(tǒng)集成,媒體播放器中的所有模塊均已實(shí)現(xiàn),在編碼過(guò)程中的最后一步即系統(tǒng)集成。系統(tǒng)集成是讓所有模塊相互關(guān)聯(lián)起來(lái),共同工作,形成一個(gè)可用的程序。工序中,首先要設(shè)計(jì)一個(gè)主程序文件,為所有模塊初始化。然后以自上而下的方法實(shí)現(xiàn)界面上所有部件的功能。從主界面的實(shí)現(xiàn)開(kāi)始,直到每個(gè)菜單項(xiàng)和按鈕的功能都實(shí)現(xiàn)。,27.10主程序文件實(shí)現(xiàn),主程序文件由一個(gè)名為“main.c”的源代碼文件和名為“main.h”的頭文件組成。其中,最重要的函數(shù)就是主函數(shù)main()。主函數(shù)是一個(gè)程序的接口,實(shí)際的項(xiàng)目中,主函數(shù)的作用通常是對(duì)其他所有函數(shù)模塊進(jìn)行初始化,并且創(chuàng)建其他模塊所需的數(shù)據(jù)結(jié)構(gòu)。在主函數(shù)退出前,程序所占用的所有系統(tǒng)資源將被釋放。,27.10.1頭文件和主函數(shù)入口,主程序中除了要放置基本的C語(yǔ)言標(biāo)準(zhǔn)庫(kù)頭文件外,還要放入GLib庫(kù)、GTK+庫(kù)、GStreamer庫(kù)和SQLite庫(kù)的入口函數(shù)頭文件。源代碼目錄中其他模塊的頭文件也應(yīng)被主程序包含,這樣所有的模塊間就能相互調(diào)用。,27.10.2媒體庫(kù)模塊初始化,媒體庫(kù)模塊初始化的工作包括連接數(shù)據(jù)庫(kù),創(chuàng)建媒體庫(kù)鏈表和播放列表鏈表入口,以及從數(shù)據(jù)庫(kù)中讀取媒體庫(kù)信息。媒體庫(kù)鏈表和播放列表鏈表都是使用自定義的link_t類型,該類型只是鏈表的接口,其他媒體庫(kù)模塊的函數(shù)將通過(guò)該接口創(chuàng)建動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。最后一行調(diào)用的load_medialib()函數(shù)參數(shù)是媒體庫(kù)鏈表入口,此函數(shù)將讀取數(shù)據(jù)庫(kù)中媒體庫(kù)信息表內(nèi)的數(shù)據(jù),并用這些數(shù)據(jù)為媒體庫(kù)初始化。,27.10.3圖形界面初始化,圖形界面初始化包含4個(gè)步驟。首先初始化GTK+庫(kù),讀取主函數(shù)傳遞來(lái)的運(yùn)行參數(shù)。然后創(chuàng)建界面的數(shù)據(jù)結(jié)構(gòu)和相關(guān)界面,這個(gè)過(guò)程是對(duì)界面數(shù)據(jù)結(jié)構(gòu)的初始化。再對(duì)主界面進(jìn)行操作,顯示主界面并,并且為主界面連接回調(diào)函數(shù)。最后啟動(dòng)GTK+主循環(huán)。,27.10.4退出前清理,媒體播放器的程序代碼中有許多地方用到了動(dòng)態(tài)內(nèi)存分配技術(shù),因此需要在退出前對(duì)這些內(nèi)存進(jìn)行清理。清理工作可分為兩類,一類是直接由申請(qǐng)內(nèi)存的函數(shù)庫(kù)來(lái)清理,例如大部分GTK+庫(kù)的對(duì)象都能自動(dòng)清理內(nèi)存。另一類是用戶手動(dòng)清理,主要是針對(duì)自定義的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。,27.10.5編譯和運(yùn)行,媒體播放器調(diào)用了很多函數(shù)庫(kù),這些函數(shù)庫(kù)的路徑必須在編譯時(shí)指明。如果是在終端上使用GCC編譯器進(jìn)行編譯,同時(shí)借助pkgconfig程序提供函數(shù)庫(kù)路徑,完整的編譯指令如下所示:gcc-g`pkg-config--cflags--libsglib-2.0gtk+-2.0gstreamer-base-0.10id3tagsqlite3`main.c-omp3player編譯成功后,源代碼目錄中將新增一個(gè)名為mp3player的可執(zhí)行文件。程序執(zhí)行時(shí),可在屏幕上顯示出媒體播放器的主界面。,27.11媒體庫(kù)功能集成,媒體庫(kù)功能集成涉及到與用戶界面模塊和核心控制模塊的數(shù)據(jù)傳遞。每一個(gè)操作指令均由界面的回調(diào)函數(shù)向核心控制模塊發(fā)出,核心控制模塊再選擇函數(shù)對(duì)媒體庫(kù)進(jìn)行操作,最后又影響到界面的顯示。下面介紹媒體庫(kù)功能集成的方法。,27.11.1初始化,在媒體播放器主函數(shù)中,雖然已經(jīng)創(chuàng)建了媒體庫(kù)相關(guān)的數(shù)據(jù)結(jié)構(gòu),并且從數(shù)據(jù)庫(kù)中讀取了相應(yīng)數(shù)據(jù)傳遞到媒體庫(kù)鏈表。但是,核心控制模塊中并未獲得媒體庫(kù)鏈表的入口,所以還需要進(jìn)行數(shù)據(jù)傳遞才能實(shí)現(xiàn)媒體庫(kù)的初始化。,27.11.2顯示媒體庫(kù)對(duì)話框,主函數(shù)初始化界面數(shù)據(jù)結(jié)構(gòu)時(shí)已創(chuàng)建了媒體庫(kù)對(duì)話框,但對(duì)話框中并沒(méi)有顯示任何內(nèi)容。顯示媒體庫(kù)對(duì)話框操作的主要難點(diǎn)在于,顯示媒體庫(kù)的同時(shí)將媒體庫(kù)信息讀入相應(yīng)的樹(shù)視圖中。,27.11.3添加文件,向媒體庫(kù)添加文件操作需要用到文件選擇對(duì)話框。該對(duì)話框的地址不用傳遞給界面的數(shù)據(jù)結(jié)構(gòu),相關(guān)的創(chuàng)建代碼可在添加按鈕的回調(diào)函數(shù)中實(shí)現(xiàn)。其他操作均可用以前實(shí)現(xiàn)的代碼來(lái)完成。,27.11.4添加目錄,添加目錄操作比添加文件操作實(shí)現(xiàn)起來(lái)略微復(fù)雜一些,因?yàn)橐幚韺⒍鄠€(gè)文件傳遞到數(shù)據(jù)庫(kù)中的操作。下面介紹實(shí)現(xiàn)步驟。(1)修改create_diaMedialib()函數(shù),為添加目錄按鈕連接回調(diào)函數(shù)。(2)實(shí)現(xiàn)回調(diào)函數(shù)on_tlbAdddir_clicked(),代碼中將創(chuàng)建文件選擇對(duì)話框,運(yùn)行結(jié)束時(shí)銷毀該對(duì)話框。(3)修改核心控制模塊,處理MEDIALIB_ADD_FILE指令。(4)創(chuàng)建函數(shù)medialib_add_dir(),該函數(shù)的作用是將目錄中的文件添加到媒體庫(kù)鏈表,并且再將新增加節(jié)點(diǎn)上的數(shù)據(jù)保存到數(shù)據(jù)庫(kù)。,27.11.5刪除文件信息,刪除媒體文件信息比較簡(jiǎn)單的流程為先在數(shù)據(jù)庫(kù)中刪除指定項(xiàng)目,然后重新讀取數(shù)據(jù)庫(kù),最后刷新樹(shù)視圖。下面是該流程的實(shí)現(xiàn)方法。(1)修改create_diaMedialib()函數(shù),為刪除按鈕連接回調(diào)函數(shù)。(2)創(chuàng)建回調(diào)函數(shù)on_tlbDel_clicked(),該函數(shù)將從樹(shù)視圖中讀取被選擇的數(shù)據(jù),然后傳遞到核心控制模塊進(jìn)行處理。(3)修改核心控制模塊,處理MEDIALIB_DEL指令。(4)創(chuàng)建medialib_del()函數(shù)。該函數(shù)的作用是從數(shù)據(jù)庫(kù)中刪除指定文件信息,然后從數(shù)據(jù)庫(kù)中重新讀取數(shù)據(jù)到媒體庫(kù)鏈表中。,27.11.6刪除所有文件信息,刪除所有文件信息實(shí)現(xiàn)的思路是先刪除數(shù)據(jù)庫(kù)中的所有節(jié)點(diǎn),然后重新讀入數(shù)據(jù)庫(kù)。這時(shí)讀入的鏈表長(zhǎng)度為0,達(dá)到了刪除掉的目的。下面是實(shí)現(xiàn)步驟。(1)修改create_diaMedialib()函數(shù),為刪除全部按鈕連接回調(diào)函數(shù)。(2)創(chuàng)建回調(diào)函數(shù)on_tlbDelall_clicked(),該函數(shù)將傳遞刪除媒體庫(kù)中所有信息和刷新樹(shù)視圖指令到核心控制模塊進(jìn)行處理。(3)修改核心控制模塊,處理MEDIALIB_DEL_ALL指令。(4)創(chuàng)建medialib_del_all()函數(shù)。,27.11.7搜索本地文件,搜索本地文件主要會(huì)用到在設(shè)計(jì)媒體庫(kù)鏈表數(shù)據(jù)結(jié)構(gòu)時(shí)創(chuàng)建的link_search()函數(shù),該函數(shù)將遍歷計(jì)算機(jī)中整個(gè)文件系統(tǒng)。并且將找到的MP3文件加入媒體庫(kù)鏈表。(1)修改create_diaMedialib()函數(shù),為“搜索本地媒體文件”按鈕連接回調(diào)函數(shù)。(2)創(chuàng)建回調(diào)函數(shù)on_tlbSearch_clicked(),該函數(shù)將創(chuàng)建一個(gè)對(duì)話框詢問(wèn)用戶是否進(jìn)行搜索本地文件操作。(3)修改核心控制模塊,處理MEDIALIB_SEARCH指令。(4)創(chuàng)建medialib_search()函數(shù)。,27.11.8傳遞到播放列表,媒體庫(kù)對(duì)話框中的“傳遞到播放列表”按鈕作用是將媒體庫(kù)鏈表中的節(jié)點(diǎn)傳遞到播放列表鏈表中。用戶可通過(guò)該按鈕向播放列表添加數(shù)據(jù),播放媒體庫(kù)中指定的媒體文件。下面介紹實(shí)現(xiàn)該操作的步驟。(1)修改create_diaMedialib()函數(shù),為“傳遞到播放列表”按鈕連接回調(diào)函數(shù)。(2)創(chuàng)建回調(diào)函數(shù)on_tlbSendto_clicked(),該函數(shù)將獲得樹(shù)視圖中被選中的文件路徑,并傳遞到核心控制模塊。(3)修改核心控制模塊,處理MEDIALIB_SEND_TO_PLAYLIST指令。(4)創(chuàng)建medialib_sendto(),該函數(shù)的作用是為播放列表鏈表添加新節(jié)點(diǎn)。,27.11.9查找,查找操作的實(shí)現(xiàn)方法是,先使用link_find()函數(shù)找到媒體庫(kù)鏈表中與條件匹配的項(xiàng)目,然后將這些項(xiàng)目添加到鏈表上。最后重新顯示樹(shù)視圖。查找操作要用到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()函數(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文件支持和與播放控制模塊之間的互動(dòng)。播放列表雖然不進(jìn)行數(shù)據(jù)庫(kù)操作,但是要求能將播放列表中的數(shù)據(jù)保存到M3U文件中,或者從M3U文件讀取數(shù)據(jù)到播放列表。播放列表的設(shè)計(jì)目的是能夠使播放控制模塊以播放列表中的順序進(jìn)行播放,因此實(shí)現(xiàn)時(shí)要考慮兩者的數(shù)據(jù)傳遞。雖然播放列表大部分操作以對(duì)播放列表列表數(shù)據(jù)的訪問(wèn)為主,不過(guò)播放列表對(duì)話框上要能顯示出當(dāng)前播放的媒體在播放列表中的位置。,27.12.1初始化,播放列表的初始化操作是在主函數(shù)中創(chuàng)建播放列表鏈表,然后將鏈表的地址傳遞到核心控制模塊中。下面介紹實(shí)現(xiàn)步驟。(1)修改主函數(shù),在創(chuàng)建播放列表鏈表后,增加一條對(duì)核心控制模塊的調(diào)用。(2)在核心控制模塊中創(chuàng)建指向播放列表鏈表的指針,用于核心控制模塊保存播放列表鏈表的入口。(3)在核心控制模塊函數(shù)的switch選擇結(jié)構(gòu)中,增加對(duì)GENERAL_PLAYLIST_INIT指令處理的代碼。,27.12.2顯示播放列表對(duì)話框,媒體播放器主界面上的“播放列表”按鈕用于操縱播放列表對(duì)話框的顯示。操作流程為,當(dāng)“播放列表”按鈕按下時(shí),回調(diào)函數(shù)判斷播放列表對(duì)話框是否已顯示。如果播放列表對(duì)話框沒(méi)有顯示,則傳送顯示播放列表指令到核心控制模塊。核心控制模塊調(diào)用指定函數(shù),判斷播放列表對(duì)話框是否已初始化,如果沒(méi)有則先進(jìn)行初始化,最后顯示出播放列表對(duì)胡框。,27.12.3添加文件,當(dāng)按下播放列表對(duì)話框中的添加按鈕時(shí),播放列表對(duì)話框應(yīng)能彈出一個(gè)對(duì)話框供用戶選擇文件。然后將該文件的信息添加到播放列表鏈表的末端。需要注意到是,播放列表對(duì)話框上按鈕的名稱與媒體庫(kù)對(duì)話框不同,因此回調(diào)函數(shù)也有區(qū)別,不能簡(jiǎn)單地復(fù)用。,27.12.4添加目錄,添加目錄操作的目的是將目錄中所有MP3文件添加到播放列表中,主要的業(yè)務(wù)邏輯代碼依然是復(fù)用媒體庫(kù)所提供的。下面介紹實(shí)現(xiàn)步驟。(1)修改create_diaPlaylist()函數(shù),為添加目錄按鈕連接回調(diào)函數(shù)。(2)實(shí)現(xiàn)回調(diào)函數(shù)on_tbtAdddir_clicked(),代碼中將創(chuàng)建文件選擇對(duì)話框,運(yùn)行結(jié)束時(shí)銷毀該對(duì)話框。(3)修改核心控制模塊,處理PLAYLIST_ADD_DIR指令。(4)創(chuàng)建函數(shù)playlist_add_dir(),該函數(shù)的作用是將目錄中的所有MP3文件添加到播放列表鏈表中。,27.12.5打開(kāi)文件,前面章節(jié)介紹過(guò)播放列表文件M3U,并且實(shí)現(xiàn)了讀取M3U文件到播放列表的函數(shù)load_m3u()。下面介紹利用該函數(shù)打開(kāi)M3U文件的操作步驟。(1)修改create_diaPlaylist()函數(shù),為打開(kāi)文件按鈕連接回調(diào)函數(shù)。(2)實(shí)現(xiàn)回調(diào)函數(shù)on_tbtOpen_clicked(),代碼中將創(chuàng)建文件選擇對(duì)話框,運(yùn)行結(jié)束時(shí)銷毀該對(duì)話框。(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_clicked()。代碼中將創(chuàng)建文件選擇對(duì)話框,該對(duì)話框的類型為保存文件,否則無(wú)法設(shè)置新文件名。(3)修改核心控制模塊,處理PLAYLIST_SAVE指令。(4)創(chuàng)建函數(shù)playlist_save(),該函數(shù)的作用是將播放列表鏈表中所有MP3文件信息添加到M3U文件中。,27.12.7刪除文件,在播放列表對(duì)話框中刪除文件不涉及數(shù)據(jù)庫(kù)的操作,相反,要實(shí)現(xiàn)鏈表的操作。下面是該操作的實(shí)現(xiàn)方法。(1)修改create_diaMedialib()函數(shù),為刪除按鈕連接回調(diào)函數(shù)。(2)創(chuàng)建回調(diào)函數(shù)on_tbtDel_clicked()。該函數(shù)將判斷樹(shù)視圖是否選擇了數(shù)據(jù),如果是,則發(fā)送指令到核心控制模塊處理。(3)修改核心控制模塊,處理PLAYLIST_DEL指令。(4)創(chuàng)建playlist_del()函數(shù)。該函數(shù)的作用是從播放列表鏈表中刪除指定文件信息。刪除鏈表節(jié)點(diǎn)要用到節(jié)點(diǎn)在鏈表中的位置編號(hào),這里實(shí)現(xiàn)的方法是讀取被選擇文件在樹(shù)視圖中的行號(hào)來(lái)實(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ù)將傳遞刪除媒體庫(kù)中所有信息和刷新樹(shù)視圖指令到核心控制模塊進(jìn)行處理。(3)修改核心控制模塊,處理PLAYLIST_DEL_ALL指令。(4)創(chuàng)建playlist_del_all()函數(shù)。,27.12.9排序,排序的方法有很多種,其中最容易實(shí)現(xiàn)的是比較法排序。對(duì)播放列表排序的函數(shù)在前面已實(shí)現(xiàn),下面介紹與播放列表對(duì)話框集成的方法。(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播放控制模塊集成,播放控制模塊的集成與其他模塊密切相關(guān),各種操作由媒體播放器主界面發(fā)出,然后播放的信息又被反映到媒體播放器的主界面中來(lái)。播放模式有3種,分別是順序模式、循環(huán)模式和隨機(jī)模式,播放模式通過(guò)主界面上的模式選擇組合框設(shè)置。播放控制指令有5種,分別是開(kāi)始播放、暫停播放、停止播放、上一首和下一首,各種指令都對(duì)應(yīng)著媒體播放器主界面上的按鈕。,27.13.1播放模式設(shè)置,播放模式設(shè)置的數(shù)值被保存在核心控制模塊中,是一個(gè)靜態(tài)類型的整型變量,名稱為state。下面介紹模板模式設(shè)置操作實(shí)現(xiàn)的步驟。(1)修改create_winMain()函數(shù)。為播放模式組合框的active信號(hào)鏈接回調(diào)函數(shù),選擇組合框中的選項(xiàng)時(shí)回調(diào)函數(shù)將被執(zhí)行。(2)創(chuàng)建回調(diào)函數(shù)on_cbbMode_active(),該函數(shù)將傳遞排序指令到核心控制模塊進(jìn)行處理。(3)修改核心控制模塊,處理GENERAL_PLAY_MODE指令。,27.13.2開(kāi)始播放,當(dāng)用戶按下播放按鈕后,核心控制模塊將根據(jù)播放模式的設(shè)定來(lái)選擇要播放的文件。下面介紹實(shí)現(xiàn)播放操作的步驟。(1)修改create_winMain()函數(shù)。為播放按鈕的clicked信號(hào)鏈接回調(diào)函數(shù)。(2)創(chuàng)建回調(diào)函數(shù)on_btPlay_clicked()。該函數(shù)負(fù)責(zé)向核心控制模塊發(fā)送播放信號(hào)。(3)修改核心控制模塊,處理PLAY_START指令。(4)創(chuàng)建play_start()函數(shù),該函數(shù)將保存上一個(gè)播放的文件。如果不存在上一個(gè)播放文件的記錄,說(shuō)明播放的是首個(gè)文件,播放操作將從媒體庫(kù)鏈表的首端開(kāi)始。,27.13.3暫停播放,當(dāng)用戶按下暫停按鈕后,核心控制模塊將向播放控制模塊傳送暫停播放指令。下面介紹實(shí)現(xiàn)暫停播放操作的步驟。(1)修改create_winMain()函數(shù)。為暫停按鈕的clicked信號(hào)鏈接回調(diào)函數(shù)。(2)創(chuàng)建回調(diào)函數(shù)on_btPause_clicked()。該函數(shù)負(fù)責(zé)向核心控制模塊發(fā)送播放信號(hào)。(3)修改核心控制模塊,處理PLAY_PAUSE指令。,27.13.4停止播放,當(dāng)用戶按下停止按鈕后,核心控制模塊將向播放控制模塊傳送停止播放指令。下面介紹停止播放操作的步驟。(1)修改create_winMain()函數(shù)。為停止按鈕的clicked信號(hào)鏈接回調(diào)函數(shù)。(2)創(chuàng)建回調(diào)函數(shù)on_btStop_clicked()。該函數(shù)負(fù)責(zé)向核心控制模塊發(fā)送停止播放信號(hào)。(3)修改核心控制模塊,處理PLAY_STOP指令。,27.13.5播放上一首,當(dāng)用戶按下“播放上一首”按鈕后,核心控制模塊將向播放控制模塊傳送播放上一首指令。下面介紹播放上一首操作的步驟。(1)修改create_winMain()函數(shù)。為“播放上一首”按鈕的clicked信號(hào)鏈接回調(diào)函數(shù)。(2)創(chuàng)建回調(diào)函數(shù)on_btPre_clicked()。該函數(shù)負(fù)責(zé)向核心控制模塊發(fā)送停止播放信號(hào)。(3)修改核心控制模塊,處理PLAY_PRE指令。,27.13.6播放下一首,當(dāng)用戶按下“播放下一首”按鈕后,核心控制模塊將遍歷播放列表鏈表,找到要播放的下一個(gè)文件。下面介紹實(shí)現(xiàn)播放操作的步驟。(1)修改create_winMain()函數(shù)。為“播放下一首”按鈕的clicked信號(hào)鏈接回調(diào)函數(shù)。(2)創(chuàng)建回調(diào)函數(shù)on_btNext_clicked()。該函數(shù)負(fù)責(zé)向核心控制模塊發(fā)送播放信號(hào)。(3)修改核心控制模塊,處理PLAY_NEXT指令。,27.14小結(jié),本章綜合講解了軟件工程在項(xiàng)目開(kāi)發(fā)中的實(shí)際應(yīng)用,并且結(jié)合軟件工程對(duì)媒體播放器項(xiàng)目的開(kāi)發(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.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 媒體播放器-項(xiàng)目 媒體播放器 項(xiàng)目 PPT 課件
鏈接地址:http://ioszen.com/p-13194197.html