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