• 沒有找到結果。

檢查目前播放狀態

第三章 VLC播放流程架構介紹

3.2 檢查目前播放狀態

playlist thread 主要作用是檢查目前播放的狀態,例如是否要開始播放影音資 料或者停止目前所播放的影音資料;而這支thread 的運作流程就是圖 3.4 虛框所 示的RunThread()函數。

main( )

PlayItem( ) while( !p_playlist->b_die )

if( p_playlist->p_input )

else if( p_playlist->status.i_status

== PLAYLIST_STOPPED )

else if( p_playlist->status.i_status

!= PLAYLIST_STOPPED )

cre ate playlist thre ad RunThe ad( )

stop playIte m and coutinue while

loop

create input thread Run( )

圖3.4:RunThread()函數流程圖

如上圖3.4 所示,在進入到 while 的判斷條件 p_playlist->b_die,這個變數是 表示是否要結束整個RunThread()函數,而一開始 p_playlist->b_die 的狀態是設定

為false,表 VLC 示要執行 RunThread()函數的程序,也就是檢查目前播放的狀態;

而當我們要結束掉整個VLC 程式,也就是按下 VLC GUI 介面右上方的關閉圖示

「X」時,p_playlist->b_die 的狀態就會被設定為 true,表示不再執行此 while 迴 圈並結束掉RunThread()函數的程序。

在進到這個 while 迴圈之後,可以看到有三圈的 if-else 判斷條件,主要是判 斷p_playlist->p_input 和 p_playlist->status.i_status 這兩個變數,來決定要執行什麼 樣的程序。一開始產生出 VLC GUI 介面時,並沒有影音資料需要播放,因此 p_playlist->p_input 的狀態是被設定為 false,p_playlist->status.i_status 的狀態是被 設定為「PLAYLIST_STOPPED」,所以第二圈的條件會先成立,並且會不斷的 執行第二圈程序。而在第二圈所要執行的程序,主要是停止目前的播放影音程 序,直到 p_playlist->p_input 或 p_playlist->status.i_status 這兩個變數狀態被改變

了,才會進到其他圈的程序,所以整個 VLC 開始運作時,會一直不斷的進行第

二圈程序。

而當在我們選擇開啟的資料來源(例如從檔案、網路、DVD/VCD 等等)並按下 OK 鈕 之 後 , p_playlist->status.i_status 的 狀 態 就 會 被 改 變 成

「PLAYLIST_RUNNING」(如下圖 3.6),使得上圖 3.4 紅框內條件成立,也就是 VLC 會進行到第三圈的程序,並且會呼叫 PlayItem()函數來開啟 input thread 來進 行整個播放影音的程序,並由input thread 開啟後面的其他 thread。而開啟完 input thread 後 , 會 回 傳 一 個 結 構 變 數 指 標 給 p_playlist->p_input , 也 就 是 p_playlist->p_input 狀態被設為 true,表示已經成功的開啟 input thread 並開始進行 播放影音程序。因此回到RunThread()函數內的 while 迴圈裡,就變成不斷的進行 到第一圈的程序,而第一圈的程序主要是檢查某些變數狀態設定是否被改變。因 此VLC 正在播放影音資料時,在 RunThread()函數內的 while 迴圈內就是會一直 進到第一圈程序的狀態。

而當VLC 在播放影音資料時,在前面 3.1 節有提到過,會有其他的 thread 已 經被開啟並執行播放影音的程序,所以假設在播放影音資料我們按下停止鍵,

p_playlist->p_input 變數會被改變成 false,p_playlist->status.i_status 變數會被改變 成「PLAYLIST_STOPPED」,代表要停止目前的播放影音程序。因此原本一直 進到第一圈的程序的狀態,會變成進到第二圈的程序,並且停止目前的播放影音 程序,所以有關跟播放影音程序時所開啟的thread 也都會結束掉,也就是前面圖 3.3 所開啟的五支 thread 都會結束。因此整個狀態 thread 架構又是回復到前面圖 3.2 所表示的一開始的五支 thread 在執行。而此時在 RunThread()函數內的 while 迴圈內會變成一直進到第二圈程序的狀態,直到有影音資料需要播放,然後再進 到第三圈程序開啟input thread 並且 p_playlist->p_input 狀態被設為 true,之後又 會不斷的一直進到第一圈程序來檢查某些變數狀態設定是否被改變。

所以整個VLC 播放影音程序的一個控制核心就是在 RunThread()函數內的 while 迴圈,在迴圈內主要是判斷 p_playlist->p_input 和 p_playlist->status.i_status 這兩個變數,來決定要執行哪一圈的程序;一開始產生出VLC GUI 介面時,會 一直進到第二圈的程序,表示目前的播放狀態是停止的;等到按下播放鍵要播放 影音資料之後,會先進到第三圈的程序,開啟input thread 並且 p_playlist->p_input 狀態會被設為true;最後會進到第一圈的程序檢查一些變數的狀態;直到按下停 止鍵時,才又會進入到第二圈的程序。

MRL(media resource locator)

圖3.5:選擇開啟檔案資料來源

當按下圖3.5 的 ok 鈕後,p_playlist->status.i_status 的狀態被設置 PLAYLIST_RUNNING。

圖3.6:改變 p_playlist->status.i_status

相關文件