張春平
(石家莊職業(yè)技術(shù)學(xué)院,河北石家莊050081)
在嵌入式軟件開發(fā)學(xué)習(xí)過程中,教師會安排很多小的項(xiàng)目來驗(yàn)證學(xué)習(xí)者階段學(xué)習(xí)的成效, 其中Mplayer 是基于Linux 系統(tǒng)編程的一個(gè)項(xiàng)目。 這個(gè)項(xiàng)目基于Cortex A8 平臺,具有觸摸屏和按鍵。 學(xué)習(xí)者利用這個(gè)平臺開發(fā)Mplayer,基本功能是顯示歌曲信息、同步歌詞,顯示歌曲列表,當(dāng)前歌曲反顯,點(diǎn)擊歌曲名能切換歌曲,顯示當(dāng)前播放進(jìn)度,實(shí)現(xiàn)按鍵、觸摸屏控制mp3 文件的播放、暫停、上一首、下一首、快進(jìn)、快退、音量加減、靜音等功能。
Mplayer 是Linux 系統(tǒng)編程的一個(gè)實(shí)例,這里涉及到進(jìn)程和線程,讓學(xué)習(xí)者練習(xí)進(jìn)程和線程的具體應(yīng)用。 觸摸屏和按鍵都可以控制歌曲,這就要使用不同的線程實(shí)現(xiàn),另外歌曲的播放進(jìn)程和觸摸屏、按鍵等線程之間要進(jìn)行通信,獲取按鍵和觸摸屏線程傳遞的命令實(shí)現(xiàn)相應(yīng)的歌曲切換等功能, 這里使用無名管道和命名管道實(shí)現(xiàn)進(jìn)程之間通信。 下面具體看看設(shè)計(jì)步驟。
Mplayer 啟動,初始化圖形庫和觸摸屏,實(shí)現(xiàn)背景窗口的初始化。系統(tǒng)提供了圖形庫函數(shù)以及觸摸屏相關(guān)使用函數(shù),學(xué)習(xí)者可以直接調(diào)用實(shí)現(xiàn)其相關(guān)功能。 例如以下函數(shù):
TFT_init();這是將液晶屏初始化。
TFT_File_Picture();窗口貼圖函數(shù)。
TFT_CreateWindow();創(chuàng)建背景窗口函數(shù)。
TFT_ClearWindow();窗口清除函數(shù)。
從歌曲文件夾中讀取歌曲名字,可以使用指針數(shù)組、鏈表或者數(shù)據(jù)庫保存。 利用獨(dú)立函數(shù)將歌曲歌詞列表顯示,并把播放的歌曲名高亮。 其中使用到打開目錄函數(shù)和讀取目錄下文件函數(shù)。
DIR *opendir(char *pathname);
int closedir(DIR *dir);
struct dirent *readdir(DIR *dir);
這些函數(shù)的具體使用方法可以參照Linux C 函數(shù)文檔, 具體了解,這里不再贅述。
由觸摸屏和按鍵實(shí)現(xiàn)歌曲播放、暫停、歌曲切換等功能,歌曲的切換通過mplayer 提供的“l(fā)oadfile pathname”命令,切換到pathname 指定的歌曲。 歌曲歌詞列表實(shí)現(xiàn)之后創(chuàng)建子進(jìn)程,在子進(jìn)程中啟動mplayer,使用execl 或者execv 實(shí)現(xiàn)。execl 或execv 規(guī)定了mplayer 從命名管道獲取信息, 主進(jìn)程就只能從這個(gè)命名管道發(fā)送命令來控制mplayer實(shí)現(xiàn)歌曲切換。 所以主進(jìn)程需要創(chuàng)建觸摸屏線程和按鍵線程,檢測觸摸屏和按鍵操作,發(fā)送命令到這條命名管道,實(shí)現(xiàn)歌曲真正的切換功能。
在歌曲信息窗口顯示歌曲的總長度、當(dāng)前播放時(shí)間,以及歌曲的專輯、歌手、標(biāo)題等信息,這些信息在歌曲切換時(shí)進(jìn)行刷新。 這些信息是通過mplayer 的一些命令獲取,但是需要重定向mplayer 的輸出,輸出到無名管道的寫入端,這樣其他進(jìn)程和線程可以獲得信息,將需要的信息顯示到液晶屏。
在mplayer 播放歌曲時(shí),查找歌詞,根據(jù)mplayer 返回的當(dāng)前播放時(shí)間來查找歌詞,使得歌曲和歌詞同步,當(dāng)歌曲快進(jìn)時(shí)也可以實(shí)現(xiàn)同步功能,歌詞解析功能使用獨(dú)立線程完成。
圖1 是Mplayer 開發(fā)流程圖。
圖1 Mplayer 流程圖
上面, 我們具體講述了開發(fā)Mplayer 項(xiàng)目每一步驟做的具體事宜,而使用流程圖來表示出具體情況,顯得清晰明了,這樣學(xué)習(xí)者能更清楚的了解項(xiàng)目的開發(fā)。
上文介紹的設(shè)計(jì)是Mplayer 的基本功能實(shí)現(xiàn),如果學(xué)習(xí)者有更多的時(shí)間和精力可以擴(kuò)展更多的功能,比如觸摸進(jìn)度條就可以使得歌曲快進(jìn)或者快退;觸摸歌詞顯示窗口,往上滑動或者向下滑動歌詞,也可以使得歌曲快進(jìn)或者快退。另外這個(gè)播放器是將固定路徑下的歌曲添加到歌曲名稱顯示窗口,那我們可以清除其窗口,利用添加按鈕,選擇不同的路徑來添加歌曲。這些功能實(shí)現(xiàn)難度稍大,學(xué)習(xí)者能力不同,可以根據(jù)自身情況來完成。
[1]Stephen Prata.C Primer Plus[M].北京:人民郵電出版社,2012:354-370.
[2]Neil Matthew,等.Linux 程序設(shè)計(jì).4 版[M].北京:人民郵電出版社,2012:102-103,443-464.
[3]韋東山.嵌入式Linux 應(yīng)用開發(fā)完全手冊[M].北京:人民郵電出版社,2012:197-221.