隨著嵌入式系統(tǒng)的不斷發(fā)展,處理器性能的不斷提升,存儲系統(tǒng)容量的不斷擴大,各種多媒體應用程序被移植到嵌入式系統(tǒng)中,多媒體組件成為其不可或缺的重要組成部分。本文在比較如今流行的幾種嵌入式圖形系統(tǒng)的基礎上,提出了基于MiniGUI的嵌入式媒體播放器的設計與實現(xiàn)方法。 1 引言 隨著嵌入式系統(tǒng)的不斷發(fā)展,處理器性能的不斷提升,存儲系統(tǒng)容量的不斷擴大,各種多媒體應用程序被移植到嵌入式系統(tǒng)中,多媒體組件成為其不可或缺的重要組成部分。嵌入式多媒體播放器的開發(fā)是當前 IT產(chǎn)業(yè)的熱點之一 ,呈現(xiàn)了巨大的市場需求。與些同時,播放器功能復雜化和普及化對產(chǎn)品的交互界面提出了更高的要求。現(xiàn)在許多高端手機和PDA 產(chǎn)品上已經(jīng)有了多媒體播放器,可是和PC 機上的播放器相比現(xiàn)有的這些播放器的功能都有待進一步增強。 將現(xiàn)代窗口和圖形技術帶入到嵌入式設備的 MiniGUI,是一個非常適合于實時嵌入式設備的高效、可靠、可定制、小巧靈活的跨操作系統(tǒng)的圖形用戶界面支持系統(tǒng)。它采用類Win32的API接口,是一個多窗口GUI支持系統(tǒng)。本文首先比較各種嵌入式圖形系統(tǒng),然后提出基于MiniGUI的嵌入式媒體播放器的設計與實現(xiàn)方法。 2 各種嵌入式圖形系統(tǒng)之比較 目前,流行的面向嵌入式系統(tǒng)的圖形系統(tǒng)有MicoroWindows/NanoX、Qt/Embedded、MiniGUI、DirectFB、PicoGUI以及GTK /FB等。它們中的大多數(shù)遵循LGPL條款發(fā)布,而MicoroWindows/NanoX遵循的是MGPL,Qt/Embedded采用QGPL條款發(fā)布。 MicroWindows/NanoX能夠在沒有任何操作系統(tǒng)或其他圖形系統(tǒng)的支持下運行,它能對裸顯示設備進行直接操作。這樣,MicroWindows就顯得十分小巧,便于移植到各種硬件和軟件系統(tǒng)上。然而MicroWindows/NanoX的免費版本開發(fā)進展慢,而且缺乏全面專業(yè)的技術支持。 Qt/Embedded功能強大,但是,由于它是基于C 類庫的,所以和其他GUI相比系統(tǒng)消耗資源較大,一般應用于手持式高端信息產(chǎn)品。 GTK /FB與Qt/Embedded類似,跳過X層直接與FrameBuffer溝通,也具有Qt/Embedded的幾項優(yōu)點,但發(fā)展速度緩慢。 DirectFB是專注于Linux FrameBuffer加速的一個圖形庫,并試圖建立一個兼容GTK的嵌入式GUI系統(tǒng)。 PicoGUI是一種新型的小巧的嵌入式圖形系統(tǒng)。同X Windows系統(tǒng)一樣具有一個彈性的客戶服務端架構。PicoGUI將字體,位圖,窗口小部件,以及其他應用程序需要的東西都直接建立在服務器上,與X Windows相比,雖然靈活性有所降低,但速度顯著提升、體積大大縮小。 MiniGUI為實時嵌入式操作系統(tǒng)提供了非常完善的圖形及用戶界面支持。MiniGUI本身的可移植性設計,使得不論在哪個硬件平臺,哪種操作系統(tǒng)上運行,MiniGUI均能為上層應用程序提供一致的應用程序編程接口(API)。MiniGUI小巧、靈活且對中文的支持性最好。 3 設計與實現(xiàn) 3.1播放器總體結構 本文中的播放器采用MiniGUI作為底層圖形庫,用于生成用戶界面以及讀寫FrameBuffer。 播放器軟件總體結構如圖2所示,它主要由三部分組成,分別是圖形用戶界面模塊、系統(tǒng)管理主控模塊和音/視頻解碼器。三部分功能設計如下面所述: 圖形用戶界面模塊通過事件/消息機制和系統(tǒng)管理主控模塊交互。 音/視頻解碼器模塊可以看作是系統(tǒng)管理主控模塊的插件(plug-in),從系統(tǒng)管理主控模塊獲得編碼的音/視頻數(shù)據(jù)并對其解碼后發(fā)送己解碼的音/視頻數(shù)據(jù)給系統(tǒng)管理主控模塊。 系統(tǒng)管理主控模塊則負責網(wǎng)絡數(shù)據(jù)的接收和解析、圖形用戶界面模塊和音/視頻解碼器模塊的工作協(xié)調和音/視頻數(shù)據(jù)的輸出。這個模塊是播放器軟件中非常重要的一個模塊。 3.2 用戶圖形界面設計 MiniGUI提供了豐富的GUI元素,如常見的控件類、對話框與消息框以及菜單等,此外,MiniGUI支持界面皮膚。因此,利用MiniGUI可以非常方便地設計出漂亮的用戶圖形界面。 播放器的人機交互界面主要包括播放控制與文件列表管理兩大部分。播放控制用來實現(xiàn)對所選擇的媒體文件作播放/暫停、停止及進度控制等;文件列表管理則用來實現(xiàn)向播放列表添加、刪除媒體文件以及對列表中文件排序等功能。 3.3 主要函數(shù)及具體實現(xiàn) ⑴ 播放控制事件回調函數(shù) static int main_event_cb (HWND hwnd, skin_item_t* item, int event, void* data) { … if (event==SIE_BUTTON_CLICKED) { switch (item->id) { case SIID_PLAY: … case SIID_PAUSE: … case SIID_STOP: … case SIID_CLOSE: … } } else if (event==SIE_SLIDER_CHANGED && item->id!=SIID_VOLUME) { … } return 1; } ⑵ 列表事件處理函數(shù) void playlist_handle_event(PEvent *event, void *data) { … switch(event->type) { case ButtonPress: … case ButtonRelease: … case KeyPress: if(!playlist) return; mykeyevent = event->xkey; LockDisplay(gGui->display); len=LookupString(&mykeyevent, kbuf, sizeof(kbuf), &mykey, NULL); UnlockDisplay(gGui->display); switch (mykey) { case K_Down: case K_Next: browser_step_up(playlist->playlist, NULL); break; case K_Up: case K_Prior: browser_step_down(playlist->playlist, NULL); break; default: gui_handle_event(event, data); break; } break; case MappingNotify: LockDisplay(gGui->display); RefreshKeyboardMapping((MappingEvent *)event); UnlockDisplay(gGui->display); break; } } ⑶ 主函數(shù) int MiniGUIMain(int argc, const char* argv[]) { … PlayerHandle=PlayerNew(); … free(buffer); PlayerGetInfo(PlayerHandle, &fi); … InitCreateInfo(&CreateInfo); hMainWnd=CreateMainWindow(&CreateInfo); if (hMainWnd==HWND_INVALID) return -1; … while( GetMessage(&Msg, hMainWnd) ) { TranslateMessage(&Msg); DispatchMessage(&Msg); … } PlayerClose(PlayerHandle); … MainWindowThreadCleanup(hMainWnd); return 0; } 4 結束語 隨著嵌入式系統(tǒng)硬件性能的不斷提升,用戶對應用程序界面的友好性和功能的完備性提出了更高的要求。本文介紹的基于MiniGUI的嵌入式媒體播放器具有設計簡單,占用系統(tǒng)資源少等特點,可作為開發(fā)基于嵌入式圖形界面系統(tǒng)的應用軟件的參考。 |