關鍵數據結構之 解碼器對象mad_decoder

mad_decoder可以看作是整個解碼器的“核心”結構。它用c語言有限的對象機制實現了面嚮對象語言的部分功能。decoder封裝了一次解碼過程中的所有必要成分,包括用戶定義的消息、6個回調函數和相應的選項。mad_decoder結構在decoder.h頭文件中定義:

其中mode成員有MAD_DECODER_MODE_SYNCMAD_DECODER_MODE_ASYNC兩個取值,分別指定同步和異步兩種工作方式;options被帶入到sync成員的stream中的optionsasync成員攜帶異步解碼時必須的狀態消息;async成員不論同步還是異步方式都要由input回調函數填充並經歷整個解碼過程;cb_data是用戶定義的消息結構,在解碼過程開始時在各處理過程(如輸入、過濾、輸出、錯誤處理等)中傳遞狀態;下面的6個回調函數可根據需要選擇填充,比如最基本的解碼至少要包含inputoutput,其他的回調函數都是可選的。

通常使用mad_decoder_inti()函數對一個mad_decoder變量進行初始化,正如本文開頭和minimad.c裏做的那樣(這個文件可以在壓縮包裏找到)。之後這個mad_decoder變量就可以使用mad_decoder_run()函數進行解碼了。解碼過程中output回調函數不斷地被調用(每解碼完成一個mp3幀),直到所有的有效幀全部被解碼或遇到一個不可忽略的錯誤,mad_decoder_run()函數才返回。

最後使用mad_decoder_finish()函數做最後的清理工作。

mad_decoder的封裝不是嚴格意義上的封裝。其中的成員完全保持了對外的可見性,只是在處理過程中將一個解碼過程看作一個整體,其中的各成分存在於mad_decoder對象中。並非嚴格的面向對象意義上的“is a…”和“has a…”。

最後我們又回到了原點——6個回調函數。下面的章節我們會集中討論他們。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章